アノードコモンの8セグメントLEDへ表示する(DM13Aを使う)


今回は汎用の定電流LEDドライバーのDM13Aを 使って8セグメントLEDを表示する方法を紹介します。
このチップは8セグメントLED専用ではなく、汎用の定電流LEDドライバーです。
OUT15→OUT14→OUT13の順に16ビットのON/OFFデータを入力します。
ONにするとGNDとなり、OFFにすると一定の電流が流れます。
あまり人気が無いのか、使い方を紹介しているページは見つけられませんでした。

TLC5940

DM13A
DM13A

結線は以下の通りです。
23番ピン(REXT)とGNDの間には、出力電流制限用の抵抗を挟んで使用し ます。
抵抗値と出力電流の関係はデータシートに記載されています。
私は4.7KΩの抵抗を使いましたので、出力電流(この場合は逆方向電流)として15mAぐらいが流れるはずです。

DM13Aピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(GND)
GND
2(DAI)
11(GPIO17)
3(DCK)
12(GPIO18)
4(LAT)
13(GPIO27)
5(OUT0) Segment a
6(OUT1) Segment b
7(OUT2) Segment c
8(OUT3) Segment d
9(OUT4) Segment e
10(OUT5) Segment f
11(OUT6) Segment g
12(OUT7) Segment D.P
13(OUT8)

14(OUT9)

15(OUT10)

16(OUT11)

17(OUT12)

18(OUT13)

19(OUT14)

20(OUT15)

21(EN)
15(GPIO22)
22(DAO)

23(REXT)
4.7KΩの抵抗を介してGNDに接続
24(VDD)
3.3V

このチップは汎用の定電流LEDドライバーなので、Segment制御しかできません。
したがって複数桁のLEDを使う場合、桁の制御は独自に行う必要があります。
桁の制御としては以下のピンを使います。

LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
Digit 3 Common 24(GPIO8)
Digit 2 Common 26(GPIO7)
Digit 1 Common 19(GPIO10)

ソースコードは以下の通りです。

/*

 dm13a.c
 
 Raspberry Pi driving the DM13A

 to compile : cc dm13a.c -o dm13a -lwiringPi

*/
 
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

// define our pins :

#define DAI     0    // GPIO 17 header pin 11
#define DCK    1    // GPIO 18 header pin 12
#define LAT    2    // GPIO 27 header pin 13
#define EN      3    // GPIO 22 header pin 15

#define Digs    3
#define D0      10

static const uint8_t segmentDigits [] =
{
// a  b  c  d  e  f  g  p       Segments
// 0  1  2  3  4  5  6  7       wiringPi pin No.
   1, 1, 1, 1, 1, 1, 0, 0,      // 0
   0, 1, 1, 0, 0, 0, 0, 0,      // 1
   1, 1, 0, 1, 1, 0, 1, 0,      // 2
   1, 1, 1, 1, 0, 0, 1, 0,      // 3
   0, 1, 1, 0, 0, 1, 1, 0,      // 4
   1, 0, 1, 1, 0, 1, 1, 0,      // 5
   1, 0, 1, 1, 1, 1, 1, 0,      // 6
   1, 1, 1, 0, 0, 0, 0, 0,      // 7
   1, 1, 1, 1, 1, 1, 1, 0,      // 8
   1, 1, 1, 1, 0, 1, 1, 0,      // 9
   1, 1, 1, 0, 1, 1, 1, 0,      // A
   0, 0, 1, 1, 1, 1, 1, 0,      // b
   1, 0, 0, 1, 1, 1, 0, 0,      // C
   0, 1, 1, 1, 1, 0, 1, 0,      // d
   1, 0, 0, 1, 1, 1, 1, 0,      // E
   1, 0, 0, 0, 1, 1, 1, 0,      // F
   0, 0, 0, 0, 0, 0, 0, 0,      // blank
} ;

static void DM13ASend (uint8_t * output)
{
  int i;

  digitalWrite(EN,1);
  digitalWrite(LAT,0);

  for (i=16; i>0; i--)
  {
    if (output[i-1]) 
      digitalWrite(DAI,1);         
    else                             
      digitalWrite(DAI,0); 
    digitalWrite(DCK,1);
    digitalWrite(DCK,0);
  }
  digitalWrite(LAT,1);
  digitalWrite(LAT,0);
  digitalWrite(EN,0);
}

DisplayDigits (char* digits)
{
  int i;
  uint8_t digit, segment ;
  uint8_t index, d, segVal ;
  uint8_t output[16];

  memset(output,0,sizeof(output));
  for (digit = 0 ; digit < Digs; ++digit) {
    digitalWrite (D0 + digit, 1) ;
    d = toupper (digits [digit]) ;
    if ((d >= '0') && (d <= '9'))             // Digit
      index = d - '0' ;
    else if ((d >= 'A') && (d <= 'F'))        // Hex
      index = d - 'A' + 10 ;
    else
      index = 16 ;                          // Blank

    for (segment = 0 ; segment < 8 ; ++segment) {
      output[segment] = segmentDigits [index * 8 + segment] ;
    }
    DM13ASend (output);
    delayMicroseconds (100) ;
    digitalWrite (D0 + digit, 0) ;
  }
}

int main (void)
{
  int i;
  char digits [8] ;

  printf ("\n\nRaspberry Pi DM13A Test using WiringPi\n\n");

  if (wiringPiSetup () == -1) exit (1) ;
  pinMode(DAI,OUTPUT); 
  pinMode(DCK,OUTPUT);
  pinMode(LAT,OUTPUT); 
  pinMode(EN, OUTPUT); 

  for(i=0;i<Digs;i++) {
    pinMode(D0+i, OUTPUT);
    digitalWrite(D0+i, 0);
  }
  
  digitalWrite(DCK,0);
  digitalWrite(LAT,0);
  digitalWrite(EN,0);

  strcpy(digits,"123");
  for(i=0;i<3000;i++) DisplayDigits(digits);

  strcpy(digits,"ABC");
  for(i=0;i<3000;i++) DisplayDigits(digits);

  for(i=0;i<Digs;i++) {
    digitalWrite(D0+i, 0);
  }

  return 0;
}

新しいチップを入手したらまた紹介します。