Wednesday, April 24, 2013

16 by 40 Dual color LED sign being sold on eBay by RDR Electronics.

They are advertising this sign as "10 - LED 8x8 5mm Dot Matrix Array Module Common Anode Red & Green 60mm".  The sign has a two pin power connector and a six pin pass through connector.  The pass through connector comes in on the right and leaves on the left.  The six signals pass through two 4049's on the way through the board.

Here is a picture of the back of the sign.  WO/32779/1 might mean something to someone?

 Here is a picture of the front side of the sign:

The six pin connector on the right has pin one at the top, here is what they connect to:
1 - CD4094 Pin 3 Clock top row.
2 - CD4094 Pin 15 Output Enable for all 4094's (And bottom 4015 pin 7 as data)
3 - CD4094 Pin 2 Serial Data bottom row
4 - CD4094 Pin 1 Strobe for all 4094's (And both 4015 pin 9 and 1 as clock)
5 - CD4094 Pin 2 Serial Data top row
6 - CD4094 Pin 3 Clock bottom row

CD4094 Eight bit shift registers are used throughout the sign.  They then used TD62083 drivers to drive the sign.  I do not know how it drives the rows as the CD4094's only are used for the columns.  There are some CD4015's that appear to be used for the rows.  The next step is to interface it to a Arduino.

You might notice that there are no references to the row selection hardware.  I have tried to get the sign working, but then I took it all back apart to trace out some more runs.  Here is what I found.  Pin 2 goes to the 4049's pin 15 as "output enable", but it also goes to the bottom 4015A pin 7 as "Data".  Pin 4 goes to the 4049's Pin 1 as "strobe" but it also goes to both 4015's pin 9 and 1 as "Clock".

Here I am working on it.  It may not run off a 5 volt 2.5V AC adapter, it needs more power!
*** Update - it works on 5 volts at 2.5 amps when displaying text ***



Tuesday, April 23, 2013

Dell Inspiron Ultrabook 14Z Hard drive removal

Recently I had the fun of removing the hard drive from a Dell Inspiron Ultrabook 14Z.  The hard drive is located under the battery.  Where is the battery you may ask??

First you need to remove the memory cover and the memory modules.  Under one of the memory modules is a hidden screw.  With that screw removed you can remove the keyboard by pushing up on the three clips at the top of the keyboard.

Once the memory cover is removed the CD ROM is free to be removed as well.  There is one screw above the CD ROM that has to be removed. 


There are seven screws under plastic covers underneath the laptop and four screws under the keyboard that need to be removed.  Three are near the front edge and one is near the CPU fan as seen in the picture below.

Next release the four ribbon cables.  Then the top cover comes off by releasing catches all around the edges.  Now you can see the battery.  There are two screws holding the battery in.  The hard drive is then reachable.

Monday, April 22, 2013

Removing the CNet Download virus

Recently while working on a website, I noticed that some words were being underlined.  I did not make them links so I scrolled over the words and this popped up:

I immediately realized that I had a virus in my computer.  What on earth does "Sermons" have to do with eating bananas?  What total nonsense?  I tried scanning my computer with MSE and MBAM to no avail.  So I went to add/remove programs and there it was "GetSavin".  It easily removed itself that way. 

I did some research and this virus comes from going to download.com (download.cnet.com) and they install it on your computer. There was the day when I trusted download.com, I have long since learned to steer clear of them.  They install things on your computer without your permission and then activate it whenever they want.

Wednesday, April 17, 2013

My new book called "Arduino LED Projects"

I have been working on a new book called "Arduino LED Projects".  Now I am looking for a publisher.  It has a dozen projects from electronic dice, to a "wheel of prizes", to a quiz lockout machine, to a meter, and even a 8 by 8 dual color LED array.  It is already listed on Amazon.com.

Here is a picture of the table of contents:


This is a peak at one of the pages:


Here is a picture of the front cover:

 

Here I am playing with one of the projects, a two digit meter:

Monday, April 15, 2013

Signature Electronic Sign to Arduino Adapter Part who knows?

I have not given up on the idea of using an Arduino to power a 120 by 32 LED sign.  In fact I have it working, but the Arduino is still not fast enough.  The display flickers.  I made a quick adapter by taking the old controller and cutting the jacks off the circuit board.  Then I soldered a header onto it so that it plugs into the Arduino.  Here is what the adapter looks like;

Here is what it looks like when it is working:

Here is the code to make it work.  I got rid of the "Shift out" command, each shift clock sends eight bits to the signs eight shift registers.  That makes it run much faster.
//**********************************
//  Name    : 120x32 Cadaces Driver                         
//  Author  : Bob Davis                                  
//  Date    : 23 February, 2013                          
//  Version : 1.0                                        
//**********************************
// Pins for the row drivers
int row1Pin = 2;    //R1
int row2Pin = 7;    //R2
int row3Pin = 1;    //R3
int rowEnable = 8;    //REN
int rclockPin = 6;    //RCK
int clockPin = 3;     //SCK
int dataPin = 5;     //RSD
int gdataPin = 4;      //GSD
int dataPin1 = 9;     //RSD
int gdataPin1 = 10;      //GSD
int dataPin2 = 12;     //RSD
int gdataPin2 = 11;      //GSD
int dataPin3 = 13;     //RSD
int gdataPin3 = 14;      //GSD

// Set the pins to output to the sign
void setup() {
  pinMode(row1Pin, OUTPUT);
  pinMode(row2Pin, OUTPUT);
  pinMode(row3Pin, OUTPUT);
  pinMode(rowEnable, OUTPUT);
  pinMode(rclockPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(gdataPin, OUTPUT);
  pinMode(dataPin1, OUTPUT);
  pinMode(gdataPin1, OUTPUT);
  pinMode(dataPin2, OUTPUT);
  pinMode(gdataPin2, OUTPUT);
  pinMode(dataPin3, OUTPUT);
  pinMode(gdataPin3, OUTPUT);
}
//=== Character Array ===
// Characters are A, B, C, etc.  Only upper case. 
byte alphabets[][8] = {
  {0, 04, 10, 17, 17, 31, 17, 17}, //A
  {0, 30, 17, 17, 30, 17, 17, 30}, //B
  {0, 14, 17, 16, 16, 16, 17, 14}, //C
  {0, 28, 18, 17, 17, 17, 18, 28}, //D
  {0, 31, 16, 16, 31, 16, 16, 31}, //E
  {0, 31, 16, 16, 31, 16, 16, 16}, //F
  {0, 14, 17, 16, 16, 19, 17, 14}, //G
  {0, 17, 17, 17, 31, 17, 17, 17}, //H
  {0, 14, 04, 04, 04, 04, 04, 14}, //I
  {0, 07, 02, 02, 02, 02, 10, 14}, //J
  {0, 17, 18, 20, 24, 20, 18, 17}, //K
  {0, 16, 16, 16, 16, 16, 16, 31}, //L
  {0, 10, 21, 21, 21, 17, 17, 17}, //M
  {0, 17, 25, 25, 21, 19, 19, 17}, //N
  {0, 14, 17, 17, 17, 17, 17, 14}, //O
  {0, 30, 17, 17, 30, 16, 16, 16}, //P
  {0, 14, 17, 17, 17, 17, 19, 15}, //Q
  {0, 30, 17, 17, 30, 20, 18, 17}, //R
  {0, 14, 17, 16, 14, 01, 17, 14}, //S
  {0, 31, 04, 04, 04, 04, 04, 04}, //T
  {0, 17, 17, 17, 17, 17, 17, 14}, //U
  {0, 17, 17, 17, 10, 10, 10, 04}, //V
  {0, 17, 17, 17, 21, 21, 21, 10}, //W
  {0, 17, 17, 10, 04, 10, 17, 17}, //X
  {0, 17, 10, 10, 04, 04, 04, 04}, //Y
  {0, 31, 8, 04, 02, 04, 8, 31}, //Z
  {0, 0, 21, 14, 31, 14, 21, 0}, //*
};
byte numbers[][8] = {
  {0, 04, 12, 04, 04, 04, 04, 14}, //1
  {0, 14, 17, 01, 02, 04, 8, 31}, //2
  {0, 14, 01, 01, 06, 01, 01, 14}, //3
  {0, 17, 17, 17, 31, 01, 01, 01}, //4
  {0, 31, 16, 16, 14, 01, 17, 14}, //5
  {0, 14, 16, 16, 30, 17, 17, 14}, //6
  {0, 31, 01, 01, 02, 04, 8, 16}, //7
  {0, 14, 17, 17, 14, 17, 17, 14}, //8
  {0, 14, 17, 17, 15, 01, 01, 01}, //9
  {0, 14, 17, 17, 17, 17, 17, 14}, //0
};
byte bitmap[][8] = {  //red characters
  {0, 0,0,0,0,0,0,0},
  {0, 04, 12, 04, 04, 04, 04, 14}, //1
  {0, 14, 17, 01, 02, 04, 8, 31}, //2
  {0, 14, 17, 17, 17, 17, 17, 14}, //0
  {0, 17, 17, 10, 04, 10, 17, 17}, //X
  {0, 14, 01, 01, 06, 01, 01, 14}, //3
  {0, 14, 17, 01, 02, 04, 8, 31}, //2
  {0, 0,0,0,0,0,0,0},
  {0,  4, 10, 17, 17, 31, 17, 17}, //A
  {0, 0,0,0,0,0,0,0},
  {0, 28, 18, 17, 17, 17, 18, 28}, //D
  {0, 0,0,0,0,0,0,0},
  {0, 14, 04, 04, 04, 04, 04, 14}, //I
  {0, 17, 25, 25, 21, 19, 19, 17}, //N
  {0, 14, 17, 17, 17, 17, 17, 14}, //O
  {0, 0,0,0,0,0,0,0},
  {0, 14, 17, 16, 14, 01, 17, 14}, //S
  {0, 14, 04, 04, 04, 04, 04, 14}, //I
  {0, 14, 17, 16, 16, 19, 17, 14}, //G
  {0, 17, 25, 25, 21, 19, 19, 17}, //N
  {0, 0,0,0,0,0,0,0},
};
byte gbitmap[][8] = {  //green characters
  {0, 0,0,0,0,0,0,0},
  {0, 04, 12, 04, 04, 04, 04, 14}, //1
  {0, 14, 17, 01, 02, 04, 8, 31}, //2
  {0, 14, 17, 17, 17, 17, 17, 14}, //0
  {0, 17, 17, 10, 04, 10, 17, 17}, //X
  {0, 14, 01, 01, 06, 01, 01, 14}, //3
  {0, 14, 17, 01, 02, 04, 8, 31}, //2
  {0, 0,0,0,0,0,0,0},
  {0,  4, 10, 17, 17, 31, 17, 17}, //A
  {0, 30, 17, 17, 30, 20, 18, 17}, //R
  {0, 0,0,0,0,0,0,0},
  {0, 17, 17, 17, 17, 17, 17, 14}, //U
  {0, 14, 04, 04, 04, 04, 04, 14}, //I
  {0, 0,0,0,0,0,0,0},
  {0, 14, 17, 17, 17, 17, 17, 14}, //O
  {0, 0,0,0,0,0,0,0},
  {0, 14, 17, 16, 14, 01, 17, 14}, //S
  {0, 14, 04, 04, 04, 04, 04, 14}, //I
  {0, 14, 17, 16, 16, 19, 17, 14}, //G
  {0, 17, 25, 25, 21, 19, 19, 17}, //N
  {0, 0,0,0,0,0,0,0},
};
void RunSign(){
  for (int row = 7; row > 0; row--) {
    // turn off display
    digitalWrite(rowEnable, HIGH);
    digitalWrite(rclockPin, LOW);
    // send serial data to display 20 = number of characters
    for (int character = 0; character < 21; character++){
     for (int shiftbit = 5; shiftbit > -1; shiftbit--){
      digitalWrite(gdataPin, LOW);
      digitalWrite(dataPin, LOW);
      digitalWrite(gdataPin1, LOW);
      digitalWrite(dataPin1, LOW);
      digitalWrite(gdataPin2, LOW);
      digitalWrite(dataPin2, LOW);
      digitalWrite(gdataPin3, LOW);
      digitalWrite(dataPin3, LOW);
      if bitRead(gbitmap[character][row],shiftbit) digitalWrite(gdataPin, HIGH);
      if bitRead(bitmap[character][row],shiftbit) digitalWrite(dataPin, HIGH);
      if bitRead(gbitmap[character][row],shiftbit) digitalWrite(gdataPin1, HIGH);
      if bitRead(bitmap[character][row],shiftbit) digitalWrite(dataPin1, HIGH);
      if bitRead(gbitmap[character][row],shiftbit) digitalWrite(gdataPin2, HIGH);
      if bitRead(bitmap[character][row],shiftbit) digitalWrite(dataPin2, HIGH);
      if bitRead(gbitmap[character][row],shiftbit) digitalWrite(gdataPin3, HIGH);
      if bitRead(bitmap[character][row],shiftbit) digitalWrite(dataPin3, HIGH);
      digitalWrite(clockPin, HIGH);
      digitalWrite(clockPin, LOW);
    } }
    //latch the data
    digitalWrite(rclockPin, HIGH);
    // set up 74138 row sesection and turn display back on
    digitalWrite(row1Pin, LOW);
    digitalWrite(row2Pin, LOW);
    digitalWrite(row3Pin, LOW);
    if bitRead(row,0) digitalWrite (row1Pin, HIGH);
    if bitRead(row,1) digitalWrite (row2Pin, HIGH);
    if bitRead(row,2) digitalWrite (row3Pin, HIGH);
    digitalWrite(rowEnable, LOW);
    // Wait to see what we sent to the display ;
    delayMicroseconds(500);
  }


//=== L O O P ===
void loop() {
  RunSign();
}

How to make a quick Arduino to Cadaces adapter.



Some people asked me for a simpler way to interface the Cadaces modules to an Arduino, so here it is!

All you need to do this is a five pin header and four jumper wires.  Insert the five pin header into D1 through D5.  Then plug the cable from the display into those five pins so the other five pins hang off to the right.  Add the four jumper wires according to the schematic.
 Here is a picture of the quick adapter in operation.  The green wire if 5 volts going to power the sign.

Here are the pin number changes to the code to make it work;

// Pins for the row drivers
int row1Pin = 2;            //R1
int row2Pin = 7;            //R2
int row3Pin = 1;            //R3
int rowEnable = 8;        //REN
int rclockPin = 6;          //RCK
int clockPin = 3;           //SCK
int dataPin = 5;             //RSD
int gdataPin = 4;           //GSD

Here is the total code for 8 x 40 array:

//**********************************
//  Name    : Cadaces Driver                         
//  Author  : Bob Davis                                  
//  Date    : 23 February, 2013                                 
//  Version : 1.0                                             
//**********************************
// Pins for the row drivers
int row1Pin = 2;         //R1
int row2Pin = 7;         //R2
int row3Pin = 1;         //R3
int rowEnable = 8;     //REN
int rclockPin = 6;        //RCK
int clockPin = 3;         //SCK
int dataPin = 5;          //RSD
int gdataPin = 4;        //GSD
// Set the pins to output to the sign
void setup() {
  pinMode(row1Pin, OUTPUT);
  pinMode(row2Pin, OUTPUT);
  pinMode(row3Pin, OUTPUT);
  pinMode(rowEnable, OUTPUT);
  pinMode(rclockPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(gdataPin, OUTPUT);
}
byte bitmap[][8] = {  //red characters
  {0, 0,0,0,0,0,0,0},
  {0,  4, 10, 17, 17, 31, 17, 17}, //A
  {0, 30, 17, 17, 30, 20, 18, 17}, //R
  {0, 28, 18, 17, 17, 17, 18, 28}, //D
  {0, 0,0,0,0,0,0,0},
  {0, 14, 04, 04, 04, 04, 04, 14}, //I
  {0, 17, 25, 25, 21, 19, 19, 17}, //N
  {0, 14, 17, 17, 17, 17, 17, 14}, //O
  {0, 0,0,0,0,0,0,0},
};
byte gbitmap[][8] = {  //green characters
  {0, 0,0,0,0,0,0,0},
  {0,  4, 10, 17, 17, 31, 17, 17}, //A
  {0, 30, 17, 17, 30, 20, 18, 17}, //R
  {0, 0,0,0,0,0,0,0},
  {0, 17, 17, 17, 17, 17, 17, 14}, //U
  {0, 14, 04, 04, 04, 04, 04, 14}, //I
  {0, 0,0,0,0,0,0,0},
  {0, 14, 17, 17, 17, 17, 17, 14}, //O
  {0, 0,0,0,0,0,0,0},
};
void RunSign(){
  for (int row = 7; row > 0; row--) {
    // turn off display
    digitalWrite(rowEnable, HIGH);
    digitalWrite(rclockPin, LOW);
    // send serial data to display 8 = number of characters
    for (int character = 0; character < 8; character++){
     for (int shiftbit = 5; shiftbit > -1; shiftbit--){
      digitalWrite(gdataPin, LOW);
      digitalWrite(dataPin, LOW);
      if bitRead(gbitmap[character][row],shiftbit) digitalWrite(gdataPin, HIGH);
      if bitRead(bitmap[character][row],shiftbit) digitalWrite(dataPin, HIGH);
      digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW);
    } }
    //latch the data
    digitalWrite(rclockPin, HIGH);
    // set up 74138 row selection and turn display back on
    digitalWrite(row1Pin, LOW);
    digitalWrite(row2Pin, LOW);
    digitalWrite(row3Pin, LOW);
    if bitRead(row,0) digitalWrite (row1Pin, HIGH);
    if bitRead(row,1) digitalWrite (row2Pin, HIGH);
    if bitRead(row,2) digitalWrite (row3Pin, HIGH);
    digitalWrite(rowEnable, LOW);
    // Wait to see what we sent to the display ;
    delayMicroseconds(500);
  }
} 

//=== L O O P ===
void loop() {
  RunSign();
}