Raspberry Piで数字を表現する

前回に続きいよいよ数字を表現したいと思います。

 

頼りにしていたのが秋月電子の組み立てキットです。

これを参考にコンバータを使えばできると思っていたのですが、調べてみると認識が間違っていました。

A/Dコンバータとはアナログ信号をデジタル信号に変えるもので、RaspberryPiはデジタル信号が入力なので使えません。。

f:id:katashiyo515:20141019231234j:plain

そこで別の方法で作ることにしました。

配線で何とかする

7パターン×4桁+4桁=32個の入力で作る方法

f:id:katashiyo515:20141019232313j:plain

しかし、Raspberry PiのGPIOの入力は11個なので足りません。

Raspberry Pi Pinout - Rev 2 Board

 

ググった結果、

入力を節約できる『ダイナミック点灯』という方法が使えそうなので試してみました。

 

ダイナミック点灯

人の目が認識できない速さで1桁ごとに点灯させることで、同時に複数桁点灯する方法です。

言葉ではよくわからないので図で説明します。

①1桁目は『1』を点灯

f:id:katashiyo515:20141019233311j:plain

②2桁目は『7』を点灯

f:id:katashiyo515:20141019233318j:plain

③①と②を高速で繰り返す。

すると、

f:id:katashiyo515:20141019233509j:plain

 人の目にはこのように映ります。

 

4桁の数字は

7パターン+4桁=11個の入力で表現できます。

f:id:katashiyo515:20141019233707j:plain

これがダイナミック点灯です

 

 部分的に点灯する

 これも難しかったです。

f:id:katashiyo515:20141019235022j:plainAB点灯とf:id:katashiyo515:20141019235043j:plainAのみ点灯を表現しようとした場合です。

ABから電流が流れている場合はBから電流を流さないようにすればできるのですが、

f:id:katashiyo515:20141019234830j:plainf:id:katashiyo515:20141019235246j:plain

電流の向きは逆なので、

f:id:katashiyo515:20141019235851j:plainf:id:katashiyo515:20141019235915j:plain

すべてに電流が流れるか流れないかしか表現できません。

 

いろいろ試した結果、電流は高いほうから低いほうに流れることを利用してこんな構成にしました。

f:id:katashiyo515:20141020000559j:plain

f:id:katashiyo515:20141020000909j:plainすべて入力をいれる。点灯しない

f:id:katashiyo515:20141020000930j:plainB側のみ入力しない。Bのみ点灯

f:id:katashiyo515:20141020000918j:plainA側のみ入力しない。Aのみ点灯

 f:id:katashiyo515:20141020001045j:plainAB両方入力しない。AB両方点灯

中学時代の知識ですがこれでいいはず。

回路図

ジャンパーピンが足りないので1と7だけ自在に表示できるように配線しました。

f:id:katashiyo515:20141020001551j:plain

コード

pythonでかきました。

入力された数字(1と7限定)を点灯します。

$ cat show_number.py
import RPi.GPIO as GPIO
import time
import sys

argv = sys.argv
argc = len(argv)

if ( argc != 3 ) :
        print "usage : sudo python show_number.py 1 7"
        sys.exit()

degit1_value = argv[1]
degit2_value = argv[2]

class PrintLed:
        led_C  = 11
        degit1 = 12
        led_B  = 15
        degit2 = 16
        led_A  = 18
        def __init__(self):
                GPIO.setmode(GPIO.BOARD)
                GPIO.setup(self.led_C,  GPIO.OUT)
                GPIO.setup(self.degit1, GPIO.OUT)
                GPIO.setup(self.led_B,  GPIO.OUT)
                GPIO.setup(self.degit2, GPIO.OUT)
                GPIO.setup(self.led_A , GPIO.OUT)

        def show(self, degit, value):
                if value == '1' : self.show_1(degit);
                elif value == '7' : self.show_7(degit);
                else : self.print_off(degit);

        def show_1(self, degit):
                self.set_degit(degit)
                GPIO.output(self.led_C,  0)
                GPIO.output(self.led_B,  0)
                GPIO.output(self.led_A,  1)

        def show_7(self, degit):
                self.set_degit(degit)
                GPIO.output(self.led_C,  0)
                GPIO.output(self.led_B,  0)
                GPIO.output(self.led_A,  0)

        def print_off(self, degit):
                GPIO.output(self.degit1, 0)
                GPIO.output(self.degit2, 0)
                GPIO.output(self.led_C,  0)
                GPIO.output(self.led_B,  0)
                GPIO.output(self.led_A,  0)

        def set_degit(self, degit):
                if degit == 1 : GPIO.output(self.degit1, 1);
                else: GPIO.output(self.degit1, 0);
                if degit == 2 : GPIO.output(self.degit2, 1);
                else: GPIO.output(self.degit2, 0);

        def __del__(self):
                GPIO.cleanup()


p = PrintLed();
for num in range(0, 100):
        p.show(1, degit1_value);
        time.sleep(0.01)
        p.show(2, degit2_value);
        time.sleep(0.01

 python難しい。

実験

$ sudo python show_number.py 1 7

f:id:katashiyo515:20141020002113j:plain

17が表示されました。

 $ sudo python show_number.py 1 1

f:id:katashiyo515:20141020002151j:plain

 入力通り一ケタ目が『1』2桁目も『1』です

 

$ sudo python show_number.py 7 a

f:id:katashiyo515:20141020002215j:plain

数字以外の入力は消灯します。

 

数字を表示するだけなのにこれだけ難しいとは。。

参考

arduinoで2桁7セグLEDをカウントアップ。(ダイナミック点灯) - つくったブログ

電子工作室

Raspberry Pi Pinout - Rev 2 Board