カソードコモンの8セグメントLEDへ表示する(MAX7221を使う)


今回はカソードコモンの8セグメントLED専用ドライバーのMAX7221を 使って8セグメントLEDを表示する方法を紹介します。
MAX7221は前回紹介したMAX7219にSPIのI/Fを追加したチッ プ です。

MAX7221
動作結果

このチップは2通りのI/Fで通信が可能です。
1.MAX7219と同じ通信(CLOCKのパルスを使って通信する)
2.SPI I/Fを使った通信
MAX7219と同じ通信を行う場合、結線、ソースコードはMAX7219とまったく同じです。
SPI I/Fを使う場合の結線は以下の通りです。
赤字の部分だけがMAX7219と異なります。

このチップもMAX7219と同様に、カソードコモンの8セグメントLED専用なので、電流制限用の抵抗はまったく必要ありません。
また各LEDのON/OFFはチップ内のトランジスタが高速で行いますので、チラつきも無く非常に綺麗な表示です。
表示可能な最大桁数は8桁です。
8桁のLEDに表示するためには、桁制御用に8個、セグメント制御用に8個の合計16個のGPIOが必要になりますが
このチップを使えば3個のGPIOで済みます。
こちらもMAX7219と同様に桁数の多い8セグメントLEDを使うためには非常に便利なチップですが、国内ではあまり流通していないようです。

18番ピン(ISET)と3.3Vの間には、電流制限用の抵抗を挟んで使用します。
使用する抵抗値はデータシートを参照してください。
私は68KΩの抵抗を使いましたが、LEDにはIf=10mAぐらいが流れるはずです。

MAX7219のピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(DIN)
19(GPIO10) SPIO MOSI
2(DIG 0) Digit1 Common
3(DIG 4)

4(GND)
GND
5(DIG 6)

6(DIG 2) Digit3 Common
7(DIG 3)

8(DIF 7)

9(GND)
GND
10(DIG 5)

11(DIG 1) Digit2 Common
12(CS)
24(GPIO24) SPIO CE0
13(CLK)
23(GPIO11) SPIO SCLK
14(SEG A) Segment a
15(SEG F) Segment f
16(SEG B) Segment b
17(SEG G) Segment g
18(ISET)
68KΩの抵抗を介して3.3Vに接続
19(V+)
5V
20(SEG C) Segment c
21(SEG E) Segment e
22(SEG DP) Segment D.P
23(SEG D) Segment d
24(DOUT)


SPI I/Fを使う場合は、以下の設定が必要です。
1./etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
spidev    → 追加

2./etc/modprobe.d/raspi-blacklist.conf
# blacklist spi and i2c by default (many users don't need them)

#blacklist spi-bcm2708 → コメントアウト
blacklist i2c-bcm2708

上記設定を変更後、リブートしてください。
SPI I/Fでのソースコードは以下の通りです。

/*

 max7221.c
 
 Raspberry Pi driving the Max7221

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


*/
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>

// The Max7221 Registers :

#define DECODE_MODE   0x09                      
#define INTENSITY     0x0a                       
#define SCAN_LIMIT    0x0b                       
#define SHUTDOWN      0x0c                       
#define DISPLAY_TEST  0x0f                        

#define SPI_CHANNEL    0


// Take a reg numer and data and send to the max7221
//
// reg_number : Register Address of max7221 (0x00-0x0f See datasheet)
// dataout    : Send Data
//
static void MAX7221Send (unsigned char reg_number, unsigned char dataout)
{
  unsigned char data[2];
  int retCode;

  data[0]=reg_number;
  data[1]=dataout;

  retCode=wiringPiSPIDataRW (SPI_CHANNEL,data,sizeof(data));
}

int main (void)
{
  int i,j;
  int retCode;
  
  printf ("\n\nRaspberry Pi Max7221 Test using WiringPi\n\n");

  if (wiringPiSPISetup(SPI_CHANNEL, 1000000) < 0) {
        printf("SPISetup failed:\n");
  }

  MAX7221Send(SCAN_LIMIT, 2);     // set up to scan three digits
//  MAX7221Send(SCAN_LIMIT, 7);     // set up to scan all eight digits


/*

 BCD decode mode off : data bits correspond to the segments (A-G and DP) of the seven segment display.

 BCD mode on :  0 to 15 =  0 to 9, -, E, H, L, P, and ' '
  
*/

  MAX7221Send(DECODE_MODE, 15);   // Set BCD decode mode on
 
  MAX7221Send(DISPLAY_TEST, 0);  // Disable test mode

  MAX7221Send(SHUTDOWN, 1);      // come out of shutdown mode   / turn on the digits

  MAX7221Send(1,0);        // displays the number 0 on digit 0
  MAX7221Send(2,1);        // displays the number 1 on digit 1
  MAX7221Send(3,2);        // displays the number 2 on digit 2
  for(i=0;i<5;i++){
    MAX7221Send(INTENSITY, i);    // set brightness
  sleep(2);
  }
    
  for(i=0;i<16;i++) {        // display BCD
    for(j=0;j<3;j++) {        // display digit
      MAX7221Send(j+1,i);    // displays the 3 digit number
      sleep(1);
    }
  }

  return 0;
}

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