From: Dobrica Pavlinusic Date: Tue, 15 Dec 2015 19:24:23 +0000 (+0100) Subject: http://blog.vettore.org/building-a-large-led-sign-with-inexpensive-standard-modules... X-Git-Url: http://git.rot13.org/?a=commitdiff_plain;h=a1fc515b3c6ee0eb47f87c9bd23de3293e3ef60a;p=Arduino blog.vettore.org/building-a-large-led-sign-with-inexpensive-standard-modules-and-arduino/ --- diff --git a/HUB12_cascaded/HUB12_cascaded.ino b/HUB12_cascaded/HUB12_cascaded.ino new file mode 100644 index 0000000..3c328bc --- /dev/null +++ b/HUB12_cascaded/HUB12_cascaded.ino @@ -0,0 +1,168 @@ + +/************************************************************** +* +* Sample sketch for driving 24x16 LED PANEL (1/4 scan) with +* HUB12 protocol +* Support for multiple cascaded panels +* Get text TO DISPLAY from the serial monitor +* +*************************************************************/ +  +#include +#include +#include "font.h" +Timer t; +Timer t1; +  +//Pins specific for Mega.See Arduino SPI for a different board. +#define A 2 +#define B 3 +#define OE 4 +#define R1 51 +#define CLK 52 +#define STB 53 +  +//number of cascaded panels +#define N_PANELS 4 +  +//row to be shown (1-4 since it is 1/4 scan) +byte row=0; +  +//brightness: increase->more bright +int br=400; +  +int incomingByte = 0; +  +//buffer 8 characters for N_PANELS +  +  +  +byte stringDisp[8*N_PANELS]={ + 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','y','0','1','2','3','4','5','6','7', +}; +  +  +  +//pixBuffer reserved space for N_PANELS +//contains status of every single pixel in our display! +byte pixBuffer[8*8*N_PANELS]={ +}; +  +  +  +void setup () { + Serial.begin(9600); + pinMode(A, OUTPUT); + pinMode(B, OUTPUT); + pinMode(OE, OUTPUT); + pinMode(R1, OUTPUT); + pinMode(CLK, OUTPUT); + pinMode(STB, OUTPUT); +  + SPI.begin(); +  + //set timers + //first timer is the refresh rate for the 1/4 scan + t.every(6,display); + //second timer is for change display text IF INPUT AVAILABLE + t1.every(1000,checkInput); +  + delay(300); +} +  +  +void loop(){ +  + t.update(); + t1.update(); +  +} +  +  +//diplay alternatively the 4 scan lines +void display(){ + showRow(0); + showRow(1); + showRow(2); + showRow(3); +} +  +  +  +//Load and show row (1-4) i.e. 1-5-9-13, 2-6-10-14..... +void showRow(int row){ +  + int col=0;//is a column of 2 chars +  + for(col=0;col<4*N_PANELS;col++){//show 2 characters every cicle + SPI.transfer(~(pixBuffer[row+(col*8)+4+(32*N_PANELS)])); + SPI.transfer(~(pixBuffer[row+(col*8)+(32*N_PANELS)])); + SPI.transfer(~(pixBuffer[row+(col*8)+4])); + SPI.transfer(~(pixBuffer[row+(col*8)])); + } +  + digitalWrite(STB,LOW); + digitalWrite(STB,HIGH); +  + scanrow(row);//enable encoder for the line loaded +  + //PWM like. Change br to adjust brightnes + digitalWrite(OE,HIGH); + delayMicroseconds(br);//PWM per aggiustare luminosità + digitalWrite(OE,LOW); + delayMicroseconds(900); +} +  +//enable encoder for this row in order to show it +void scanrow(int r){ + if(r==0){ + digitalWrite(A,0); + digitalWrite(B,0); + } + else if(r==1){ + digitalWrite(A,1); + digitalWrite(B,0); + } + else if(r==2){ + digitalWrite(A,0); + digitalWrite(B,1); + } + else if(r==3){ + digitalWrite(A,1); + digitalWrite(B,1); + } +} +  +//check if input from the serial monitor is available +//and update the display +void checkInput(void){ + int x=0; + int y=0; + if(Serial.available()){ + int h; + //clean display + for(h=0;h<(8*N_PANELS);h++)stringDisp[h]=32; + } + while (Serial.available() > 0) { + // read the incoming byte: + incomingByte = Serial.read();//only UP to the efective string length + if(x<(8*N_PANELS)) stringDisp[x]=incomingByte; + x++; + } + loadBuffer(); +} +  +  +  +//load buffer with character pixels of the string +//performing a lookup on the FONT table +void loadBuffer(void){ + int x; + int y; + for(y=0;y<(8*(N_PANELS));y++){ + for(x=0;x<8;x++){ + pixBuffer[x+8*y]=font[8*stringDisp[y]+x-(31*8)];//char under <=31 not defined + } + } +} + diff --git a/HUB12_cascaded/font.h b/HUB12_cascaded/font.h new file mode 100644 index 0000000..f38f9de --- /dev/null +++ b/HUB12_cascaded/font.h @@ -0,0 +1,1180 @@ + +/********************************************** +* +* USED FONTS DEFINITIONS +* +**********************************************/ +  +byte font[]={ +//SPACE +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // ! +  + //SPACE +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // ! +0x04, +0x04, +0x04, +0x04, +0x00, +0x00, +0x04, +0x00, + // " +0x0A, +0x0A, +0x0A, +0x00, +0x00, +0x00, +0x00, +0x00, + // # +0x0A, +0x0A, +0x1F, +0x0A, +0x1F, +0x0A, +0x0A, +0x00, + // $ +0x04, +0x0F, +0x14, +0x0E, +0x05, +0x1E, +0x04, +0x00, + // % +0x18, +0x19, +0x02, +0x04, +0x08, +0x13, +0x03, +0x00, + // & +0x0C, +0x12, +0x14, +0x08, +0x15, +0x12, +0x0D, +0x00, + // ' +0x0C, +0x04, +0x08, +0x00, +0x00, +0x00, +0x00, +0x00, + // ( +0x02, +0x04, +0x08, +0x08, +0x08, +0x04, +0x02, +0x00, + // ) +0x08, +0x04, +0x02, +0x02, +0x02, +0x04, +0x08, +0x00, + // * +0x00, +0x04, +0x15, +0x0E, +0x15, +0x04, +0x00, +0x00, + // + +0x00, +0x04, +0x04, +0x1F, +0x04, +0x04, +0x00, +0x00, + // , +0x00, +0x00, +0x00, +0x00, +0x0C, +0x04, +0x08, +0x00, + // - +0x00, +0x00, +0x00, +0x1F, +0x00, +0x00, +0x00, +0x00, + // . +0x00, +0x00, +0x00, +0x00, +0x00, +0x0C, +0x0C, +0x00, + // / +0x00, +0x01, +0x02, +0x04, +0x08, +0x10, +0x00, +0x00, + // 0 +0x0E, +0x11, +0x13, +0x15, +0x19, +0x11, +0x0E, +0x00, + // 1 +0x04, +0x0C, +0x04, +0x04, +0x04, +0x04, +0x0E, +0x00, + // 2 +0x0E, +0x11, +0x01, +0x02, +0x04, +0x08, +0x1F, +0x00, + // 3 +0x1F, +0x02, +0x04, +0x02, +0x01, +0x11, +0x0E, +0x00, + // 4 +0x02, +0x06, +0x0A, +0x12, +0x1F, +0x02, +0x02, +0x00, + // 5 +0x1F, +0x10, +0x1E, +0x01, +0x01, +0x11, +0x0E, +0x00, + // 6 +0x06, +0x08, +0x10, +0x1E, +0x11, +0x11, +0x0E, +0x00, + // 7 +0x1F, +0x01, +0x02, +0x04, +0x04, +0x04, +0x04, +0x00, + // 8 +0x1E, +0x11, +0x11, +0x0E, +0x11, +0x11, +0x0E, +0x00, + // 9 +0x0E, +0x11, +0x11, +0x0F, +0x01, +0x02, +0x0C, +0x00, + // : +0x00, +0x0C, +0x0C, +0x00, +0x0C, +0x0C, +0x00, +0x00, + // ; +0x00, +0x0C, +0x0C, +0x00, +0x0C, +0x04, +0x08, +0x00, + // < +0x02, +0x04, +0x08, +0x10, +0x08, +0x04, +0x02, +0x00, + // = +0x00, +0x00, +0x1F, +0x00, +0x1F, +0x00, +0x00, +0x00, + // > +0x08, +0x04, +0x02, +0x01, +0x02, +0x04, +0x08, +0x00, + // ? +0x0E, +0x11, +0x01, +0x02, +0x04, +0x00, +0x04, +0x00, + // @ +0x0E, +0x11, +0x01, +0x0D, +0x15, +0x15, +0x0E, +0x00, + // A +0x0E, +0x11, +0x11, +0x11, +0x1F, +0x11, +0x11, +0x00, + // B +0x1E, +0x09, +0x09, +0x0E, +0x09, +0x09, +0x1E, +0x00, + // C +0x0E, +0x11, +0x10, +0x10, +0x10, +0x11, +0x0E, +0x00, + // D +0x1E, +0x09, +0x09, +0x09, +0x09, +0x09, +0x1E, +0x00, + // E +0x1F, +0x10, +0x10, +0x1F, +0x10, +0x10, +0x1F, +0x00, + // F +0x1F, +0x10, +0x10, +0x1E, +0x10, +0x10, +0x10, +0x00, + // G +0x0E, +0x11, +0x10, +0x13, +0x11, +0x11, +0x0F, +0x00, + // H +0x11, +0x11, +0x11, +0x1F, +0x11, +0x11, +0x11, +0x00, + // I +0x0E, +0x04, +0x04, +0x04, +0x04, +0x04, +0x0E, +0x00, + // J +0x07, +0x02, +0x02, +0x02, +0x02, +0x12, +0x0C, +0x00, + // K +0x11, +0x12, +0x14, +0x18, +0x14, +0x12, +0x11, +0x00, + // L +0x10, +0x10, +0x10, +0x10, +0x10, +0x10, +0x1F, +0x00, + // M +0x11, +0x1B, +0x15, +0x15, +0x11, +0x11, +0x11, +0x00, + // N +0x11, +0x19, +0x19, +0x15, +0x13, +0x13, +0x11, +0x00, + // O +0x0E, +0x11, +0x11, +0x11, +0x11, +0x11, +0x0E, +0x00, + // P +0x1E, +0x11, +0x11, +0x1E, +0x10, +0x10, +0x10, +0x00, + // Q +0x0E, +0x11, +0x11, +0x11, +0x15, +0x12, +0x1D, +0x00, + // R +0x1E, +0x11, +0x11, +0x1E, +0x14, +0x12, +0x11, +0x00, + // S +0x0E, +0x11, +0x10, +0x0E, +0x01, +0x11, +0x0E, +0x00, + // T +0x1F, +0x04, +0x04, +0x04, +0x04, +0x04, +0x04, +0x00, + // U +0x11, +0x11, +0x11, +0x11, +0x11, +0x11, +0x0E, +0x00, + // V +0x11, +0x11, +0x11, +0x11, +0x11, +0x0A, +0x04, +0x00, + // W +0x11, +0x11, +0x11, +0x15, +0x15, +0x1B, +0x11, +0x00, + // X +0x11, +0x11, +0x0A, +0x04, +0x0A, +0x11, +0x11, +0x00, + // Y +0x11, +0x11, +0x11, +0x0A, +0x04, +0x04, +0x04, +0x00, + // Z +0x1F, +0x01, +0x02, +0x04, +0x08, +0x10, +0x1F, +0x00, + // [ +0x0E, +0x08, +0x08, +0x08, +0x08, +0x08, +0x0E, +0x00, +  +//////////// +//0x00, +  + // \ +  +0x00, +0x10, +0x08, +0x04, +0x02, +0x01, +0x00, +0x00, + // ] +0x0E, +0x02, +0x02, +0x02, +0x02, +0x02, +0x0E, +0x00, + // ^ +0x04, +0x0A, +0x11, +0x00, +0x00, +0x00, +0x00, +0x00, + // _ +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x1F, +0x00, + // ` +0x10, +0x08, +0x04, +0x00, +0x00, +0x00, +0x00, +0x00, + // a +0x00, +0x00, +0x0E, +0x01, +0x0F, +0x11, +0x0F, +0x00, + // b +0x10, +0x10, +0x16, +0x19, +0x11, +0x11, +0x1E, +0x00, + // c +0x00, +0x00, +0x0E, +0x11, +0x10, +0x11, +0x0E, +0x00, + // d +0x01, +0x01, +0x0D, +0x13, +0x11, +0x11, +0x0F, +0x00, + // e +0x00, +0x00, +0x0E, +0x11, +0x1F, +0x10, +0x0E, +0x00, + // f +0x02, +0x05, +0x04, +0x0E, +0x04, +0x04, +0x04, +0x00, + // g +0x00, +0x00, +0x0D, +0x13, +0x13, +0x0D, +0x01, +0x0E, + // h +0x10, +0x10, +0x16, +0x19, +0x11, +0x11, +0x11, +0x00, + // i +0x04, +0x00, +0x0C, +0x04, +0x04, +0x04, +0x0E, +0x00, + // j +0x02, +0x00, +0x06, +0x02, +0x02, +0x12, +0x0C, +0x00, + // k +0x08, +0x08, +0x09, +0x0A, +0x0C, +0x0A, +0x09, +0x00, + // l +0x0C, +0x04, +0x04, +0x04, +0x04, +0x04, +0x0E, +0x00, + // m +0x00, +0x00, +0x1A, +0x15, +0x15, +0x15, +0x15, +0x00, + // n +0x00, +0x00, +0x16, +0x19, +0x11, +0x11, +0x11, +0x00, + // o +0x00, +0x00, +0x0E, +0x11, +0x11, +0x11, +0x0E, +0x00, + // p +0x00, +0x00, +0x16, +0x19, +0x19, +0x16, +0x10, +0x10, + // q +0x00, +0x00, +0x0D, +0x13, +0x13, +0x0D, +0x01, +0x01, + // r +0x00, +0x00, +0x16, +0x19, +0x10, +0x10, +0x10, +0x00, + // s +0x00, +0x00, +0x0F, +0x10, +0x1E, +0x01, +0x1F, +0x00, + // t +0x08, +0x08, +0x1C, +0x08, +0x08, +0x09, +0x06, +0x00, + // u +0x00, +0x00, +0x12, +0x12, +0x12, +0x12, +0x0D, +0x00, + // v +0x00, +0x00, +0x11, +0x11, +0x11, +0x0A, +0x04, +0x00, + // w +0x00, +0x00, +0x11, +0x11, +0x15, +0x15, +0x0A, +0x00, + // x +0x00, +0x00, +0x11, +0x0A, +0x04, +0x0A, +0x11, +0x00, + // y +0x00, +0x00, +0x11, +0x11, +0x13, +0x0D, +0x01, +0x0E, + // z +0x00, +0x00, +0x1F, +0x02, +0x04, +0x08, +0x1F, +0x00, + // +0x02, +0x04, +0x04, +0x08, +0x04, +0x04, +0x02, +0x00, + // | +0x04, +0x04, +0x04, +0x00, +0x04, +0x04, +0x04, +0x00, + // +0x08, +0x04, +0x04, +0x02, +0x04, +0x04, +0x08, +0x00, + // ~ +0x00, +0x00, +0x08, +0x15, +0x02, +0x00, +0x00, +0x00, + // 5F +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 60 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 61 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 62 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 63 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 64 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 65 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 66 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 67 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 68 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 69 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 6A +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 6B +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 6C +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 6D +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 6E +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 6F +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 70 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 71 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 72 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 73 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 74 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 75 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 76 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 77 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 78 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 79 +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 7A +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 7B +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 7C +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 7D +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 7E +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, + // 7F +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00, +0x00 +}; +  +  + diff --git a/HUB12_simple/HUB12_simple.ino b/HUB12_simple/HUB12_simple.ino new file mode 100644 index 0000000..250a034 --- /dev/null +++ b/HUB12_simple/HUB12_simple.ino @@ -0,0 +1,194 @@ + +/************************************************************** +* +* Sample sketch for driving 32x16 LED PANEL (1/4 scan) with +* HUB12 protocol +* +*************************************************************/ +  +#include +  +//Pins specific for Mega .See Arduino SPI for a different board. +#define A 22 +#define B 24 +#define OE 26 +#define R1 51 +#define CLK 52 +#define STB 53 +  +  +//row to be shown (1-4 since it is 1/4 scan) +byte row=0; +  +//brightness: increase->more bright +int br=500; +  +//some digits from a 8x8 font (numeric 1-8) +byte digits[]={ +  +0x04, //1 +0x0C, +0x04, +0x04, +0x04, +0x04, +0x0E, +0x00, +  +0x0E, //2 +0x11, +0x01, +0x02, +0x04, +0x08, +0x1F, +0x00, +  +  +0x1F, //3 +0x02, +0x04, +0x02, +0x01, +0x11, +0x0E, +0x00, +  +0x02, //4 +0x06, +0x0A, +0x12, +0x1F, +0x02, +0x02, +0x00, +  +0x1F, //5 +0x10, +0x1E, +0x01, +0x01, +0x11, +0x0E, +0x00, +  +  +0x06, //6 +0x08, +0x10, +0x1E, +0x11, +0x11, +0x0E, +0x00, +  +0x1F,//7 +0x01, +0x02, +0x04, +0x04, +0x04, +0x04, +0x00, +  +  +0x0E,//8 +0x11, +0x11, +0x0E, +0x11, +0x11, +0x0E, +0x00, +  +  +  +  +  +}; +  +  +  +void setup () { + pinMode(A, OUTPUT); + pinMode(B, OUTPUT); + pinMode(OE, OUTPUT); + pinMode(R1, OUTPUT); + pinMode(CLK, OUTPUT); + pinMode(STB, OUTPUT); + SPI.begin(); + delay(300); +} +  +  +//display alternatively scan lines +void loop(){ + showRow(0); + showRow(1); + showRow(2); + showRow(3); +} +  +  +//Load and show row (1-4) i.e. 1 and 5, 2 and 6..... +void showRow(int row){ +  + SPI.transfer(~(digits[row+36])); //5 + SPI.transfer(~(digits[row+32])); +  + SPI.transfer(~(digits[row+4])); //1 + SPI.transfer(~(digits[row])); +  + SPI.transfer(~(digits[row+44])); //6 + SPI.transfer(~(digits[row+40])); +  + SPI.transfer(~(digits[row+12])); //2 + SPI.transfer(~(digits[row+8])); +  + SPI.transfer(~(digits[row+52])); //7 + SPI.transfer(~(digits[row+48])); +  + SPI.transfer(~(digits[row+20])); //3 + SPI.transfer(~(digits[row+16])); +  + SPI.transfer(~(digits[row+60])); //8 + SPI.transfer(~(digits[row+56])); +  + SPI.transfer(~(digits[row+28])); //4 + SPI.transfer(~(digits[row+24])); +  + digitalWrite(STB,LOW); + digitalWrite(STB,HIGH); +  + scanrow(row);//enable encoder for the line loaded +  + //PWM like. Change br to adjust brightnes + digitalWrite(OE,HIGH); + delayMicroseconds(br); + digitalWrite(OE,LOW); + delayMicroseconds(900); +  +  +} +  +//enable encoder for this row in order to show it +void scanrow(int r){ + if(r==0){ + digitalWrite(A,0); + digitalWrite(B,0); + } + else if(r==1){ + digitalWrite(A,1); + digitalWrite(B,0); + } + else if(r==2){ + digitalWrite(A,0); + digitalWrite(B,1); + } + else if(r==3){ + digitalWrite(A,1); + digitalWrite(B,1); + } +} +  +