見出し画像

7セグメントLEDで電子サイコロを作る #12 【Arduino UNO R4】

今回は、7セグメントLEDの使い方についてご紹介します。

7セグメントLEDは、デジタルの0~9の数字を表現できるLEDディスプレイです。

本稿ではその基本的な使い方と、応用例としてArduinoを使った電子サイコロの作り方を解説します。

ぜひ一緒にやってみましょう!


はじめに

この記事では、Arduinoで7セグメントLEDを使う方法と、その応用例について簡単にご紹介しています。

下記の注意事項をお読みいただいた上で、ぜひお楽しみください。

【 注意 】
当Webサイトに掲載された内容によって生じた損害等の一切の責任を負いません。また生じた問題についてはご自身の責任において解決いただくことをあらかじめご承知おきください。詳しくは下記URLの免責事項をご確認願います。当サイトの免責事項に同意いただける場合に限り、当サイトの内容をご利用いただけます

https://note.com/shingo_shirogane/n/n3d5686bf512b

Youtube動画

YouTubeでは、7セグメントLEDの使い方を分かりやすく解説しています。
4分ほどの動画なので、サクッとご覧いただけます。

必要なもの

1. マイコンボード

本記事では、Arduino UNO R4 Wi-Fiを使います。

2. 電子部品

以下の電子部品を使います。

  • 7セグメントLED(C-551SRD)× 1

  • タクトスイッチ × 1

  • 抵抗(10kΩ)× 8

  • ジャンパーワイヤー 適量

7セグメントLEDとは?

7セグメントLEDは、LEDを使ったデジタル数字の表示器です。

各セグメントにLEDが入っていて、セグメントの組み合わせによってデジタルの数字を表現します。

回路図はとてもシンプルです。今回使う7セグメントLEDはカソードコモンなので、全てのLEDのカソードが3ピンまたは8ピンに集約されています。

7セグメントLEDの端子と各セグメントの対応関係は図の通りです。

データシートはかなり省略されて書かれているので、参考にあれば幸いです。

LED用の抵抗の決め方

LEDを使う際は、定格電流より小さい電流を流すために、必ず抵抗とセットで使います。

LED用の抵抗値の計算方法については、👇下記に詳しくまとめてありますので、ぜひご覧ください。

Arduino UNO R4では、各IOポートからは8mAしか電流を流すことができません。余裕を見て、この定格電流の半分の4mA以下になるように抵抗値を決め、電流を調整しましょう。

データシートより引用

ただし、4mAも流さなくてもLEDは十分に光ってくれます。(流しすぎなくらいかも)

本稿では10kΩの抵抗を採用しています。この時流れる電流の計算結果は下記の通りです。目安程度に参考にしてください。

7セグを制御する回路

回路図

👆が今回作る回路図です。7セグメントLEDのピンを間違えないように気を付けてください。

また、各セグメントがArduinoのどのピンにつながっているかをメモしておくとプログラミングが格段にやりやすくなります。

本稿の例だと、👆の図のようになります。

配線の様子

小さいブレッドボードを使ったので、少し無理をした配線になっています。みなさんはもう少し大きいブレッドボードを使ってみてください。

プログラミング

前回の電子サイコロと同じプログラムです。

プログラムは前回ご紹介した電子サイコロとほとんど同じです。詳しい解説は、前回の記事を参照してください。(YouTubeでも解説してます。)

👇が電子サイコロのプログラムです。注意事項をよくお読みになってから、使用ください。

//当Webサイトに掲載された内容によって生じた損害等の一切の責任を負いません。
//当webサイトの免責事項に同意いただける場合に限り、プログラムをご利用いただけます。

//セグメントとArduinoのピンの対応関係
#define SEG_A 7
#define SEG_B 8
#define SEG_C 3
#define SEG_D 2
#define SEG_E 1
#define SEG_F 6
#define SEG_G 5
#define SEG_DP 4

//スイッチのピン
#define SW_PIN 13

int sw_state = 0;   //スイッチが押されたことを記憶する変数
int ran_num = 1;    //乱数を保存する変数

void setup() {
  //入力設定
  pinMode(SW_PIN, INPUT_PULLUP);

  //出力設定
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
  pinMode(SEG_DP, OUTPUT);
}

void loop() {

  //SWが押されるまでランダムに出目を表示し続ける
  while(sw_state == 0){
    ran_num = random(1,7);  //ランダムに1~6の出目を生成

    ledOff();               //LEDをすべて消灯
    ledOn(ran_num);         //出目に応じたLEDを点灯

    //SWが押されたら、状態を移行する(ループを抜ける)
    if(digitalRead(SW_PIN)==LOW){
      sw_state = 1; //状態を移行
      delay(200);
    }
  }

  //SWが押されるまで決まった出目を表示し続ける
  while(sw_state == 1){
    ledOn(ran_num);         //出目に応じたLEDを点灯
    
    //SWが押されたら、状態を移行する(ループを抜ける)
    if(digitalRead(SW_PIN)==LOW){
      sw_state = 0; //状態を移行
      delay(200);
    }
  }
}

//渡された出目に対応するセグメントをONにする関数
void ledOn(int led_num){
  switch(led_num){
    case 1:
      digitalWrite( SEG_B, HIGH );
      digitalWrite( SEG_C, HIGH );
      break;
    case 2:
      digitalWrite( SEG_A, HIGH );
      digitalWrite( SEG_B, HIGH );
      digitalWrite( SEG_D, HIGH );
      digitalWrite( SEG_E, HIGH );
      digitalWrite( SEG_G, HIGH );
      break;
    case 3:
      digitalWrite( SEG_A, HIGH );
      digitalWrite( SEG_B, HIGH );
      digitalWrite( SEG_C, HIGH );
      digitalWrite( SEG_D, HIGH );
      digitalWrite( SEG_G, HIGH );
      break;
    case 4:
      digitalWrite( SEG_B, HIGH );
      digitalWrite( SEG_C, HIGH );
      digitalWrite( SEG_F, HIGH );
      digitalWrite( SEG_G, HIGH );
      break;     
    case 5:
      digitalWrite( SEG_A, HIGH );
      digitalWrite( SEG_C, HIGH );
      digitalWrite( SEG_D, HIGH );
      digitalWrite( SEG_F, HIGH );
      digitalWrite( SEG_G, HIGH );
      break;  
    case 6:
      digitalWrite( SEG_A, HIGH );
      digitalWrite( SEG_C, HIGH );
      digitalWrite( SEG_D, HIGH );
      digitalWrite( SEG_E, HIGH );
      digitalWrite( SEG_F, HIGH );
      digitalWrite( SEG_G, HIGH );
      break;      
    }
    delay(10);
}

//ledをOFFにする関数
void ledOff(){
  digitalWrite( SEG_A, LOW );
  digitalWrite( SEG_B, LOW );
  digitalWrite( SEG_C, LOW );
  digitalWrite( SEG_D, LOW );
  digitalWrite( SEG_E, LOW );
  digitalWrite( SEG_F, LOW );
  digitalWrite( SEG_G, LOW );
  digitalWrite( SEG_DP, LOW );
  
}

プログラムの書き込み

プログラムが完成したらArduinoをパソコンとつなぎ、Arduino IDEの画面左上の検証(✓マーク)をクリックします。

問題がなければ書き込み(→マーク)を行います。

書き込みが終わり、上手く回路とプログラムが作れていれば、数字がランダムに表示され、スイッチを押すと出目が決まり、固定で表示されます。

ここまでお疲れさまでした!

おわりに

いかがだったでしょうか。

今回は、Arduino UNO R4を使った7セグメントLEDの電子サイコロについてご紹介しました。

もしこの記事がお役に立てたら、"スキ"や"サポート"をいただけると励みになります!

最後まで読んでいただき、ありがとうございました。

今後ともお役に立てるような記事を発信していきます!よろしければサポートいただけると嬉しいです!