作成日時:2015年05月31日 22時14分35秒
更新日時:2020年05月19日 08時47分06秒
この記事は9年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。
今まではLEDを点灯させてたり「そんなの電池に直結すれば」と思われるような物が多かったけれど、今回はちょっとマイコンらしい事をしてみようと。1桁の7セグLEDを制御してみようと思います。
準備する物
- カソードコモンの7セグLED
- 適当な抵抗
- 適当なケーブル
- WiringPi
そもそも7セグLEDとはなんぞや
7セグLEDとは、1つのモジュールの中に7つのLEDを詰め込んで、主に数字を表示する為の部品であり、自販機の価格表示や時計など、様々なところで使われています。
詳しい仕様は私よりも詳しい人が分かりやすく書いたサイトが沢山有りますのでそちらを見ていただくとして。簡単に説明しますと7セグLEDにはアノード(+)を一つにまとめたアノードコモンと、カソード(-)を一つにまとめたカソードコモンがあり、制御方法が変わってきますが、今回はポートをHにすれば光るカソードコモンの方が分かりやすいと思いこちらを採用しました。
1桁の7セグLEDの場合はコモンが2本と各LEDに割り当てられた端子がドットも含めて8本の計10本の端子が出ています。ここに電流を流す事によって各LEDが点灯し、数字やアルファベットなどの情報を表示する事が出来ます。
(真ん中のLEDに直接3.3Vを供給した状態)
結線
一般的な7セグLEDは、頂上のセグメントから時計回りにABCDEFで真ん中がGとなっていて、端子は表示面下側から反時計回りに123…10となっています。(裏側からみて下から時計回り)
※ただし、7セグLEDによってこの辺の仕様は違う場合がありますので、実際の配列は入手した7セグLEDの仕様書を見てから使ってください。
この各LEDに抵抗を挟んで接続します。何処のポートに繋ぐかは好きにしてください。
(本当はトランジスタで増幅したり、制御ICを使って使うピンを減らしたりするのですが、とりあえずDIYで光れば良いのであればこれで十分。)
2015年6月7日:GPIOポート表更新
この表だと22~29を使うのが良さそうですね。
私はこの22~29に小数点 F-Aの順に接続しました。
点灯
7セグLEDと言っても、ものはただのLEDなので普通にGPIOポートのオンオフをすれば使えます。
(抵抗がないって?抵抗はいつも君の心の中にあるさ。)
マイコンらしい制御をするには、この記事の通りに結線した場合、
// LEDポート設定(GPIO.x)
#define LED_A 29
#define LED_B 28
#define LED_C 27
#define LED_D 26
#define LED_E 25
#define LED_F 24
#define LED_G 23
#define LED_P 22
こんな感じにLEDのポートを定義。LED_A~LED_Gは各7セグのポートでLED_Pが小数点。要らないなら不要。
int LED_SET(int num,int dot){
// セグメント定義
int seg[18][7] ={{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1}, // 9
{1,1,1,0,1,1,1}, // A ←10
{0,0,1,1,1,1,1}, // B(b) ←11
{0,0,0,1,1,0,1}, // C(c) ←12
{0,1,1,1,1,0,1}, // D(d) ←13
{1,0,0,1,1,1,1}, // E ←14
{1,0,0,0,1,1,1}, // F ←15
{0,0,0,0,0,0,1}, // - ←16
{0,0,0,0,0,0,0}};// Blank ←17
digitalWrite(LED_A,seg[num][0]);
digitalWrite(LED_B,seg[num][1]);
digitalWrite(LED_C,seg[num][2]);
digitalWrite(LED_D,seg[num][3]);
digitalWrite(LED_E,seg[num][4]);
digitalWrite(LED_F,seg[num][5]);
digitalWrite(LED_G,seg[num][6]);
digitalWrite(LED_P,dot);
}
こんな感じで関数を作ってあげて、2次元配列を読み取って表示してやると良いでしょう。
たとえば{1,1,1,1,0,0,1}を流した場合はこうなります。
ちなみに上の変数は
LED_SET(数字,小数点(0=消灯 1=点灯))
となっていて、例えば3.を表示したい場合には
LED_SET(3,1);
となる。
おわりに
このように、単純に一桁の表示をするだけなら凄く簡単です。基礎中の基礎ですね。
これに桁数を増やしていくともう少しマイコンらしい感じになります。
複数の桁を表示するには、トランジスタやフォトカプラ、専用ICなんかで電気を流すLEDを選択してあげて高速で切り替えると言う手段があります。それはまたそのうちやりますね。
ちなみにラズパイ2(初代B+と2)は論理上は9桁まで行けると思います。
※上の条件で動作させるためのソースコードを置いておきます。
#include <stdio.h>
#include <wiringPi.h>
// LEDポート設定(GPIO.x)
#define LED_A 29
#define LED_B 28
#define LED_C 27
#define LED_D 26
#define LED_E 25
#define LED_F 24
#define LED_G 23
#define LED_P 22
int main(void){
wiringPiSetup();
pinMode(LED_A,OUTPUT);
pinMode(LED_B,OUTPUT);
pinMode(LED_C,OUTPUT);
pinMode(LED_D,OUTPUT);
pinMode(LED_E,OUTPUT);
pinMode(LED_F,OUTPUT);
pinMode(LED_G,OUTPUT);
pinMode(LED_P,OUTPUT);
LED_SET(3,0);
delay(600);
LED_SET(9,0);
delay(600);
LED_SET(6,0);
delay(600);
LED_SET(8,0);
delay(600);
LED_SET(7,0);
delay(1000);
for(;;){
int i = 0;
for(i=0;i<18;i++){
LED_SET(i,1);
delay (1000);
}
i=0;
}
}
int LED_SET(int num,int dot){
// セグメント定義
int seg[18][7] ={{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1}, // 9
{1,1,1,0,1,1,1}, // A
{0,0,1,1,1,1,1}, // B(b)
{0,0,0,1,1,0,1}, // C(c)
{0,1,1,1,1,0,1}, // D(d)
{1,0,0,1,1,1,1}, // E
{1,0,0,0,1,1,1}, // F
{0,0,0,0,0,0,1}, // -
{0,0,0,0,0,0,0}};// Blank
digitalWrite(LED_A,seg[num][0]);
digitalWrite(LED_B,seg[num][1]);
digitalWrite(LED_C,seg[num][2]);
digitalWrite(LED_D,seg[num][3]);
digitalWrite(LED_E,seg[num][4]);
digitalWrite(LED_F,seg[num][5]);
digitalWrite(LED_G,seg[num][6]);
digitalWrite(LED_P,dot);
}
[…] 基本的な部品は前回7セグLEDを点灯させたものと同じ。それに今回使用するICが加わった感じです。 74HC595は非常にポピュラーな半導体なので色々なところから出ていますが。今回は東芝製の「TC74HC595AP」を使いました。マルツのオンラインで1つ130円+税ほど。日本企業製以外なら本家Tiのものが秋月なんかで40円程度で買えますね。なんとアマゾンにもあります。 基本的にどのICも同じはずなので好きなものを。特にこだわりがなければTi製の安いものでいいでしょう。 […]
[…] 前回、Raspberry Pi 2にて7セグLEDの制御をしましたが。 今回は2桁以上の7セグLEDに数字を表示してみたいと思います。 […]