さくらのジャンク箱ロゴ

Sakura87がほぼ月刊でお届けするPCや電子工作と写真の備忘録てきなブログ @なんと20周年

Raspberry Pi 2 で7セグLED制御

この記事は9年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。

IMG_4525_20150530

今まではLEDを点灯させてたり「そんなの電池に直結すれば」と思われるような物が多かったけれど、今回はちょっとマイコンらしい事をしてみようと。1桁の7セグLEDを制御してみようと思います。

準備する物

  • カソードコモンの7セグLED
  • 適当な抵抗
  • 適当なケーブル
  • WiringPi

そもそも7セグLEDとはなんぞや

IMG_4520_20150530

7セグLEDとは、1つのモジュールの中に7つのLEDを詰め込んで、主に数字を表示する為の部品であり、自販機の価格表示や時計など、様々なところで使われています。

詳しい仕様は私よりも詳しい人が分かりやすく書いたサイトが沢山有りますのでそちらを見ていただくとして。簡単に説明しますと7セグLEDにはアノード(+)を一つにまとめたアノードコモンと、カソード(-)を一つにまとめたカソードコモンがあり、制御方法が変わってきますが、今回はポートをHにすれば光るカソードコモンの方が分かりやすいと思いこちらを採用しました。

IMG_4521_20150530

1桁の7セグLEDの場合はコモンが2本と各LEDに割り当てられた端子がドットも含めて8本の計10本の端子が出ています。ここに電流を流す事によって各LEDが点灯し、数字やアルファベットなどの情報を表示する事が出来ます。

IMG_4524_20150530

(真ん中のLEDに直接3.3Vを供給した状態)

結線

一般的な7セグLEDは、頂上のセグメントから時計回りにABCDEFで真ん中がGとなっていて、端子は表示面下側から反時計回りに123…10となっています。(裏側からみて下から時計回り)

※ただし、7セグLEDによってこの辺の仕様は違う場合がありますので、実際の配列は入手した7セグLEDの仕様書を見てから使ってください。

この各LEDに抵抗を挟んで接続します。何処のポートに繋ぐかは好きにしてください。

(本当はトランジスタで増幅したり、制御ICを使って使うピンを減らしたりするのですが、とりあえずDIYで光れば良いのであればこれで十分。)

gpoio

2015年6月7日:GPIOポート表更新

この表だと22~29を使うのが良さそうですね。
私はこの22~29に小数点 F-Aの順に接続しました。

点灯

7セグLEDと言っても、ものはただのLEDなので普通にGPIOポートのオンオフをすれば使えます。

IMG_4525_20150530

(抵抗がないって?抵抗はいつも君の心の中にあるさ。)

マイコンらしい制御をするには、この記事の通りに結線した場合、

// 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}を流した場合はこうなります。

IMG_4526_20150530

ちなみに上の変数は

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);
    
    }
総閲覧数:374 PV

“Raspberry Pi 2 で7セグLED制御” への2件のフィードバック

  1. […] 基本的な部品は前回7セグLEDを点灯させたものと同じ。それに今回使用するICが加わった感じです。 74HC595は非常にポピュラーな半導体なので色々なところから出ていますが。今回は東芝製の「TC74HC595AP」を使いました。マルツのオンラインで1つ130円+税ほど。日本企業製以外なら本家Tiのものが秋月なんかで40円程度で買えますね。なんとアマゾンにもあります。 基本的にどのICも同じはずなので好きなものを。特にこだわりがなければTi製の安いものでいいでしょう。 […]

  2. […] 前回、Raspberry Pi 2にて7セグLEDの制御をしましたが。 今回は2桁以上の7セグLEDに数字を表示してみたいと思います。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください