検索コード

レッスン22/31:Arduinoと電子サイコロで7セグメントディスプレイを使う | SunFounder Robojax

レッスン22/31:Arduinoと電子サイコロで7セグメントディスプレイを使う | SunFounder Robojax

このレッスンでは、Arduinoを使って7セグメントディスプレイを制御する方法を探ります。各LEDセグメントを直接駆動するために12個以上のI/Oピンを使う代わりに、巧妙なトリックを使用します:シフトレジスタです。この小さくて安価なチップを使うと、Arduinoからのわずか3本のワイヤで7つのセグメントすべて(小数点を含む)を制御できます。これはエレクトロニクスにおける基礎的な技術であり、マイクロコントローラで利用可能な出力数を拡張できるため、ボードをアップグレードせずにより複雑なプロジェクトを構築することが可能になります。

ビデオからのブレッドボード上の配線

基本的なカウンタに加えて、電子サイコロも作ります。このプロジェクトはディスプレイ制御を強化するだけでなく、押しボタンによるユーザー入力と割り込みの概念を導入し、応答性が高くインタラクティブなデバイスを作り出します。このガイドは、SunFounder 3-in-1 Arduinoキットを使用するRobojax Arduinoコースのレッスンに基づいています。

この知識を使って構築できる実用的なアイデアをいくつか紹介します:

  • 卓球やバスケットボールなどのゲーム用の簡単なスコアボードを作成する。
  • ボードゲーム用のデジタルタイマーやキッチン用カウントダウンタイマーを構築する。
  • ゲームや意思決定用の乱数ジェネレータを作る。
  • 温度センサーを追加して基本的なデジタル温度計を構築する。

ハードウェアとコンポーネント

始める前に、必要なコンポーネントを集めましょう。このプロジェクトの核心は74HC595シフトレジスタであり、必要なピン数を最小限に抑えるための鍵です。7つのセグメントそれぞれをArduinoに直接接続する代わりに、シフトレジスタに接続します。Arduinoは数字のデータをシリアル(1ビットずつ)でチップに送信し、チップはセグメントを点灯させるための正しいパターンを出力します。

  • Arduino Uno(または互換ボード)
  • 7セグメントディスプレイ(モデル5161AS、カソードコモン)
  • 74HC595シフトレジスタIC
  • 押しボタン
  • 抵抗(220Ω - 330Ω)
  • ジャンパーワイヤ
  • ブレッドボード

5161ASディスプレイはカソードコモンタイプです。これは、内部LEDのすべてのカソード(マイナス側)が共通のグランドピンに接続されていることを意味します。セグメントを点灯させるには、その特定のアノードピンに正の電圧を供給します。74HC595はブリッジとして機能し、Arduinoからシリアルデータを受け取り、これらのアノードを駆動するために必要なパラレル信号を出力します。

配線ガイド

回路_6.5_セグメント_回路図
セグメント配線_sundounder_3-in-1-kit

シフトレジスタとディスプレイの配線は難しいように思えるかもしれませんが、図を段階的に追うことが重要です。ビデオ(04:48)では、このプロセスの詳細な説明が提供されています。74HC595チップには、ピン1を識別するための切り欠きが一端にあります。ピンは切り欠きから反時計回りに番号が付けられています(片側に1〜8、反対側に9〜16)。

ビデオからの配線の概要は次のとおりです:

  • 電源とグランド:74HC595のピン8とピン13をグランドレールに接続します。ピン10とピン16を5Vレールに接続します。
  • データライン:Arduinoのデジタルピンをシフトレジスタのデータピンに接続します:ピン12(STcp)をチップのピン12に、ピン8(SHcp)をチップのピン11に、ピン11(DS)をチップのピン14に接続します。
  • ディスプレイからシフトレジスタへ:これが最も複雑な部分です。ビデオ(07:18)では各接続について詳しく説明しています。例えば、ディスプレイのセグメント'a'はチップのピン6に接続し、セグメント'b'はピン5に接続します。ディスプレイのカソードコモンピンは抵抗を介してグランドに接続されます。

視覚的で正確なガイドについては、公式の配線図を参照してください:

正確なピン接続は重要であり、間違いを犯しやすいです。時間をかけて、各ワイヤを図と照合してください。ビデオは一緒に進めるための優れたリソースです。

サイコロ

コードの説明

このレッスンでは2つのコード例が提供されています。1つ目は簡単なカウンタで、2つ目はそれを基に電子サイコロを作成します。どちらもディスプレイを制御するための同じ中核ロジックを共有しています。

基本的なカウンタのコードは次のとおりです:

const int STcp = 12;//74HC595のST_CPに接続されたピン
const int SHcp = 8;//74HC595のSH_CPに接続されたピン 
const int DS = 11; //74HC595のDSに接続されたピン 

int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

コードの先頭で、シフトレジスタに接続された3つのピンを設定できます。STcpSHcp、およびDSはそれぞれArduinoのピン12、8、11に割り当てられています。datArray[]は重要な部分です。これは数字0から9までの16進数値を含むルックアップテーブルです。各値は、その特定の数字に対して点灯するセグメントのパターンを表します。

loop()関数はカウンターを実行します。0から9まで数えるためにforループを使用します。ループ内では、現在の数値のデータをシフトレジスタに送信します。最後のdelay(1000)は、カウンターの速度をミリ秒単位で設定します。この値を100に変更すると速くカウントし、500に変更すると遅くなります。

電子サイコロのコードでは、ボタンによるユーザー入力という新しい要素が導入されます。主な設定変更は以下の通りです。

const int buttonPin = 2;
//...
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);

ここで、buttonPinはデジタルピン2に設定されています。このピンは割り込みとして使用できるため特別です。割り込みにより、ボタンが押されたときにArduinoが即座に現在の処理を停止し、高速で信頼性の高い応答を確保できます。FALLINGモードは、ボタンが押されたとき(信号がHIGHからLOWに変化するとき)に割り込みをトリガーします。

rollDice関数は割り込みによって呼び出されます。この関数はstate変数を0と1の間で切り替えます。stateが0のとき、サイコロは「回転中」であり、メインのloop()がランダムに数字を表示します。ボタンが再度押されると、stateが1に変わり、ループが停止して最終結果が表示されます。showNumber()関数はカウンターのロジックと同じですが、表示する数値を引数として受け取ります。

ライブプロジェクトとデモンストレーション

コードがアップロードされると、カウンターが起動し、1秒間隔で0から9までの数字を表示します(ビデオの15:04時点)。ビデオでは、遅延を変更してカウンターをより速く動作させる方法が示されています。

電子サイコロのデモンストレーション(ビデオの20:15時点)では、ボタンの動作が示されています。一度押すと、表示が数字を高速で循環し始めます。もう一度押すと循環が停止し、実際のサイコロのように1から6の間のランダムな数字が表示されたままになります。

チャプター

  • [00:00] 7セグメントディスプレイプロジェクトの紹介
  • [01:25] 7セグメントディスプレイの理解
  • [03:51] 5161ASディスプレイのデータシートと仕様
  • [04:48] ディスプレイとシフトレジスタの配線
  • [12:24] 0〜9カウンター用のArduinoコード
  • [15:04] カウンターのデモンストレーションと速度調整
  • [16:27] 電子サイコロプロジェクトの構築
  • [20:15] 電子サイコロのデモンストレーションとデバウンス

画像

Wiring on breadboard from video
Wiring on breadboard from video
Circuit 6.5 segment schematic
Circuit 6.5 segment schematic
Dice
Dice
Segment wiring for Sunfounder 3-in-1 kit
Segment wiring for Sunfounder 3-in-1 kit
Segments of segment display
Segments of segment display
Seven segment pins - common cathode
Seven segment pins - common cathode
Seven segment pins - DP decimal pin
Seven segment pins - DP decimal pin
Seven segment pins - common cathode
Seven segment pins - common cathode
902-Lesson 23/31: Arduino code Using Seven Segment Display
言語: C++
/*
Lesson 23/31: Using Seven Segment Display 
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc

*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595 
const int DS = 11; //Pin connected to DS of 74HC595 

int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void setup ()
{
  //set pins to output
  pinMode(STcp,OUTPUT);
  pinMode(SHcp,OUTPUT);
  pinMode(DS,OUTPUT);
}
void loop()
{
  for(int num = 0; num <10; num++)
  {
    digitalWrite(STcp,LOW); //ground ST_CP and hold low for as long as you are transmitting
    shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
    digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data
    delay(1000);
  }
}
903-Lesson 23/31: Electronic dice
言語: C++
/*
Lesson 23/31: Electronic Dice
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc

*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595
const int DS = 11; //Pin connected to DS of 74HC595
const int buttonPin = 2;
int datArray[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,  0x6f};
int number = 0;
int state = 0;

void setup ()
{
  //set pins to output
  pinMode(STcp, OUTPUT);
  pinMode(SHcp, OUTPUT);
  pinMode(DS, OUTPUT);
  pinMode(buttonPin, INPUT);

  attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);
}

void loop()
{
  if (state == 0) {
    showNumber((int)random(1, 7));
    delay(50);
  }
}

void showNumber(int num) {
  digitalWrite(STcp, LOW); //ground ST_CP and hold low for as long as you are transmitting
  shiftOut(DS, SHcp, MSBFIRST, datArray[num]);
  //return the latch pin high to signal chip that it
  //no longer needs to listen for information
  digitalWrite(STcp, HIGH); //pull the ST_CPST_CP to save the data
}


void rollDice() {
  state = !state;
}

リソースと参考文献

ファイル📁

Arduinoライブラリ(zip)