編集履歴一覧に戻る
keitanakのアイコン画像

keitanak が 2023年05月05日22時52分24秒 に編集

コメント無し

本文の変更

今回は前回予告の通りICL7139の7セグメント出力を読み取って数値化する実験です。 # 原理 そもそものICL7139の液晶表示の仕組みを紐解いてみます。 データシートのピン配列と液晶の1ブロックの対応は以下の図のようになっています。 BP1とBP2 2つのバックプレーンを利用することで、1つのピンに2つ分の信号をオーバーラップさせています。 ![キャプションを入力できます](https://camo.elchika.com/423e331b155cdf3555eb32dd9362d77c3d0adaee/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f65376464313866392d383530342d343132652d393138652d643536353736303631643564/) 実際にセグメントが「.0」を表示している時の信号の状態を下図に示しました。 ![キャプションを入力できます](https://camo.elchika.com/7aaf24691d805532ee6e3dda2cbe3a9b26f6267b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f38316335336439392d663166622d343137312d393839352d323962653834383135373536/) # テスト構成 BP1がhighの時の各信号とBP2がhighの時の各信号を読み取って並び替えることで、7ビットの2進数にすることで、逆の読み取りを行ってみようと思います。 なんとも遠回りな方法なのですが、ICL7139にはシリアル出力などの便利な機能はないので、この方法しかなさそうです。 実験用の回路はこのようにしました。 74HCシリーズを久しぶりに使いました。 ![キャプションを入力できます](https://camo.elchika.com/1a334c634a5d54e06b0b6aa307bb33a2bb8dc7bc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62376366383337612d373938622d343866612d393832652d6534383166313931653836312f37626339346166322d326532622d346136382d623133322d383539626263623632346336/) # テストプログラム 今回はテストなので、ICL7139の最下位桁のみ読み取って、I2C接続のLCDに表示します。 前回のテストプログラムに機能追加しています。 ```icl7139: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にも表示されているのがわかるでしょうか。(上段:読み取り値で下段:数値です。) @[youtube](https://www.youtube.com/watch?v=7i0lh2wVgAo) # 次回に向けて ここまでで単体の読み取りが動作することが確認できました。すべての桁の読み取りを行うには、ラズパイのIOがすべてのLCDのピンを読み取るほど本数がないことから、少し工夫が必要です。また、こういった処理は、ラズパイのプログラマブルIOが得意な処理のような気がしますので、いろいろ研究してみたいと思います。