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.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
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
}