Raspberry Piで数字を表現する
前回に続きいよいよ数字を表現したいと思います。
頼りにしていたのが秋月電子の組み立てキットです。
これを参考にコンバータを使えばできると思っていたのですが、調べてみると認識が間違っていました。
A/Dコンバータとはアナログ信号をデジタル信号に変えるもので、RaspberryPiはデジタル信号が入力なので使えません。。
そこで別の方法で作ることにしました。
配線で何とかする
7パターン×4桁+4桁=32個の入力で作る方法
しかし、Raspberry PiのGPIOの入力は11個なので足りません。
Raspberry Pi Pinout - Rev 2 Board
ググった結果、
入力を節約できる『ダイナミック点灯』という方法が使えそうなので試してみました。
ダイナミック点灯
人の目が認識できない速さで1桁ごとに点灯させることで、同時に複数桁点灯する方法です。
言葉ではよくわからないので図で説明します。
①1桁目は『1』を点灯
②2桁目は『7』を点灯
③①と②を高速で繰り返す。
すると、
人の目にはこのように映ります。
4桁の数字は
7パターン+4桁=11個の入力で表現できます。
これがダイナミック点灯です
部分的に点灯する
これも難しかったです。
AB点灯とAのみ点灯を表現しようとした場合です。
ABから電流が流れている場合はBから電流を流さないようにすればできるのですが、
と
電流の向きは逆なので、
と
すべてに電流が流れるか流れないかしか表現できません。
いろいろ試した結果、電流は高いほうから低いほうに流れることを利用してこんな構成にしました。
すべて入力をいれる。点灯しない
B側のみ入力しない。Bのみ点灯
A側のみ入力しない。Aのみ点灯
AB両方入力しない。AB両方点灯
中学時代の知識ですがこれでいいはず。
回路図
ジャンパーピンが足りないので1と7だけ自在に表示できるように配線しました。
コード
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
17が表示されました。
$ sudo python show_number.py 1 1
入力通り一ケタ目が『1』2桁目も『1』です
$ sudo python show_number.py 7 a
数字以外の入力は消灯します。
数字を表示するだけなのにこれだけ難しいとは。。