このブログは、サーバー代など、運営費のため広告やアフェリエイトがあります。
大変申し訳ありませんが、ご理解よろしくお願いします。

このブログは、サーバー代など、運営費のため広告やアフェリエイトがあります。
大変申し訳ありませんが、ご理解よろしくお願いします。

7セグメントLEDをレジスタ操作でArduinoMegaで使う

電子工作
スポンサーリンク

今回は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つつかってカウンタを作ってみようと思います。

参考になったら、コーヒー1杯奢ってくれるとうれしいです
Buy Me A Coffee
電子工作
スポンサーリンク
シェアする
denshi1996をフォローする
スポンサーリンク

コメント

タイトルとURLをコピーしました