I am playing with the Silent Radio LED sign once again. There are two problems to fix, the brightness
and the scrolling.
See a Sunrise Systems sign converted with newer software at: https://bobdavis321.blogspot.com/2019/04/arduino-uno-interfaced-to-sunrise.html
See a Sunrise Systems sign converted with newer software at: https://bobdavis321.blogspot.com/2019/04/arduino-uno-interfaced-to-sunrise.html
Working on the brightness problem, I know that the 4017
design did not work well because there was no way to turn off the sign while
updating the shift registers. As a
result I went back to having the Arduino directly drive the TIP120
drivers. Another possible solution might
be to use an ULN2003’s as a level shifter.
That would require a 6 or 7 volt power supply as well. I wanted to stay with a 5 volt power
supply. I have observed that the Cadaces
modules use 22 ohm current limiting resistors.
The Silent Radio signs use 100 ohm resistors. Maybe changing the resistors is a better
solution? Here is the schematic.
This is what it looks like, the Arduino is underneath the circuit board.
On the scrolling issue, I have suspects that the sign
scrolls backwards because it is upside down.
So I changed two lines of code so the sigh would work upside down and
viola, it works. It now scrolls from
right to left like it should have been doing.
Here is the code to make it work.
//**************************************************************// // Name : Silent Radio Driver // // Author : Bob Davis // // Date : 25 April, 2011 // // Version : 1.0 // // Based on work of Hari Wiguna - http://g33k.blogspot.com/ // //**************************************************************** // Pins for the row drivers int row1Pin = 1; int row2Pin = 2; int row3Pin = 3; int row4Pin = 4; int row5Pin = 5; int row6Pin = 6; int row7Pin = 7; // Pins for column shift registers int clockPin = 8; int dataPin = 9; // Set the pins to output to the circuit void setup() { pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(row1Pin, OUTPUT); pinMode(row2Pin, OUTPUT); pinMode(row3Pin, OUTPUT); pinMode(row4Pin, OUTPUT); pinMode(row5Pin, OUTPUT); pinMode(row6Pin, OUTPUT); pinMode(row7Pin, OUTPUT); } //=== B I T M A P === //Bits in this array represents one LED of the matrix // 8 is # of rows, 7 is # of LED matrix we have byte bitmap[8][12]; // Change the 7 to however many matrices you want to use. int numZones = sizeof(bitmap) / 8; // I will refer to each group of 8 columns (represented by one matrix) as a Zone. int maxZoneIndex = numZones-1; int numCols = numZones * 8; //=== F O N T === // Font courtesy of aspro648 // http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1203747843/22 // First char is @, next is A, B, etc. Only lower case, no symbols. // The @ will display as space character. byte alphabets[][5] = { {0,0,0,0,0}, {31, 36, 68, 36, 31}, {127, 73, 73, 73, 54}, {62, 65, 65, 65, 34}, {127, 65, 65, 34, 28}, {127, 73, 73, 65, 65}, {127, 72, 72, 72, 64}, {62, 65, 65, 69, 38}, {127, 8, 8, 8, 127}, {0, 65, 127, 65, 0}, {2, 1, 1, 1, 126}, {127, 8, 20, 34, 65}, {127, 1, 1, 1, 1}, {127, 32, 16, 32, 127}, {127, 32, 16, 8, 127}, {62, 65, 65, 65, 62}, {127, 72, 72, 72, 48}, {62, 65, 69, 66, 61}, {127, 72, 76, 74, 49}, {50, 73, 73, 73, 38}, {64, 64, 127, 64, 64}, {126, 1, 1, 1, 126}, {124, 2, 1, 2, 124}, {126, 1, 6, 1, 126}, {99, 20, 8, 20, 99}, {96, 16, 15, 16, 96}, {67, 69, 73, 81, 97}, }; //=== F U N C T I O N S === // This routine takes whatever we've setup in the bitmap array and display it on the matrix void RefreshDisplay() { for (int row = 0; row < 8; row++) { //-- turn off the display -- digitalWrite(row1Pin, LOW); digitalWrite(row2Pin, LOW); digitalWrite(row3Pin, LOW); digitalWrite(row4Pin, LOW); digitalWrite(row5Pin, LOW); digitalWrite(row6Pin, LOW); digitalWrite(row7Pin, LOW); //-- Shift out to each matrix (zone is 8 columns represented by one matrix) for (int zone = maxZoneIndex; zone >= 0; zone--) { shiftOut(dataPin, clockPin, MSBFIRST, bitmap[row][zone]); } //-- turn the current row on -- if (row == 1) digitalWrite (row7Pin, HIGH); if (row == 2) digitalWrite (row6Pin, HIGH); if (row == 3) digitalWrite (row5Pin, HIGH); if (row == 4) digitalWrite (row4Pin, HIGH); if (row == 5) digitalWrite (row3Pin, HIGH); if (row == 6) digitalWrite (row2Pin, HIGH); if (row == 7) digitalWrite (row1Pin, HIGH); //-- Wait a little bit to let humans see what we've pushed out onto the matrix -- delayMicroseconds(500); } } // Converts row and colum to actual bitmap bit and turn it off/on void Plot(int col, int row, bool isOn) { int zone = col / 8; int colBitIndex = col % 8; byte colBit = 1 << colBitIndex; if (isOn) bitmap[row][zone] = bitmap[row][zone] | colBit; else bitmap[row][zone] = bitmap[row][zone] & (~colBit); } // Plot each character of the message one column at a time, updated the display, shift bitmap left. void AlphabetSoup() { char msg[] = "ARDUINO LED SIGN "; for (int charIndex=0; charIndex < (sizeof(msg)-1); charIndex++) { int alphabetIndex = msg[charIndex] - '@'; if (alphabetIndex < 0) alphabetIndex=0; //-- Draw one character of the message -- // Each character is only 5 columns wide for (int col = 0; col < 6; col++) { for (int row = 0; row < 8; row++) { // Set the pixel to the alphabet for columns 0 thru 4 bool isOn = 0; if (col<5 --="" 1="" 50="" 7-row="" alphabetindex="" alphabets="" bitmap="" col="" column="" for="" int="" ison="" left="" loop="" more="" numcols-1="" one="" plot="" refreshcount="" refreshdisplay="" repeat="" row="" scroll="" shift="" slower="" the="" this="" times="" to="" we="" would="" you="" zone=""> 0; zone--) for (int zone=0; zone < numZones; zone++) { // This right shift would show a left scroll on display. bitmap[row][zone] = bitmap[row][zone] >> 1; // Roll over lowest bit from the next zone as highest bit of this zone. if (zone < maxZoneIndex) bitWrite(bitmap[row][zone], 7, bitRead(bitmap[row][zone+1],0)); } } } } } //=== L O O P === void loop() { AlphabetSoup(); } 5>
1 comment:
also have a look on LED Signs
Post a Comment