2015年7月11日土曜日

[Raspberry Pi]7セグLEDを表示してみる

7セグLEDの説明は「7セグ LED と集合抵抗を使ってみよう」が詳しいです。
参考にさせていただきました。ありがとうございます。

私はカソードコモンを使いました。また端子は上下にあるものを使いました。
抵抗は1kΩのものを使いました。



* 3番(下側中央)をGNDに接続しています。GNDに接続するのは8番(上側中央)でもいいみたいです。
* 7個のLED(AからG)にそれぞれHigh(点灯)、Low(消灯)を指示することで数字の表示ができます。
* 私の場合は以下のような回路になっています。
7セグLEDのA : GPIO 5
7セグLEDのB : GPIO 13
7セグLEDのC : GPIO 6
7セグLEDのD : GPIO 20
7セグLEDのE : GPIO 21
7セグLEDのF : GPIO 16
7セグLEDのG : GPIO 19
  * GPIOの番号は「GPIO: MODELS A+, B+ AND RASPBERRY PI 2」の上側の図の番号体系と同じです。
  * プログラム中のled_gpio_dicと対応しておりまして、Value(右側の数字)は何番のGPIOにつないだかによって変更する必要があります。
* またGPIO 24がHigh(スイッチを押したとき)になったら停止するようにしています。
* プログラムはPythonで書きました。
 * $ sudo python filename.py
   で実行できます。

import RPi.GPIO as GPIO
from time import sleep

# 7seg led position : GPIO
led_gpio_dic = {
    "A": 5,
    "B": 13,
    "C": 6,
    "D": 20,
    "E": 21,
    "F": 26,
    "G": 19 }

# number : led position
number_led_dic = {
    0: set([chr(c) for c in range(ord('A'), ord('F')+1)]), # A, B, C, D, E, F
    1: set(["B", "C"]), # B,C
    2: set(["A", "B", "G", "E", "D"]), # A, B, G, E, D
    3: set(["A", "B", "C", "D", "G"]), # A, B, C, D, G
    4: set(["F", "G", "B", "C"]), # F, G, B, C
    5: set(["A", "F", "G", "C", "D"]), # A, F, G, C, D
    6: set(["F", "E", "D", "C", "G"]), # F, E, D, C, G
    7: set(["A", "B", "C"]), # A, B, C
    8: set([chr(c) for c in range(ord('A'), ord('G')+1)]), # A, B, C, D, E, F, G
    9: set(["A", "B", "C", "F", "G"]), # A, B, C, F, G
    "-": set(["G"]) }

def my_callback(channel):
    global done
    if channel == 24:
        done = True

def show(number):
    high_pos_set = number_led_dic[number]
    low_pos_set = number_led_dic[8] - high_pos_set
    for pos in high_pos_set:
        GPIO.output(led_gpio_dic[pos], GPIO.HIGH)
    for pos in low_pos_set:
        GPIO.output(led_gpio_dic[pos], GPIO.LOW)

# init
GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback, bouncetime=200)
for pos in number_led_dic[8]:
    GPIO.setup(led_gpio_dic[pos], GPIO.OUT, initial = GPIO.LOW)


done = False
num = 0
try:
    while not done:
        show(num % 10)
        num += 1
        sleep(0.3)
except KeyboardInterrupt:
    pass

GPIO.cleanup()


【環境】
Raspberry Pi 2 Model B
$ uname -a
Linux raspberrypi 4.0.7-v7+ #801 SMP PREEMPT Tue Jun 30 18:38:23 BST 2015 armv7l GNU/Linux



Enjoy!



0 件のコメント:

コメントを投稿