Arduinoと戯れてみる!

Arduino 入門 Lesson 24 【7セグメントLED編】

arduino-lesson24-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 24
【7セグメントLED編】

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

 

本記事はLesson 24 【7セグメントLED編】です。

7セグメントLEDは、数字情報の表示に特化したデジタル表示モジュール。

電光掲示板などに使われています。

身近なものでは、デジタルの時計の表示などにも使われているでしょうか。

 

7セグメントLEDを使いこなせれば、表示機器として色々遊べそうです。

 

本Lesson解説で使用しているのはArduino互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

スポンサーリンク

はじめに

7セグメントLEDはWikipediaの説明によると以下となっています。

要は、数字を表すモジュールです。

Wikipedia 7セグメントディスプレイ

7セグメントディスプレイ (seven-segment display) は、十進法のアラビア数字を、七つの画で表示する装置である。アラビア数字の一字を表現するために、それぞれ個別に点消できる七つのセグメント(画)から構成されているためこの名がある。

 

用途としては、電光掲示板として使われます。

Arduinoの場合、温度センサで温度を拾い、7セグメントLEDに表示させるといったことが考えられるでしょうか。

 

原理としては、単純で8個のLEDが組み込まれているだけ。

その8個のLEDの光る組み合わせで数字を表現しています。

 

Lesson 20にてLEDを複数制御しました。

制御そしては、ある意味同じで8個のLEDを制御して数字を表示させるだけです。

単体のLEDが7セグメントLEDに変わるという、だけの単純なものです。

 

7セグメントLED、日本製は割高です。

手持ちがなく、遊びで使う程度であれば以下などがあります。

 

Lsson 24 目標

1.「7セグメントLED」の原理を理解します。
2.「7セグメントLED」の制御方法を理解します。
3.8bitシフトレジスタの使い方を思い出す。

今回も遊ぶことを最大の目標に楽しみましょう!

 

項目3の8bitシフトレジスタに関しては、Lesson20をお読みいただく理解が深まります。

 

8bitシフトレジスタを使用したくない。

または、持っていない方。

Aruduinoのデジタル入出力ピンを8ピン使用すれば同じことができます。

ぜひ、挑戦してみてください。

コメントいただければ、サンプルコードを本記事に追加いたします!

 

準備

ではLessonの準備に取り掛かりましょう。

今回は8個のLEDを制御することから抵抗などの部品が多めです。

頑張って組み上げていきましょう。

 

必要なもの

 

7セグメントLEDですが日本のメーカー品は割高です。

最初に説明いたしましたが、上記の物は、安価で遊びで使うには十分です。

 

7セグメントLEDはアノードコモン、カソードコモンの2種類があります。

本Lessonで使用しているのは、カソードコモンを使用しています。
※本記事、原理の項目で違いを詳しく説明します。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

使用部品説明

新たに登場した部品について説明していきます。

本Lessonで新しく登場するのは、7セグメントLEDのみです。

 

7セグメントLED 実物写真

下の写真が、7セグメントLEDです。

arduino-lesson24-01

 

ちなみに、ELEGOO UNO キットには合わせて梱包されています。

7セグメントLEDはLEDですから向きがあります。
アノードコモン、カソードコモンどちらなのか確認して購入してください。
詳しくは原理の項目にて説明します。

 

上記の写真に示した7セグメントLEDは端子が上下についているものです。

端子が、左右についているものもあります。

ブレッドボードの仕様を感がると、端子が上下のものが使いやすいです。
そのため、購入する場合は、上下のものをお勧めします。

arduino-lesson24-02

 

7セグメントLED 原理

7セグメントLEDは8個のLEDが表示部にそれぞれ割り当てられているだけの単純なものです。

下図に7セグメントLEDの原理とピン配置を示します。

図に示すように、「アノードコモン」と「カソードコモン」の2種類のタイプがあります。

それぞれ、アノード(+)が共通のもの、カソード(-)が共通のものになります。

arduino-lesson24-03

 

 

管理人はコードを書くときに「カソードコモン」の方がイメージしやすいと考えます。

1.カソード(-)側をGNDで共通。
2.光らせたいLEDにデジタルピンから5Vを供給。

という使い方がイメージしやすいですよね。

電圧を与えることで、電流が流れてLEDが光るというイメージです。

 

絶対定格、順方向電圧、光度など詳細を知りたい方は、購入した7セグメントLEDの仕様書を確認ください。

仕様書がない場合、秋月電子などで確認することができます。

下記「秋月電子」TOPページのキーワード検索にて、通販コード「I-00640」で検索ください。
※あくまでも一例です。値はご自身が購入したものの仕様に従ってください。

秋月電子通商 - 電子部品・半導体 【通販・販売】
株式会社秋月電子通商(電子部品の通販、販売)のページです…

 

0から9の数字の表現方法

ピンの割付がわかっていれば0~9の表現方法はわかると思います。

わかりやすく表にしておきます。

表の数字
1:電流を流してLED点灯

0:電流を流さずLED消灯

DisplayとLEDの関係が下記表となります。

Displayabcdefg
01111110
10110000
21101101
31111001
40110011
51011011
61011111
71110010
81111111
91111011

上記の他に、右下のドット(D.P)があります。

ドッドのみ表示させたい場合は

a~gを「0」、D.Pを「1」で点灯します。

消灯は「0」となります。

 

使用する抵抗について

LEDが焼き切れないようにするため、LEDと直列につなぐ電流制限抵抗は220Ωとします。

こちらは、LEDが焼き切れない抵抗値であれば220Ωである必要はありません。

 

SN74HC595N 8bitシフトレジスタ 出力の割り当て

下の写真が、8bitシフトレジスタ「SN74HC595N」です。

Lesson 20にて詳細を説明しています。

Arduino-lesson20-01

 

端子は全部で16ピンあります。

メーカのデータシートによって端子名は異なります。

Arduino-lesson20-02

 

本記事のコードは、「SN74HC595N」の出力QA~QH7セグメントLEDに対して以下の割り当てをしました。

SN74HC595N7セグメントLED
QA(Q0)a(7)
QB(Q1)b(6)
QC(Q2)c(4)
QD(Q3)d(2)
QE(Q4)e(1)
QF(Q5)f(9)
QG(Q6)g(10)
QH(Q7)D.P(5)
GND(3,8)

QA~QHの出力が「1」となることでLEDに電流を流して7セグメントLEDを点灯させます。

()内の表記は、次に示す回路図での番号となります。

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、7セグメントLEDを動かしていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

7セグメントLEDと抵抗が直列に接続されていることで電流を制限しLEDが焼損するのを防いでいます。

回路図がこちら。

カソードコモン(GND)になっていることに注意してください。

arduino-lesson24-04

 

こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。

arduino-lesson24-05

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は7セグメントLED抵抗シフトレジスタとなります。

M-M jumper wireを使用してUNOと接続しましょう。

 

使用するポートは、デジタルピンの「9,11,12」、電源の「5V」、「GND」です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

 

arduino-lesson24-06

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

 

コマンド説明

特に新しくでてきたコマンドはありませんが、重要コマンドを復習しておきましょう。

コマンド説明
byte0から255までの8bitの数値を格納。
負の数値は扱えません。
例 変数に18(10進数)を代入。
byte value = B10010;
※Bは2進数を表しています。
shiftOut(dataPin, clockPin, bitOrder, value)1バイト分のデータを1ビットずつ「シフトアウト」する。
最上位ビット(MSB)と最下位ビット(LSB)のどちらからもスタート可能。
各ビットはまずdataPinに出力され、その後clockPinが反転して、そのビットが有効になったことが示されます。
dataPin:各ビットを出力するピン
clockPin:
クロックを出力するピン。
dataPinに正しい値がセットされたら、このピンが1回反転します
bitOrder:
MSBFIRSTまたはLSBFIRSTを指定。
Most Significant Bit Firstは最上位ビットから送ること、Least Significant Bit Firstは最下位ビットから送ることを示す。
value:送信したいデータ (byte)
戻り値:なし

 

shiftOut関数を理解すると、何かと便利です。

理解しておくことをお勧めします。

 

サンプルコード

サンプルコードを下記に示します。

2020.04.04 誤記修正
誤記がありましたのでスケッチを修正いたしました。
修正前
shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[12]); //全てのLEDを消灯
修正後
shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[11]); //全てのLEDを消灯

 

//Lesson 24 7セグメントLED 0~9とD.Pを表示
//https://omoroya.com/


// 74HC595 pin        QA,QB,QC,QD,QE,QF,QG,QH 
// 7segment Mapping   a, b, c, d, e, f, g ,D.P

int tDelay = 500;   // 500ms遅延設定
int rclkPin = 11;   // (11) ST_CP [RCLK] on 74HC595
int srclkPin = 9;   // (9)  SH_CP [SRCLK] on 74HC595
int dsPin = 12;     // (12) DS [SER] on 74HC595

// seven_ledsをbyte型として定義
// 配列にDisplay表示用のデータ0~9と全消灯を設定
// 1 = LED on, 0 = LED off
byte seven_leds[12] =       { B11111100,  // 0
                              B01100000,  // 1
                              B11011010,  // 2
                              B11110010,  // 3
                              B01100110,  // 4
                              B10110110,  // 5
                              B10111110,  // 6
                              B11100000,  // 7
                              B11111110,  // 8
                              B11100110,  // 9
                              B00000001,  // D.P 
                              B00000000,  // OFF
                             };
void setup() 
{
  pinMode(rclkPin, OUTPUT);   //11番ピンをOUTPUTとして定義
  pinMode(dsPin, OUTPUT);     //12番ピンをOUTPUTとして定義
  pinMode(srclkPin, OUTPUT);  //9番ピンをOUTPUTとして定義
}

void loop() 
{
  // 7セグメントLEDを消灯
  digitalWrite(rclkPin, LOW);                          //送信中のRCLKをLowにする
  shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[11]); //全てのLEDを消灯
  digitalWrite(rclkPin, HIGH);                         //送信終了後RCLKをHighにする
  
  delay(tDelay);
  
  // 7セグメントLEDに0~9とD.Pを順番に点灯する。
  for (int i = 0; i < 11; i++)
  {
    
    digitalWrite(rclkPin, LOW);                         //送信中のRCLKをLowにする
    shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[i]); //シフト演算を使って点灯するLEDを選択
    digitalWrite(rclkPin, HIGH);                        //送信終了後RCLKをHighにする
    
    delay(tDelay);
  }
}

 

動作確認

では、さっそく動作を確認していきます。

​今回は、gifで動作を掲載してみました。
※サイズを絞るために、画像サイズで小さくしています。

もう少し、大きめが良いでしょうか?コメントいただければ変更します。

 

ちなみに、電源はモバイルバッテリーを使用してみました。

 

0~9と最後に右下のD.Pが点灯すれば成功です。

 

まとめ

今回は以下の内容について理解してもらいました。

今回も項目4の遊ぶことが一番の目標でした。

1.「7セグメントLED」の原理を理解します。
2.「7セグメントLED」の制御方法を理解します。
3.  8bitシフトレジスタの使い方を思い出す。
4.  楽しんで遊ぶ。

 

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

Lesson 24 【7セグメントLED編】 はここまで。

7セグメントLED、色々と応用して遊べそうです。

ぜひ、遊んでみてください。

 

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson 25は【4桁7セグメントLED】 です。

本記事は1桁でした、次回は4桁制御に挑戦です。

お楽しみに。

Arduino 入門 Lesson 25 【4桁7セグメントLED編】
4桁7セグメントLEDは、1桁7セグメントLED4つを一つのモジュールにした電子部品です。基本的な原理は1桁7セグメントLEDと同じです。各桁に個別の値を表示させるためにはダイナミック点灯方式を採用する必要があります。本記事でダイナミック点…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

  1. arduino初心者 より:

    // 7セグメントLEDを消灯
    digitalWrite(rclkPin, LOW); //送信中のRCLKをLowにする
    shiftOut(dsPin, srclkPin, LSBFIRST, seven_leds[12]); //全てのLEDを消灯
    digitalWrite(rclkPin, HIGH); //送信終了後RCLKをHighにする

    のところなのですが、配列seven_leds[12]は要素数が12であって、
    全てのLEDを消灯、ならseven_leds[11] = B00000000が適切なのではないかと思ったのですが、どうでしょうか?

    • omoroyaomoroya より:

      コメントありがとうございます!
      その通りです。
      seven_ldes[12]は誤記です。
      seven_leds[11] が正しいです。
      12だと変な値が返ることになります・・・。
      修正しておきました。
      また、何か気づいたことがあればご指摘いただけると助かります。
      よろしくお願いいたします。

  2. カレーライス より:

    Arduino入門LESSONのHP更新ありがとうございます。
    いつも見させて頂いております。
    Arduinoを用いた、、というよりもこのような電子工作、電子に関する知識が
    全く無知の状態から勉強させていただいていますが分かりやすく助かっております。
    ELEGOOスターターキットを購入したのですが付属のマニュアルは非常に分かりにくく
    中身についての詳しい説明がありません。
    OMOROYAさんのHPには自分の知りたい情報がたくさん載っていてありがたく
    思っております。
    今後ともよろしくお願い致します。

    • omoroyaomoroya より:

      コメントありがとうございます。
      更新のはげみになります。
      これからも電子部品も含めてできるだけ
      詳しい情報を掲載していきたいと思います。

  3. omoroyaomoroya より:

    「7セグメントLED」原理が分かれば使いこなすのは簡単。色々と遊べます。

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