6-1 : 7セグメントLEDについて
目次
1.この章で使用するもの 2.7セグメントLEDについて 3.7セグメントLEDの使用方法 4.数字を表示させるプログラム 5.7セグメントLEDの配線図
6.ボタンを押した回数を表示するプログラム 7.7セグメントLEDの配線図②
この章の目的
本キットでは、最終目標である距離計を作る過程で、その製作に必要な各種電子部品の 制御方法を学び、電子工作には欠かせないセンサーへの知識を養うことと
プログラミングスキルを向上させることを目的としています。
距離計を作る際には、対象物との距離を測定し、測定した距離を数値として 出力し、外部から見える形にしなければなりません。
まずこの章では、数字を表示させるための「7セグメントLED」について解説します。
1.この章で使用するもの
Arduino Uno R3 本体
1個USBケーブル 1本
7セグメントLED 1個
タクトスイッチ 1個
ブレッドボード 1個
ジャンパーピン(オス-オス) 13本
1kΩ抵抗 1個
2.7セグメントLEDについて
数字等簡単な記号を表示するための部品として代表的なものが「7セグメントLED」です。
エレベーターの階数表示や、デジタル時計の表示板として使用されているのを 見たことはないでしょうか。
セグメントとは、英語で「分割された」等の意味を持ちます。
言葉の意味そのままに、7セグメントLEDは「7つに分割されたLED」という意味です。
実物を見てもらうとわかると思いますが、7つ直線に分かれていると思います。
※ドットも1つありますが、そこは名前には関連していません・・・
これらを1箇所ずつ点灯させるかどうかを制御することで、数字を表示します。
7セグメントLEDには「アノードコモン」、「カソードコモン」の2種類がありますが 当キットではカソードコモンを使用するため、ここからはカソードコモンの
7セグメントLEDについて解説していきます。
3.7セグメントLEDの使用方法
では、ここからはカソードコモンの7セグメントLEDの使用方法について説明していきます。
ちなみに、カソード(GNDと接続する端子)がコモン(共通)という意味です。
まずは下の模式図をご覧下さい。
この模式図は、各端子とセグメントの関係を表しています。
端子”a”にArduinoから5Vを送ると、7セグメントLEDの”a”が光ります。
GNDは2箇所端子がありますが、どちらか一方をつなげれば問題ありません。
例として、数字の”1”を表示させたい場合には・・・
”a”と”f”の端子に電流を流すと7セグメントLEDの”a”と”f”の箇所が発光し
”1”を表示することができます。
端子”e”に接続している丸はDP(デシマルポインタ)と言い、小数点を表すのに使います。
では次に、7セグメントLEDに数字を表示させるプログラムを紹介します。
b a d c
f e h g GND
GND
b a c
d
e g f
h
4.数字を表示させるプログラム
では実際にArduinoを使って数字を表示してみましょう。
使用するプログラムは、サンプルプログラムの中の”SegmentLed”です。
これは、7セグメントLEDに2を表示するプログラムです。
では、次ページからこのプログラムの説明を行います。
①
②
③
① #define TERMINAL_A 3 #define TERMINAL_B 4 #define TERMINAL_C 5 #define TERMINAL_D 6 #define TERMINAL_F 7 #define TERMINAL_G 8 #define TERMINAL_H 9
7セグメントLEDに接続する端子を定義しています。
それぞれ上の略図で紹介したa~hの端子に対応しています。
② pinMode(TERMINAL_A, OUTPUT);
pinMode(TERMINAL_B, OUTPUT);
pinMode(TERMINAL_C, OUTPUT);
pinMode(TERMINAL_D, OUTPUT);
pinMode(TERMINAL_F, OUTPUT);
pinMode(TERMINAL_G, OUTPUT);
pinMode(TERMINAL_H, OUTPUT);
7セグメントLEDに接続しているピンをアウトプットに設定しています。
③ digitalWrite(TERMINAL_A, HIGH);
digitalWrite(TERMINAL_B, HIGH);
digitalWrite(TERMINAL_C, LOW);
digitalWrite(TERMINAL_D, HIGH);
digitalWrite(TERMINAL_F, LOW);
digitalWrite(TERMINAL_G, HIGH);
digitalWrite(TERMINAL_H, HIGH);
コメントにもあるように、7セグメントLEDに”2”を出力するための処理です。
どういう理屈で2を表示しているのか、先ほどの略図を使って説明します。
このプログラムでは、端子A,B,D,G,HにHIGHを出力し、端子C,FにLOWを出力しています。
HIGHを出力するということは、5Vの電流を流し、LOWを出力するということは 電流を流さないという意味です
その結果、7セグメントLEDは下の図のようになり、2が表示されるという仕組みです。
他の数字を表示したい場合はHIGH,LOWのピンの組み合わせを変えれば表示できます。
それでは、次のページにこのプログラムで使用する接続図を紹介します。
b a c
d
e f g
h
5.7セグメントLEDの配線図
Arduinoの2~9番ピンを、7セグメントLEDの端子のa~h端子に接続しています。
※e端子には接続していません。
7セグメントLEDのCOM端子は、ArduinoのGNDに接続しています。
今紹介したプログラムは、同じ数字を表示することしか出来ませんでした。
実際は、表示できる数字が固定のものなんてありえませんよね?
ということで次は、ボタンを押した回数を表示させるプログラムを作っていきましょう。
6.ボタンを押した回数を表示するプログラム
タクトスイッチを使ってボタンが押された回数を表示するプログラムを作成します。
プログラムは、サンプルプログラムの中にある”SegmentLed_Count”です。
①
②
③
④
④
④
随分と⾧いプログラムになってしまいました。
次ページ以降に、4節から変更した箇所について説明を行います。
⑤
⑥
⑦
⑧
⑨
⑩
⑪
① #define TACT_SW 10
10番ピンをタクトスイッチに接続しています。
② byte counter = 0;
byte state = 0;
byte state_old = 0;
byte型の変数を定義しています。 ,
byte型というのはArduinoで使用できる1バイトの型です。
負の値を使用しない1バイト型であれば、byte型を使用するのをおすすめします。
③ void led_output(byte num) { これは、関数を定義しています。
関数とは、何かの処理をひとまとめにしたものです。
この”led_output”関数では、7セグメントLEDに数字を表示させる処理を行わせています。
関数を使用する場合、例えばloop()関数内で”led_output(counter)”という風に 書くことでこの関数を使用できます。この使い方の場合、変数counterの値が led_output関数の引数numに格納され処理が行われます。
これを関数コールといいます。
何度も使われる処理をひとかたまりにして使用することで、コードの行数を減らし
コードを読みやすくなる、コーディングミスを減らすことができるという効果があります。
④ switch(num) { case 0: // 0を表示
digitalWrite(TERMINAL_A, HIGH);
digitalWrite(TERMINAL_B, HIGH);
digitalWrite(TERMINAL_C, HIGH);
digitalWrite(TERMINAL_D, LOW);
digitalWrite(TERMINAL_F, HIGH);
digitalWrite(TERMINAL_G, HIGH);
digitalWrite(TERMINAL_H, HIGH);
break;
これは、switch case文というC言語の文法です。
switch(値) {
case 0: (処理内容) break;
case 1: (処理内容) break;
default : (処理内容) break;
}
といった風に記述します。
switch(値)の中の”値”と一致するcaseの処理を実行します。処理内容はcaseからbreakまでです。
引数として与えられたnumの値を見て、numが0であれば0を表示する処理を行います。
最後のdefaultは、どのcaseの値とも一致しない値が来た時に行われます。
この処理は、引数によって与えられた値によって、7セグメントLEDに数字を表示させます
⑤ pinMode(TACT_SW, INPUT);
タクトスイッチに接続した10番ピンをインプットに設定しています。
⑥ led_output(counter);
ここでは、③で紹介した関数をコールしています。
初回の起動時は、counterの値は0なので、0を表示させています。
⑦ state = digitalRead(TACT_SW);
タクトスイッチが押され、電流が流れている状態だとstateに”HIGH”が入り
タクトスイッチが押されておらず、電流が流れていないとstateに”LOW”が入ります。
⑧ if((state == HIGH) && (state_old == LOW)) { //ボタンが押された counter++;
} else {
// 何もしない }
ボタンが押されていれば、電流が流れstateの値は”HIGH”となり、
押されていなければ電流が流れず、stateの値は”LOW”となります。
このif文では、stateとstate_oldの値を見ています。
state_oldには、stateの前回の値が入っているので、ボタンが押された時
つまりstateの値が”LOW”から”HIGH”になった時にcounterの値をプラス1します。
counter++ は、counterの値をプラス1するという意味です。
⑨ if(counter >= 10) { counter = 0;
}
今は7セグメントLEDを一つしか使っていないので、1桁しか表示できません。
そのため、ボタンを押した回数が10回となった時点で、回数をリセットしています。
⑩led_output(counter);
led_output関数に変数”counter”を引数として与え、関数コールをしています。
⑧の処理で計算したボタンの押された回数を表示します。
⑪ state_old = state;
stateの値を、state_oldに格納しています。
こうすることで、ボタンが押された瞬間を⑧のif文で判断することができます。
これでこの章のプログラムの説明を終了します。
どうでしたでしょうか?関数やswitch case 文等、初めてで戸惑うものも あったのではないでしょうか。
7.7セグメントLEDの配線図②
配線図はこのような形です。
この章の説明は以上です。
この章では、1桁を表示できる7セグメントLEDについて学びました。
次の章では、4桁を表示できる7セグメントについて学んでいきましょう。