7セグドライバのTM1630をRaspberry Pi Zero WHで使ってみたい

7セグドライバのTM1630

7セグ1桁ができたので、4桁もできんだろー、ついでにドライバも使っちゃえーってやってみたら茨の道だった。まぁ大半はケアレスミスなんだけどさ。できるまでに

GPIOでクロックやらなんやらを自前で書いてみる→できない。

もしやSPIでいけるのでは?と試してみる→できない。

ふて寝

自前で書いたピンの指定が間違ってることに気づく→できた!

という流れでした。デバッグの仕方がわからないのが痛い。動かないときになにをやれば動くようになるのかの手がかりがないから、立ち往生してしまうのです。とりあえず動いてくれたのでメモメモ。

お買い物

http://akizukidenshi.com/catalog/g/gI-13223/

http://akizukidenshi.com/catalog/g/gI-09971/

TM1630がカソード専用だって分かんなくて最初アノードコモンのLEDを買っちゃったのは秘密だ。

接続する

繋いだ。これはこれで結構大変じゃんね。

コード書く

今回もコメントで考えたこと書いてこ。

# pigpio使う準備
import pigpio

pi = pigpio.pi()

# 使うGPIOピンを指定(BCMで)
DATA = 2
CLK = 3
STB = 4

# 表示する数字を16進数で持っておく。0→9
HEX_NUM = [0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f]

# それぞれのピンを出力で設定。
pi.set_mode(DATA, pigpio.OUTPUT)
pi.set_mode(CLK, pigpio.OUTPUT)
pi.set_mode(STB, pigpio.OUTPUT)

# 初期状態に設定する。
pi.write(DATA,0)
pi.write(CLK,1)
pi.write(STB,1)

# 8bit出力するための関数。
def WriteByte(hex): # 16進数の数字を渡す
    for i in range(8): # 8bit分だけ処理する。
        shiftb = hex >> i & 0b1 # LSB→MSBで出力するのでカウント分ずつ右シフトして1と論理積を取り、1桁だけ取り出す。
        pi.write(CLK,0) # クロックの立ち上がりエッジでデータを読み取られるのでLOWにしておく。
        # シフトした数値に応じてデータピンをHIGHかLOWに出力する。
        if shiftb == 0:
            pi.write(DATA,0)
        elif shiftb == 1:
            pi.write(DATA,1)
        pi.write(CLK,1) # クロックをHIGHにしてデータを読み取らせる。
        pi.write(CLK,0) # 戻す。これいらないかも?試してない。
    pi.write(CLK,1) # 8bit分処理が終わったら、クロックを初期状態に戻す。

#こっからメイン。
pi.write(STB,0) # STBをLOWにするのが初めの合図みたい。
WriteByte(0x0) # 表示モード設定(桁数、seg数)
pi.write(STB,1) # 1つコマンド送ったらSTBをHIGHにして
pi.write(STB,0) # またLOWにする。
WriteByte(0x44) # データコマンド設定(表示かキー読み取りか、自動アドレスか固定アドレスか、通常モードかテストモードか)
                # 一度自動アドレスモードを試してみたが、なんか上手くいかなかったので固定アドレスモードにした。
pi.write(STB,1) # 同上
pi.write(STB,0)
WriteByte(0xc0) # アドレスコマンド設定。今回DPは使わないことにしたので(わけわかんなくなった)どの桁に表示するか決めるとこと考えて良い。
WriteByte(HEX_NUM[1]) #表示したい数字。固定アドレスモードの場合、アドレスとデータの間にSTBの出力はいらない。
pi.write(STB,1) # 一個終わったらSTBをHIGH-LOWする。これなんか用語あるのかな。
pi.write(STB,0)
WriteByte(0xc2) # 2桁目
WriteByte(HEX_NUM[2])
pi.write(STB,1)
pi.write(STB,0)
WriteByte(0xc4) # 3桁目
WriteByte(HEX_NUM[3])
pi.write(STB,1)
pi.write(STB,0)
WriteByte(0xc6) # 4桁目
WriteByte(HEX_NUM[4])
pi.write(STB,1)
pi.write(STB,0)
WriteByte(0x8f) # 表示制御 (明るさ、表示のオンオフ)
pi.write(STB,1)

pi.stop() # 後始末。

表示数字の対応表

ICのseg
seg8 seg7 seg6 seg5 seg4 seg3 seg2
ディスプレイのseg
disp. g f e d c b a bin→hex
0 0 1 1 1 1 1 1 0x3f
1 0 0 0 0 1 1 0 0x6
2 1 0 1 1 0 1 1 0x5b
3 1 0 0 1 1 1 1 0x4f
4 1 1 0 0 1 1 0 0x66
5 1 1 0 1 1 0 1 0x6d
6 1 1 1 1 1 0 1 0x7d
7 0 1 0 0 1 1 1 0x27
8 1 1 1 1 1 1 1 0x7f
9 1 1 0 1 1 1 1 0x6f

で、動かしてみると

点いた!いやー長かった。ここにくるまでに

こんなんなっちゃったりして大変だったー。今度はこれを外部プログラムから使えるようにしたいなぁ。できるかなぁ。

参考

http://nopnop2002.webcrow.jp/8SEG-LED/8SEG-TM1637.html

https://garretlab.web.fc2.com/arduino/lab/led_driver_tm1630/

カテゴリー: したい タグ: , , , , パーマリンク

コメントを残す

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