今回はArduinoMegaで7セグメントLEDを使ってみようと思います。
なぜArduinoMegaなのか それはピン数が多く、プログラムしやすいからです。
(実は今別の用途でArduinoUnoを使ってしまっているので使えないという事もあります)

上のよう外装です。エレベーターなどでも使われています。(サイズはもっと大きいですが)
・配線

上のように配線します。
ABCDEFG DP は配列的に配線した方が後のプログラムが楽になります。
ArduinoMegaで使う場合は22 ~29ピンを使った方が後々に楽になります。
ArduinoUnoで配線する場合は0~7ピンを使用した方が良いです。
なぜ抵抗が必要になるのかというと、7セグメントLEDの中身は普通のLEDだからです。
抵抗値は適当に1kΩで良いでしょう。
ただしイルミネーション目的にするならしっかりと計算して使いましょう。


・なぜ上のようなピン番号にするのか
本来マイコンというモノはポートレジスタと言う物がありこのポートレジスタを操作するといわゆるdigitalWriteができるのです。
ArduinoMegaの22~29ピンはポートレジスタがPORTAとなります。
ArduinoUnoの場合0~7ピンはPORTDになります。
このPORT○を操作することで簡単に光らせる事ができます。
なので調べて別のピンを使用してもかまいません。
ArduinoUnoの場合一応PORTBも存在しますが、PORTBの6・7ピンは別の用途に割り当てられているらしく使用できません。
ArduinoMegaはいろんなポートレジスタがあるので調べて見てください。
・プログラム
実は回路図のところにABCDEFG DPと書いてあるのが分かりますか?
それは次のような配列になっていることが多いです。

例えばAの部分をONにすればAが点灯
のようになっています。
そのため例えば1を表示したい場合はBとCをつければよいことになります。
void setup() {
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
}
void loop() {
//'1'を表示させる
digitalWrite(22,LOW);
digitalWrite(23,HIGH);
digitalWrite(24,HIGH);
digitalWrite(25,LOW);
digitalWrite(26,LOW);
digitalWrite(27,LOW);
digitalWrite(28,LOW);
digitalWrite(29,LOW);
}しかし1や2などを表示させるためだけにこんなことをしていたら非常に面倒です。
そこで先ほど説明したポートレジスタを使うのです。
void setup() {
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
}
void loop() {
//'1'を表示させる
PORTA = 0x06; //0b00000110でもOK
}0xというのは16進数を表しています。
0bというのは2進数を表しています。
先ほどのdigitalWriteを使うときよりも分かりやすくなったことが分かるでしょうか。
では次に1~9まで順番につけてみたいと思います。
void setup() {
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
}
void loop() {
PORTA = 0x06; //'1'を表示する
delay(500);
PORTA = 0x5b; //'2'を表示する
delay(500);
PORTA = 0x4f; //'3'を表示する
delay(500);
PORTA = 0x66; //'4'を表示する
delay(500);
PORTA = 0x6d; //'5'を表示する
delay(500);
PORTA = 0x7d; //'6'を表示する
delay(500);
PORTA = 0x27; //'7'を表示する
delay(500);
PORTA = 0x7f; //'8'を表示する
delay(500);
PORTA = 0x6f; //'9'を表示する
delay(500);
}しかしこれはこれで不便です。
例えば4を表示した後に6を表示したい場合、いちいち16進数を覚えるかなんか見ないといけません。4は0x66 6は0x7dなんて覚えている人はいないと思います。
そこでこれらの数字を変数にいれてしまうととっても簡単に作ることができます。
const byte SEG[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f};
//constをつけることで定数として宣言できる
void setup() {
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
}
void loop() {
for (int i = 1; i <= 9; i++)
{
PORTA = SEG[i];
delay(500);
}
}なんとfor文も使用できてとってもすっきりします。
今回のプログラムではSEG[i]のiの中に表示したい数字を入れる事で簡単に表示することができます。
次回は7セグメントLEDを2つつかってカウンタを作ってみようと思います。


コメント