Moin.
Über Wer-wills-Haben hab ich von Miraculix schöne LED Dotmatrix-Module (inkl. Aalbeilage) bekommen
Inzwischen ist die Schaltung nachvollzogen und habs nun hinbekommen, das mit einem Arduino Uno anzusteuern.
Versorgt wird das mit 9...12V. Auf dem Board ist ein 7805 mit Kühlkörper. Von den 5V wird alles versorgt.
Jede einzelne 5x7 Matrix wird von einem Boutique-Chip MAX7219 angesteuert. Clock- und DataIn sind bei allen parallel geschaltet, auf dem Board ist kein klassisches daisy chaining realisiert. DataOut sind jeweils NC.
Auf der Karte sind 4 Jumper, die die Adresse der Karte einstellen. Ein 4-Bit-Komparator vergleicht die angelegte Adresse vom Stecker mit der Jumper-Einstellung und gibt nur bei Übereinstimmung die Load-Pins frei.
Das LOAD-Signal wird über einen 3-zu-8-Decoder zu den einzelnen MAXens verteilt. Das eigentliche LOAD-Signal hängt am Enable G2 des Decoders.
Zum Ansteuern habe ich einen Arduino Uno verwendet, der eine Lochraster-Huckepackplatine bekommen hat mit Angstwiderständen und dem Stecker fürs Flachbandkabel. Da auf allen 10 Pins Signale liegen, musste der GND separat verbunden werden.
Die Boards bieten die Möglichkeit, mehrere zusammenzuschalten, wahlweise über Stift-/Buchsenleisten seitlich, oder die 10poligen Flachbandkabel und Versorgung.
Code: Alles auswählen
// Pinzuordnungen
const int PIN_KARTENWAHL1 = 2;
const int PIN_KARTENWAHL2 = 11;
const int PIN_KARTENWAHL4 = 3;
const int PIN_KARTENWAHL8 = 10;
const int PIN_FELDWAHL1 = 4;
const int PIN_FELDWAHL2 = 9;
const int PIN_FELDWAHL4 = 5;
const int PIN_DATA = 6;
const int PIN_CLOCK = 8; //ok
const int PIN_LOAD = 7;
char anzeige[6];
uint8_t cursorPos=0;
// Einstellungen zu Beginn: Pins auf Output setzen. Karte Nr. 0 wählen
void setup() {
//LED auf dem Board ausschalten
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
pinMode(PIN_DATA,OUTPUT);
pinMode(PIN_CLOCK,OUTPUT);
pinMode(PIN_LOAD,OUTPUT);
digitalWrite(PIN_DATA,LOW);
digitalWrite(PIN_CLOCK,LOW);
digitalWrite(PIN_LOAD,HIGH);
pinMode(PIN_KARTENWAHL1,OUTPUT);
pinMode(PIN_KARTENWAHL2,OUTPUT);
pinMode(PIN_KARTENWAHL4,OUTPUT);
pinMode(PIN_KARTENWAHL8,OUTPUT);
pinMode(PIN_FELDWAHL1,OUTPUT);
pinMode(PIN_FELDWAHL2,OUTPUT);
pinMode(PIN_FELDWAHL4,OUTPUT);
WaehleKarte(0);
Initialisieren();
WaehleHelligkeit(10);
anzeige[0]='H';
anzeige[1]='A';
anzeige[2]='L';
anzeige[3]='L';
anzeige[4]='O';
SchreibeAnzeigeArray();
Serial.begin(9600);
Serial.flush();
}
void loop() {
if(Serial.available()>0){
if(5==cursorPos){
//Inhalt schieben
anzeige[0]=anzeige[1];
anzeige[1]=anzeige[2];
anzeige[2]=anzeige[3];
anzeige[3]=anzeige[4];
cursorPos=4;
}
anzeige[cursorPos]=Serial.read();
cursorPos++;
SchreibeAnzeigeArray();
}
// put your main code here, to run repeatedly:
/*
SendeText("12345");
delay(3000);
SendeText("67890");
delay(3000);
SendeText("ABCDE");
delay(3000);
SendeText("FGHIJ");
delay(3000);
SendeText("!?.,:");
delay(3000);
*/
}
void SchreibeAnzeigeArray(){
for(uint8_t i=0;i<=4;i++){
WaehleFeld(i);
SendeZeichen(anzeige[i]);
}
}
void WaehleKarte(uint8_t nr){
//0 bis 15 ist möglich; je nachdem welche Jumper auf der Karte gesetzt sind
if(nr>15)return;
digitalWrite(PIN_KARTENWAHL8, nr&0x08);
digitalWrite(PIN_KARTENWAHL4, nr&0x04);
digitalWrite(PIN_KARTENWAHL2, nr&0x02);
digitalWrite(PIN_KARTENWAHL1, nr&0x01);
}
void WaehleFeld(uint8_t nr){
//0 bis 4 sind möglich, von links nach rechts
if(nr>4)return;
digitalWrite(PIN_FELDWAHL4, !(nr&0x04));
digitalWrite(PIN_FELDWAHL2, !(nr&0x02));
digitalWrite(PIN_FELDWAHL1, !(nr&0x01));
}
void SendeDatenAnMax7219(uint8_t msb,uint8_t lsb){
//LOAD auf low
digitalWrite(PIN_LOAD,LOW);
delayMicroseconds(10);
//16 Bit rausschieben
shiftOut(PIN_DATA,PIN_CLOCK,MSBFIRST,msb);
shiftOut(PIN_DATA,PIN_CLOCK,MSBFIRST,lsb);
delayMicroseconds(10);
//LOAD auf high
digitalWrite(PIN_LOAD,HIGH);
delayMicroseconds(10);
}
void Initialisieren(){
for(uint8_t i=0;i<=4;i++){
WaehleFeld(i);
SendeDatenAnMax7219(0x0C,0x01); //Zuerst aus Shutdown holen
SendeDatenAnMax7219(0x09,0x00); //Keinen Code B nutzen
SendeDatenAnMax7219(0x0B,0x07); //Scanlimit: Anzahl Pixelzeilen
SetzeFeld(0,0,0,0,0,0,0);
WaehleFeldHelligkeit(7);
SendeDatenAnMax7219(0x0F,0x00); //Lampentest aus
}
}
void WaehleFeldHelligkeit(uint8_t helligkeit){
//Helligkeit 0...15
if(helligkeit>15){helligkeit=15;}
SendeDatenAnMax7219(0x0A,helligkeit);
}
void WaehleHelligkeit(uint8_t helligkeit){
for(uint8_t i=0;i<=4;i++){
WaehleFeld(i);
WaehleFeldHelligkeit(helligkeit);
}
}
void SetzeFeld(uint8_t zeile1,uint8_t zeile2,uint8_t zeile3,uint8_t zeile4,uint8_t zeile5,uint8_t zeile6, uint8_t zeile7){
//Bit 0 rechts, Bit 4 links
SendeDatenAnMax7219(0x01,zeile1);
SendeDatenAnMax7219(0x02,zeile2);
SendeDatenAnMax7219(0x03,zeile3);
SendeDatenAnMax7219(0x04,zeile4);
SendeDatenAnMax7219(0x05,zeile5);
SendeDatenAnMax7219(0x06,zeile6);
SendeDatenAnMax7219(0x07,zeile7);
}
void SendeZeichen(char zeichen){
switch(zeichen){
//Leerzeichen
case ' ':
SetzeFeld(
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000);
break;
//Ziffern
case '0':
SetzeFeld(
0b00001110,
0b00010001,
0b00010011,
0b00010101,
0b00011001,
0b00010001,
0b00001110);
break;
case '1':
SetzeFeld(
0b00000100,
0b00001100,
0b00010100,
0b00000100,
0b00000100,
0b00000100,
0b00000100);
break;
case '2':
SetzeFeld(
0b00001110,
0b00010001,
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00011111);
break;
case '3':
SetzeFeld(
0b00001110,
0b00000001,
0b00000001,
0b00000110,
0b00000001,
0b00000001,
0b00001110);
break;
case '4':
SetzeFeld(
0b00000010,
0b00000110,
0b00001010,
0b00010010,
0b00011111,
0b00000010,
0b00000010);
break;
case '5':
SetzeFeld(
0b00011111,
0b00010000,
0b00011110,
0b00000001,
0b00000001,
0b00000001,
0b00011110);
break;
case '6':
SetzeFeld(
0b00000100,
0b00001000,
0b00010000,
0b00011110,
0b00010001,
0b00010001,
0b00001110);
break;
case '7':
SetzeFeld(
0b00011111,
0b00000001,
0b00000001,
0b00000010,
0b00000010,
0b00000100,
0b00000100);
break;
case '8':
SetzeFeld(
0b00001110,
0b00010001,
0b00010001,
0b00001110,
0b00010001,
0b00010001,
0b00001110);
break;
case '9':
SetzeFeld(
0b00001110,
0b00010001,
0b00010001,
0b00001111,
0b00000001,
0b00000010,
0b00000100);
break;
//Großbuchstaben
case 'A':
SetzeFeld(
0b00000100,
0b00001010,
0b00010001,
0b00011111,
0b00010001,
0b00010001,
0b00010001);
break;
case 'B':
SetzeFeld(
0b00011110,
0b00010001,
0b00010001,
0b00011110,
0b00010001,
0b00010001,
0b00011110);
break;
case 'C':
SetzeFeld(
0b00000111,
0b00001000,
0b00010000,
0b00010000,
0b00010000,
0b00001000,
0b00000111);
break;
case 'D':
SetzeFeld(
0b00011100,
0b00010010,
0b00010001,
0b00010001,
0b00010001,
0b00010010,
0b00011100);
break;
case 'E':
SetzeFeld(
0b00011111,
0b00010000,
0b00010000,
0b00011110,
0b00010000,
0b00010000,
0b00011111);
break;
case 'F':
SetzeFeld(
0b00011111,
0b00010000,
0b00010000,
0b00011100,
0b00010000,
0b00010000,
0b00010000);
break;
case 'G':
SetzeFeld(
0b00000110,
0b00001000,
0b00010000,
0b00010111,
0b00010001,
0b00010011,
0b00001101);
break;
case 'H':
SetzeFeld(
0b00010001,
0b00010001,
0b00010001,
0b00011111,
0b00010001,
0b00010001,
0b00010001);
break;
case 'I':
SetzeFeld(
0b00011111,
0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b00011111);
break;
case 'J':
SetzeFeld(
0b00011111,
0b00000001,
0b00000001,
0b00000001,
0b00000001,
0b00010010,
0b00001100);
break;
case 'K':
SetzeFeld(
0b00010001,
0b00010010,
0b00010100,
0b00011000,
0b00010100,
0b00010010,
0b00010001);
break;
case 'L':
SetzeFeld(
0b00010000,
0b00010000,
0b00010000,
0b00010000,
0b00010000,
0b00010000,
0b00011111);
break;
case 'M':
SetzeFeld(
0b00010001,
0b00011011,
0b00010101,
0b00010001,
0b00010001,
0b00010001,
0b00010001);
break;
case 'N':
SetzeFeld(
0b00010001,
0b00010001,
0b00011001,
0b00010101,
0b00010011,
0b00010001,
0b00010001);
break;
case 'O':
SetzeFeld(
0b00001110,
0b00010001,
0b00010001,
0b00010001,
0b00010001,
0b00010001,
0b00001110);
break;
case 'P':
SetzeFeld(
0b00011110,
0b00010001,
0b00010001,
0b00011110,
0b00010000,
0b00010000,
0b00010000);
break;
case 'Q':
SetzeFeld(
0b00001110,
0b00010001,
0b00010001,
0b00010001,
0b00010101,
0b00010011,
0b00001111);
break;
case 'R':
SetzeFeld(
0b00011110,
0b00010001,
0b00010001,
0b00011110,
0b00010100,
0b00010010,
0b00010001);
break;
case 'S':
SetzeFeld(
0b00001110,
0b00010000,
0b00010000,
0b00001110,
0b00000001,
0b00000001,
0b00001110);
break;
case 'T':
SetzeFeld(
0b00011111,
0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b00000100);
break;
case 'U':
SetzeFeld(
0b00010001,
0b00010001,
0b00010001,
0b00010001,
0b00010001,
0b00010001,
0b00001110);
break;
case 'V':
SetzeFeld(
0b00010001,
0b00010001,
0b00010001,
0b00010001,
0b00001010,
0b00001010,
0b00000100);
break;
case 'W':
SetzeFeld(
0b00010001,
0b00010001,
0b00010001,
0b00010101,
0b00010101,
0b00010101,
0b00001010);
break;
case 'X':
SetzeFeld(
0b00010001,
0b00010001,
0b00001010,
0b00000100,
0b00001010,
0b00010001,
0b00010001);
break;
case 'Y':
SetzeFeld(
0b00010001,
0b00010001,
0b00001010,
0b00000100,
0b00000100,
0b00000100,
0b00000100);
break;
case 'Z':
SetzeFeld(
0b00011111,
0b00000001,
0b00000010,
0b00011111,
0b00001000,
0b00010000,
0b00011111);
break;
//Sonderzeichen
case ':':
SetzeFeld(
0b00000000,
0b00000000,
0b00000100,
0b00000000,
0b00000100,
0b00000000,
0b00000000);
break;
case '.':
SetzeFeld(
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000100);
break;
case ',':
SetzeFeld(
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000010,
0b00000100);
break;
case '!':
SetzeFeld(
0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b00000000,
0b00000100);
break;
case '?':
SetzeFeld(
0b00001110,
0b00010001,
0b00000001,
0b00000010,
0b00000100,
0b00000000,
0b00000100);
break;
case ';':
SetzeFeld(
0b00000000,
0b00000000,
0b00000000,
0b00000010,
0b00000000,
0b00000010,
0b00000100);
break;
case '-':
SetzeFeld(
0b00000000,
0b00000000,
0b00000000,
0b00001110,
0b00000000,
0b00000000,
0b00000000);
break;
case '_':
SetzeFeld(
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00011111);
break;
case '\'':
SetzeFeld(
0b00000100,
0b00000100,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000);
break;
case '"':
SetzeFeld(
0b00001010,
0b00001010,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000);
break;
case '/':
SetzeFeld(
0b00000001,
0b00000001,
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00010000);
break;
case '%':
SetzeFeld(
0b00011001,
0b00011001,
0b00000010,
0b00000100,
0b00001000,
0b00010011,
0b00010011);
break;
case '*':
SetzeFeld(
0b00000000,
0b00001010,
0b00000100,
0b00011111,
0b00000100,
0b00001010,
0b00000000);
break;
case '&':
SetzeFeld(
0b00001100,
0b00010010,
0b00010010,
0b00001100,
0b00010101,
0b00010010,
0b00001101);
break;
case '(':
SetzeFeld(
0b00000100,
0b00001000,
0b00010000,
0b00010000,
0b00010000,
0b00001000,
0b00000100);
break;
case ')':
SetzeFeld(
0b00000100,
0b00000010,
0b00000001,
0b00000001,
0b00000001,
0b00000010,
0b00000100);
break;
case '=':
SetzeFeld(
0b00000000,
0b00000000,
0b00001110,
0b00000000,
0b00001110,
0b00000000,
0b00000000);
break;
case '€':
SetzeFeld(
0b00000111,
0b00001000,
0b00011100,
0b00001000,
0b00011100,
0b00001000,
0b00000111);
break;
case '+':
SetzeFeld(
0b00000000,
0b00000000,
0b00000100,
0b00001110,
0b00000100,
0b00000000,
0b00000000);
break;
case '<':
SetzeFeld(
0b00000000,
0b00000010,
0b00000100,
0b00001000,
0b00000100,
0b00000010,
0b00000000);
break;
case '>':
SetzeFeld(
0b00000000,
0b00001000,
0b00000100,
0b00000010,
0b00000100,
0b00001000,
0b00000000);
break;
case '^':
SetzeFeld(
0b00000100,
0b00001010,
0b00010001,
0b00000000,
0b00000000,
0b00000000,
0b00000000);
break;
case '°':
SetzeFeld(
0b00001110,
0b00001010,
0b00001110,
0b00000000,
0b00000000,
0b00000000,
0b00000000);
break;
case '#':
SetzeFeld(
0b00000000,
0b00001010,
0b00011111,
0b00001010,
0b00011111,
0b00001010,
0b00000000);
break;
/*
// Kopiervorlage
case ' ':
SetzeFeld(
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000);
break;
*/
default:
SetzeFeld(
0b00000000,
0b00001010,
0b00000000,
0b00000100,
0b00000000,
0b00010001,
0b00001110);
break;
break;
}
}
void SendeText(char text[4]){
WaehleFeld(0);
SendeZeichen(text[0]);
WaehleFeld(1);
SendeZeichen(text[1]);
WaehleFeld(2);
SendeZeichen(text[2]);
WaehleFeld(3);
SendeZeichen(text[3]);
WaehleFeld(4);
SendeZeichen(text[4]);
}