今回は前回予告の通りICL7139の7セグメント出力を読み取って数値化する実験です。
原理
そもそものICL7139の液晶表示の仕組みを紐解いてみます。
データシートのピン配列と液晶の1ブロックの対応は以下の図のようになっています。
BP1とBP2 2つのバックプレーンを利用することで、1つのピンに2つ分の信号をオーバーラップさせています。
実際にセグメントが「.0」を表示している時の信号の状態を下図に示しました。
テスト構成
BP1がhighの時の各信号とBP2がhighの時の各信号を読み取って並び替えることで、7ビットの2進数にすることで、逆の読み取りを行ってみようと思います。
なんとも遠回りな方法なのですが、ICL7139にはシリアル出力などの便利な機能はないので、この方法しかなさそうです。
実験用の回路はこのようにしました。
74HCシリーズを久しぶりに使いました。
テストプログラム
今回はテストなので、ICL7139の最下位桁のみ読み取って、I2C接続のLCDに表示します。
前回のテストプログラムに機能追加しています。
7セグメント読み取りテスト(最下桁のみ)
from machine import Pin, I2C import sh1106 import time # ICL 7319 mode controll function def setmode(a): if (a == 0): # DC V relyreset.on() time.sleep_ms(100) relyreset.off() photor.off() amper.off() hilo.on() elif (a == 1): # AC V relyreset.on() time.sleep_ms(100) relyreset.off() photor.off() amper.off() hilo.off() elif (a == 2 ): # Ω LO relyset.on() time.sleep_ms(100) relyset.off() photor.off() hilo.off() elif ( a == 3 ): # Ω HI relyset.on() time.sleep_ms(100) relyset.off() photor.off() hilo.on() elif ( a == 4 ): # micro A photor.on() relyreset.on() time.sleep_ms(100) relyreset.off() amper.off() elif ( a == 5 ): # m A photor.on() relyreset.on() time.sleep_ms(100) relyreset.off() amper.on() display.fill(0) display.text(dispstr[mode], 0, 0, 1) display.show() return # read LCD digit 0 and display in I2C LCD. def readdvm(): dvm=0 dvmval=0 segdict= { 16:0, 59:1, 12:2, 9:3, 35:4, 65:5, 64:6, 27:7, 0:8, 1:9 } # wait until bp2 == 1 while (bp2.value() == 0): continue time.sleep_ms(1) dvm = 4*bc.value()+2*ad.value()+1*ge.value() # wait until bp1 == 1 while (bp1.value() == 0): continue time.sleep_ms(1) dvm += 64*bc.value()+32*ad.value()+16*ge.value()+8*fdp.value() # get dvm digit 0 read value from distionally dvmval= segdict.get(dvm,"unknown") if (dvmval != "unknown"): display.fill(0) display.text(str(dvm), 0, 0, 1) display.text(str(dvmval), 0, 8, 1) else : # sometime this happens.. print(dvm) display.show() # Initialize display i2c = machine.SoftI2C(scl=machine.Pin(5), sda=machine.Pin(4), freq=400000) display = sh1106.SH1106_I2C(128, 64, i2c, Pin(16), 0x3c, 180) display.sleep(False) dispstr = ["DC Voltage","AC Voltage","LO Register","HI Register","Micro Ampere","Milli Ampere"] # Initialize ICL7139 control pin # default = DC V pin0=off, pin3=off, pin6=on Relay reset # phtor is used to controll DVM mode to Ampere. You need to reset rely. photor = Pin(0, Pin.OUT) photor.off() # relyset is used to set relay mode = Ω relyset = Pin(1, Pin.OUT) relyset.off() # relyreset is used to reset relay mode = V or A relyreset = Pin(2, Pin.OUT) relyreset.on() time.sleep_ms(100) relyreset.off() # apmer is used to swtich microA/mA off = microA on = mA amper = Pin(3, Pin.OUT) amper.off() # hilo is used to swtich HI-DC/LO-AC off = LO-AC = HI-DC hilo = Pin(6, Pin.OUT) hilo.on() # Initialize Push button pin pushb = Pin(7, Pin.IN,Pin.PULL_UP) # Initialize LCD read pin bp1 = Pin(8, Pin.IN) bp2 = Pin(9, Pin.IN) bc = Pin(10, Pin.IN) ad = Pin(11, Pin.IN) ge = Pin(12, Pin.IN) fdp = Pin(13, Pin.IN) # set mode = 0 (DCV) mode = 0 setmode(mode) # Wait push Button and increment mode value while True: readdvm() if pushb.value() == 0: time.sleep_ms(20) mode +=1 mode = mode % 6 display.fill(0) display.text(str(mode), 0, 0, 1) display.show() setmode(mode) while (pushb.value() == 0): time.sleep_ms(100) continue continue
以下の箇所が肝のところで、読み取り値と実際の数字のマッピングを行う辞書データです。
segdict= { 16:0, 59:1, 12:2, 9:3, 35:4, 65:5, 64:6, 27:7, 0:8, 1:9 }
テスト結果
確認の状況を動画で載せてみます。
手で入力を触ることで、電圧が変動し、その表示桁の最下桁の内容がI2C LCDにも表示されているのがわかるでしょうか。(上段:読み取り値で下段:数値です。)
次回に向けて
ここまでで単体の読み取りが動作することが確認できました。すべての桁の読み取りを行うには、ラズパイのIOがすべてのLCDのピンを読み取るほど本数がないことから、少し工夫が必要です。また、こういった処理は、ラズパイのプログラマブルIOが得意な処理のような気がしますので、いろいろ研究してみたいと思います。
投稿者の人気記事
-
keitanak
さんが
2023/05/05
に
編集
をしました。
(メッセージ: 初版)
-
keitanak
さんが
2023/05/05
に
編集
をしました。
ログインしてコメントを投稿する