Ik heb hier een Monochroom Led matrix punt display van een vanMoof fiets S3. Wordt aangestuurd door 2x IS31FL3742 d.m.v. I2C bus. 1x 5 vertikale lijnen van max 20 leds en 1 x 4 vertikale lijnen van max 20 leds.
Zijn dus 9 rijen naast elkaar waarop ik dan een tekst of simpel plaatje kan weergeven.
Via https://forum.arduino.cc/t/is31fl3742-30x6-led-driver-i2c-comunication… kan ik
elke LED apart aansturen , echter onbetrouwbaar en traag.
Inmiddels een Adafruit driver gevonden die veel beter werkt, echter volledig voor RGB leds ontworpen.
https://github.com/adafruit/Adafruit_IS31FL3741/tree/main. Deze is voor IS31FL3741 maar werkt ook op IS31FL3742.
Weet iemand hoe het mogelijk is om die driver voor monochroom Led matrix te gaan gebruiken ?

Mag natuurlijk ook een andere driver zijn die de IS31FL3741 / IS31FL3742 kan aansturen , maar wel monochroom.

Het is open source, dus aanpassen voor de chip die minder kan moet niet zo moeilijk zijn.

Dat dacht ik ook , heb ik ook bekeken, maar is toch wel complex voor mij , vandaar ook de vraag hier op CO

De Adafruit doet aansturen in kleur dmv RGB. Elke kleur doet een eigen kolom leds aansturen. In jouw geval heb je een enkele kleur leds gekoppeld. Dus met een 'rgb pixel' kun je drie leds tegelijk aansturen. Rood voor de eerste led, groen voor de tweede en blauw voor de derde.

Maar ik zou zelf eerder een eigen libje maken. Zo moeilijk is dat niet. Zie hier de datasheet van de controller chip: https://www.lumissil.com/assets/pdf/core/IS31FL3741A_DS.pdf

De Adafruit heeft een drawPixel() funktie die feitelijk 3 leds aanstuurt:


void Adafruit_IS31FL3741_EVB::drawPixel(int16_t x, int16_t y, uint16_t color) {
  if ((x >= 0) && (y >= 0) && (x < width()) && (y < height())) {
    _IS31_ROTATE_(x, y);           // Handle GFX-style soft rotation
    _IS31_EXPAND_(color, r, g, b); // Expand GFX's RGB565 color to RGB888

    // Map x/y to device-specific pixel layout
    uint16_t offset = ((y > 2) ? (x * 10 + 12 - y) : (92 + x * 3 - y)) * 3;

    /*
    Serial.print("("); Serial.print(x);
    Serial.print(", "); Serial.print(y);
    Serial.print(") -> "); Serial.println(offset);
    */

    setLEDPWM(offset + rOffset, r);
    setLEDPWM(offset + gOffset, g);
    setLEDPWM(offset + bOffset, b);
  }
}

Die kun je aanpassen zodat er maar een enkele led wordt aangestuurd. color bepaalt dan de helderheid (range 0 .. 255)

Dat wordt dan iets als :


void Adafruit_IS31FL3741_EVB::drawPixel(int16_t x, int16_t y, uint16_t color) {
  if ((x >= 0) && (y >= 0) && (x < width()) && (y < height())) {
    _IS31_ROTATE_(x, y);           // Handle GFX-style soft rotation

    // Map x/y to device-specific pixel layout
    uint16_t offset = ((y > 2) ? (x * 10 + 12 - y) : (92 + x * 3 - y));

    /*
    Serial.print("("); Serial.print(x);
    Serial.print(", "); Serial.print(y);
    Serial.print(") -> "); Serial.println(offset);
    */

    setLEDPWM(offset, color);
}
  • Color mapping verwijderen.
  • Offset berekening aanpassen (niet meer vermenigvuldigen met 3)
  • Aansturen van Leds aanpassen. 1 led ipv 3.

PS: Niet getest bij gebrek aan hardware.

Met onderstaande code is elke pixel wel apart te sturen, maar of dat de goede oplossing is .


#include <Wire.h>

void setup()
{
  SerialUSB.begin(115200);
  while(!SerialUSB);
  Wire1.begin(); // join i2c bus (address optional for master)
  Wire1.setClock(400000);
  pinMode(28, OUTPUT);      //Theis is the hardware Shutdown pin (go high to enable the chip
  pinMode(30, OUTPUT);      //Theis is the hardware Shutdown pin (go high to enable the chip
  digitalWrite(28, HIGH);   // turn the Chip on
  digitalWrite(30, HIGH);   // turn the Chip on
  
  SerialUSB.print("Start  ");         // print the character
  
  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0xFE));            // Unlock Command Register
  Wire1.write(byte(B11000101));       // Unlock
  Wire1.endTransmission();        // stop transmitting

  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0xFD));            // Eneter Command Register
  Wire1.write(byte(0x04));            // Eneter Function Register, Now Configure
  Wire1.endTransmission();     // stop transmitting
  
  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0x00));            // Eneter Command Register
  Wire1.write(byte(B01000001));            // Send Configuation Register
  Wire1.write(byte(B11111111));            // Send Configuation Global Current MAX
  Wire1.write(byte(B01110111));            // Send Configuation Pull UP/Down Resistors 32K
  Wire1.endTransmission();     // stop transmitting

    
  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0xFE));            // Unlock Command Register
  Wire1.write(byte(B11000101));       // Unlock
  Wire1.endTransmission();     // stop transmitting
  
  Wire1.beginTransmission(0x30);     // device address is specified in datasheet
  Wire1.write(byte(0xFD));            // Eneter Command Register
  Wire1.write(byte(0x02));            // Eneter LED Scaling
  Wire1.endTransmission();     // stop transmitting
  
  Wire1.beginTransmission(0x30);     // device address is specified in datasheet
  Wire1.write(byte(0x00));            // Eneter LED1
  Wire1.write(byte(B11111111));       // Send Configuation
  Wire1.endTransmission();     // stop transmitting

    
  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0xFE));            // Unlock Command Register
  Wire1.write(byte(B11000101));       // Unlock
  Wire1.endTransmission();     // stop transmitting
  
  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0xFD));            // Eneter Command Register
  Wire1.write(byte(0x00));            // Eneter LED PWM
  Wire1.endTransmission();     // stop transmitting
  
  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0x00));            // Eneter LED1
  Wire1.write(byte(B11111111));       // Send Configuation
  Wire1.endTransmission();     // stop transmitting
}


void loop()
{

}

Op vrijdag 3 oktober 2025 12:00:33 schreef deKees:
De Adafruit heeft een drawPixel() funktie die feitelijk 3 leds aanstuurt:


void Adafruit_IS31FL3741_EVB::drawPixel(int16_t x, int16_t y, uint16_t color) {
  if ((x >= 0) && (y >= 0) && (x < width()) && (y < height())) {
    _IS31_ROTATE_(x, y);           // Handle GFX-style soft rotation
    _IS31_EXPAND_(color, r, g, b); // Expand GFX's RGB565 color to RGB888

    // Map x/y to device-specific pixel layout
    uint16_t offset = ((y > 2) ? (x * 10 + 12 - y) : (92 + x * 3 - y)) * 3;

    /*
    Serial.print("("); Serial.print(x);
    Serial.print(", "); Serial.print(y);
    Serial.print(") -> "); Serial.println(offset);
    */

    setLEDPWM(offset + rOffset, r);
    setLEDPWM(offset + gOffset, g);
    setLEDPWM(offset + bOffset, b);
  }
}

Die kun je aanpassen zodat er maar een enkele led wordt aangestuurd. color bepaalt dan de helderheid (range 0 .. 255)

Dat wordt dan iets als :


void Adafruit_IS31FL3741_EVB::drawPixel(int16_t x, int16_t y, uint16_t color) {
  if ((x >= 0) && (y >= 0) && (x < width()) && (y < height())) {
    _IS31_ROTATE_(x, y);           // Handle GFX-style soft rotation

    // Map x/y to device-specific pixel layout
    uint16_t offset = ((y > 2) ? (x * 10 + 12 - y) : (92 + x * 3 - y));

    /*
    Serial.print("("); Serial.print(x);
    Serial.print(", "); Serial.print(y);
    Serial.print(") -> "); Serial.println(offset);
    */

    setLEDPWM(offset, color);
}
  • Color mapping verwijderen.
  • Offset berekening aanpassen (niet meer vermenigvuldigen met 3)
  • Aansturen van Leds aanpassen. 1 led ipv 3.

PS: Niet getest bij gebrek aan hardware.

Thanks
Ik ga het proberen.

En jouw stukje code is een goed begin.

Om een led aan te sturen moet je eerst een pagina kiezen:


 Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0xFE));            // Unlock Command Register
  Wire1.write(byte(B11000101));       // Unlock
  Wire1.endTransmission();     // stop transmitting
  
  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0xFD));            // Enter Command Register
  Wire1.write(byte(0x00));            // LED page 0 .. 3
  Wire1.endTransmission();     // stop transmitting

En vervolgens kun je binnen die pagina aparte leds aansturen:


  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(0x00));            // LED nr 0 .. 170 of 0 .. 179
  Wire1.write(byte(B11111111));       // LED helderheid 0..255
  Wire1.endTransmission();            // stop transmitting

Waarschijnlijk kun je ook meerdere opeenvolgende leds aansturen in een enkel bericht:


  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
  Wire1.write(byte(10));              // Vanaf led nr 10
  Wire1.write(byte(B11111111));       // Helderheid voor led nr 10
  Wire1.write(byte(B11111111));       // Helderheid voor led nr 11
  Wire1.write(byte(B11111111));       // Helderheid voor led nr 12 
  enz
  Wire1.endTransmission();            // stop transmitting

En daar kun je ook een functie voor maken:


void SetLed(byte PageNr, byte LedNr, byte Value)
{  Wire1.beginTransmission(0x30);      // device address is specified in datasheet
   Wire1.write(byte(0xFE));            // Unlock Command Register
   Wire1.write(byte(B11000101));       // Unlock
   Wire1.endTransmission();     // stop transmitting
  
   Wire1.beginTransmission(0x30);      // device address is specified in datasheet
   Wire1.write(byte(0xFD));            // Enter Command Register
   Wire1.write(PageNr);                // LED page 0 .. 3
   Wire1.endTransmission();            // stop transmitting

   Wire1.beginTransmission(0x30);      // device address is specified in datasheet
   Wire1.write(LedNr);                 // LED nr 0 .. 170 of 0 .. 179
   Wire1.write(Value);                 // LED helderheid 0..255
   Wire1.endTransmission();            // stop transmitting
}