読者です 読者をやめる 読者になる 読者になる

raspberry pi 3と7セグメントLEDで時計を作る

ようやっとPIMORONIくんから注文したものが届いた。NOIRカメラとか赤外線LEDとか7セグLED。ただカッコイーと思って買った7セグLEDだったけどちゃんと使えたので備忘録も兼ねてソースを乗せておく。
最初のうちは適当にソースコピペすればいいか~~と思っていたけど結局自分で書くことになった。
買ったのはこれのイエロー。型番はYSD-439AB4B-35
4 Digit 7 Segment Display - Pimoroni
どうもデーターシートは間違いがあるらしく、これを参考にした。

Pimoroni 7 Segment - Pinout
imgur.com

プログラムはここのソースを使おうとしたけどうまく動かなかったのでpython初心者なりにがんばって書いた。
How to drive a 7 segment display directly on Raspberry Pi in Python – RasPi.TV
使ったGPIOピンと対応するセグメントは前述のサイトの作例に倣って作った。ただ、7セグLEDがアノードコモンかカソードコモンかによって抵抗の本数と位置が変わるには注意


http://raspi.tv/wp-content/uploads/2015/11/7seg-pinouts2.png



基本的には
一番左を点灯

消灯

左から2番目を点灯

消灯

左から3番目を...

の繰り返しである
python、GPIOピンともに今日はじめて本格的にやったため拙い点が多いと思うけどなにかの参考になれば
カソードは、outputを1にすると通電しなくなるので、消灯するセグメントを指定した。詳しくはここを参照
ツール・ラボ » 第22回 Raspberry PiのGPIO概要


#!/usr/bin/env python
# coding: utf-8

import os
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)


nowtime = 'date +%M%S' #これは分:秒なので時:分にするときは%M%Sを%H%Mにすればよい

digit = 0   #表示する桁のカウント(0~3)

#アノード
d1 = 22
d2 = 27
d3 = 17
d4 = 24

digitGPIO = [22, 27, 17, 24]
GPIO.setup(digitGPIO, GPIO.OUT)

#カソード
n0 = [18]
n1 = [11, 10 ,7 ,8 ,18]
n2 = [10, 23]
n3 = [10 ,7]
n4 = [11, 7 ,8]
n5 = [4, 7]
n6 = [4]
n7 = [10, 18, 7, 8]
n8 = []
n9 = [7]

numGPIO = [11, 10, 8, 7, 23, 18, 4]
GPIO.setup(numGPIO, GPIO.OUT)


GPIO.output(digitGPIO, 0)
GPIO.output(numGPIO, 0)

try:
	while True:
		nowtimeB = os.popen(nowtime).readline().strip()     #nowtimeをいい感じに整える
		numlist = [ int(num) for num in list(str(nowtimeB))]    #nowtimeBを一桁ずつ配列にする ex)1234 -> 1,2,3,4

        #次の桁を表示する前にすべて消灯する
		GPIO.output(digitGPIO, 0)
        	GPIO.output(numGPIO, 0)


        #numlistから次の桁をdigitをインデックスに取り出し対応するセグメントを点灯
		if numlist[digit] == 0:
                	GPIO.output(digitGPIO[digit], 1)
                	GPIO.output(n0,1)

		elif numlist[digit] == 1:
                        GPIO.output(digitGPIO[digit], 1)
			GPIO.output(n1,1)
            			
		elif numlist[digit] == 2:
			GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n2,1)

		elif numlist[digit] == 3:
                        GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n3,1)

		elif numlist[digit] == 4:
                        GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n4,1)

		elif numlist[digit] == 5:
                        GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n5,1)

		elif numlist[digit] == 6:
                        GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n6,1)

		elif numlist[digit] == 7:
                        GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n7,1)

		elif numlist[digit] == 8:
                        GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n8,1)

		elif numlist[digit] == 9:
                        GPIO.output(digitGPIO[digit], 1)
                        GPIO.output(n9,1)

        #digitを0~3でサイクルさせる			
		if digit == 3:
			digit = 0
		else:
		 digit = digit + 1

        #次の桁を表示するまでの時間(数値はお好みで)
		time.sleep(0.001)

finally:
	GPIO.cleanup()