7セグLED表示 その1 1文字
Arduinoで温度を測定したらキャラクタ表示LCDを利用して測定結果を表示しました。液晶表示器自体は暗いです。バックライト付きやOLEDであれば、表示文字は鮮明になります。時計や温度、電圧を表示するだけなら、数値だけでも十分です。7セグメントLEDという表示器があります。赤色、黄色、青色など明るい発色なので、遠くからも視認性がよいです。
●7segLEDのピンは10本
省略して7セグといいます。小数点を含めて表示するために10本のピンが出ています。
内部にはLEDが一つのセグメントに1個が割り当てられているので、接続は次のようになっています。
これらの図はカソード・コモン、つまりアノードは個別で、カソードが集約されています。アノード・コモンの7セグもあります。大きめの形状だと、1セグメントにLEDが2個以上使われている製品もあります。
'1'を表示したいとbとcのLEDをONします。それぞれのピンをArduinoから配線するのは大変です。キャラクタ表示LCDも当初はパラレル接続でしたが、現在はシリアルのI2Cが主流です。ここでも、シリアル-パラレル変換IC 74HC595を利用します。それでも配線は大変なので、74HC595、電流制限抵抗、7セグLEDを一体化できるキットを利用します。写真は、7セグLEDを別途購入するタイプのキットです。どちらを購入しても同じに動きます。
●接続
Arduinoのピン番号と機能 | 7セグメントLEDのピン名称 |
---|---|
5V | VDD |
11 MOSI | SDI |
13 CLK | SCK |
10 SS | LATCH |
GND | GND |
●スケッチ
74HC595のデータシートに書かれているタイムチャートをじっくり眺めると、SPIのシリアル通信と同じようなタイミングだと気が付きます。ArduinoのSPIライブラリでは、チップ・セレクトSS信号は独自なピンに割り当てて制御します。通常、通信を始めるときにHIGH->LOWにし、必要なデータを送り終えたらHIGHに戻します。出力データのMOSIとクロックSCKはライブラリの既定のポートです。ライブラリを使うと、データを送った SPI.transfer()とき、同時にクロックも送られます。
moji[16]の配列は、7セグのセグメントのON/OFFをビットで表した16文字分です。最下位ビットはセグメントのaで、最上位ビットはドット(dp)です。loop()では、1~Fまでの16進の表示を順番に行い、もう一度同じ文字をドットとともに表示します。
#include <SPI.h>
#define SS 10 // Chip Select
#define MOSI 11
#define SCK 13
char moji[16]{
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01100111, // 9
B01011111, // a
B01111100, // b
B01011000, // c
B01011110, // d
B01111001, // e
B01110001 // f
};
void setup() {
pinMode(SS,OUTPUT); digitalWrite(SS,1);
Serial.begin (9600);
SPI.begin();
}
void loop() {
for (int i=0; i <16; i++){
digitalWrite(SS,0);
SPI.transfer(moji[i]);
digitalWrite(SS,1);
delay(1000);
}
for (int i=0; i <16; i++){
digitalWrite(SS,0);
SPI.transfer(moji[i] | B10000000);
digitalWrite(SS,1);
delay(1000);
}
}