Dead Bug

In een eerdere tutorial heb ik bovenstaande display met drie shiftregisters aan de praat gekregen. Het leek me mogelijk om de shiftregisters direct tegen de pootjes van de display te solderen. Dan liggen de IC’s en het display als dode insecten met de pootjes de lucht in, op elkaar. Gelukkig paste een aarde-pin van een shiftregister mooi – zonder aanraken – tussen twee andere pinnetjes van het display:

Zo kon ik op 4 na, alle pinnetjes bedienen. De losse pinnetjes verbond ik met kleine stukjes draad. Ook de latches, clock en datalijnen verbond ik, zodat er  (naast aarde en 5 volt) maar drie draadjes  “uit” het display komen.

Gevolg van deze methode was wel, dat ik een volstrekt willekeurige verbinding had tussen shiftregisters en display-pinnetjes. Deze moest ik vervolgens achterhalen en er (opnieuw) een ascii set voor schrijven. Uiteindelijk is het gelukt: Een 8 x 14 segment display op 3 arduino-pinnetjes voor ongeveer 5 euro.

Hier het schema in EXCEL dat ik maakte om de codes goed te krijgen.

Hier het resultaat, met daar onder de sketch.


byte toDisplay[] = {
  0x09, 0x59, 0x09, // all kathodes off
  0x09, 0x59, 0x09, // all kathodes off
  0x09, 0x59, 0x09, // all kathodes off
  0x09, 0x59, 0x09, // all kathodes off
  0x09, 0x59, 0x09, // all kathodes off
  0x09, 0x59, 0x09, // all kathodes off
  0x09, 0x59, 0x09, // all kathodes off
  0x09, 0x59, 0x09, // all kathodes off
};

byte kathodes[] = {
  0x09, 0x19, 0x09, // kathode 1
  0x08, 0x59, 0x09, // kathode 2
  0x09, 0x49, 0x09, // kathode 3
  0x01, 0x59, 0x09, // kathode 4
  0x09, 0x59, 0x01, // kathode 5
  0x09, 0x58, 0x09, // kathode 6
  0x09, 0x59, 0x08, // kathode 7
  0x09, 0x51, 0x09, // kathode 8
  0x09, 0x59, 0x09  // all kathodes off
};

byte ascii[]={
  0x00, 0x00, 0x00, // spatie
  0x04, 0x00, 0x00, // !
  0x06, 0x00, 0x00, // "
  0x26, 0x02, 0x34, // #
  0xA6, 0x02, 0x70, // $
  0x32, 0x24, 0x62, // %
  0x92, 0x02, 0x64, // &
  0x10, 0x00, 0x00, // '
  0x10, 0x20, 0x00, // {
  0x00, 0x04, 0x02, // )
  0x34, 0x24, 0x32, // *
  0x24, 0x00, 0x30, // +
  0x00, 0x00, 0x02, // ,
  0x20, 0x00, 0x20, // -
  0x00, 0x00, 0x20, // punt?
  0x10, 0x00, 0x02, // /
  0xA2, 0x02, 0x44, // 0
  0x04, 0x00, 0x10, // 1
  0xE0, 0x02, 0x24, // 2
  0xE0, 0x02, 0x40, // 3
  0x62, 0x00, 0x60, // 4
  0xA2, 0x06, 0x60, // 5
  0xA2, 0x02, 0x64, // 6
  0x10, 0x02, 0x10, // 7
  0xE2, 0x02, 0x64, // 8
  0xE2, 0x02, 0x60, // 9
  0x01, 0x02, 0x00, // :
  0x00, 0x02, 0x02, // ;
  0x10, 0x20, 0x00, // <
  0xA0, 0x00, 0x20, // =
  0x00, 0x04, 0x02, // >
  0x03, 0x50, 0x20, // ?
  0xE0, 0x02, 0x64, // @
  0x62, 0x02, 0x64, // A
  0xE4, 0x02, 0X50, // B
  0x82, 0x02, 0x04, // C
  0xC4, 0x02, 0x50, // D
  0x82, 0x02, 0x24, // E
  0x02, 0x02, 0x24, // F
  0xA2, 0x02, 0x44, // G
  0x62, 0x00, 0x64, // H
  0x84, 0x02, 0x10, // I
  0xC0, 0x00, 0x44, // J
  0x12, 0x20, 0x24, // K
  0x82, 0x00, 0x04, // L
  0x52, 0x04, 0x44, // M
  0x42, 0x24, 0x44, // N
  0xC2, 0x02, 0x44, // O
  0x62, 0x02, 0x24, // P
  0xC2, 0x22, 0x44, // Q
  0x62, 0x22, 0x24, // R
  0xA2, 0x02, 0x60, // S
  0x04, 0x02, 0x10, // T
  0xC2, 0x00, 0x44, // U
  0x12, 0x00, 0x06, // V
  0x42, 0x20, 0x46, // W
  0x10, 0x24, 0x02, // X
  0x10, 0x04, 0x10, // Y
  0x90, 0x02, 0x02, // Z
  0x82, 0x02, 0x04, // [
  0x00, 0x24, 0x00, // \
  0xC0, 0x02, 0x40, // ]
  0x00, 0x20, 0x02, // ^
  0x80, 0x00, 0x00, // _
  0x00, 0x00, 0x00, // space
  0x00, 0x00, 0x00, // space
};

int dataPin  = 6;  // HC595
int latchPin  = 7; // HC595
int clockPin  = 8; // HC595

String tekst = "* THIS DEMO WAS DONE USING 3 SHIFTREGISTERS WITH LATCH (74HC595) PLUS AN ARDUINO UNO. SEE HTTP://HUININK.INFO/ARDUINOPROJECTS/ FOR MORE INFO *-*-*-*-*-*-*-*-*-*-*-*-*+-+-+-+-+-+-+-+-+-+--.-.-.-.-.-.-.-.-.-.-.-.-.-.";

void setup(){
  pinMode(dataPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}

void loop(){
  writeTekst(tekst,50);
}

void writeTekst(String txt, byte milisec){
  String tekst = "        " + txt + "        ";
  int leng = tekst.length();
  int stappen = leng - 8;
  for (int st = 0; st < stappen; st++){
    for (byte teller=0; teller < 8; teller++){
      setChar(teller, tekst.charAt(st+teller));
    }
    for (int tijd = 0; tijd < milisec; tijd++){
      playDis();
    }
  }
}

void setChar(byte digitNo, byte asciiVal){
  asciiVal-=0x20;
  toDisplay[digitNo*3+0] = kathodes[digitNo*3+0] | ascii[asciiVal*3 + 0];
  toDisplay[digitNo*3+1] = kathodes[digitNo*3+1] | ascii[asciiVal*3 + 1];
  toDisplay[digitNo*3+2] = kathodes[digitNo*3+2] | ascii[asciiVal*3 + 2];
}

void playDis(){
  for (int digitNo = 0; digitNo < 8; digitNo++){
    shiftIt(toDisplay[digitNo*3+0], toDisplay[digitNo*3+1], toDisplay[digitNo*3+2] );
  }
}

void shiftIt (byte byte_1, byte byte_2, byte byte_3){
  byte b[] = {byte_1, byte_2, byte_3};
  digitalWrite(latchPin, HIGH);
  for (int byte_0to2 = 0; byte_0to2 < 3; byte_0to2++){
    for (int k=0; k < 8; k++){
      digitalWrite(clockPin, LOW);
      if ( b[byte_0to2] & (1 << k) ){
        digitalWrite(dataPin, HIGH);
      }
      else{
        digitalWrite(dataPin, LOW);
      }
      digitalWrite(clockPin, HIGH);
    }
  }
  digitalWrite(latchPin, LOW);
}

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>