4年前に作成したI2Cのアドレス確認治具は便利に使えてましたが、複数のアドレスを持つモジュールを使用したので、治具も複数アドレスに対応させました。ハードウェアは以前の「Raspberry-pi-picoでI2Cアドレススキャナー」のままでソフトウェアだけの変更です。
# I2Cインターフェース アドレススキャナー
# Raspberry pi pico, SSD1306
# Micro Python
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime
WIDTH = 128 # OLED表示サイズ設定
HEIGHT = 32
reset = machine.Pin(15, machine.Pin.OUT) # GPIO15をスキャン対象デバイスのリセット信号に使用
reset.value(1) # GPIO15をハイレベルにセット。
# GPIOはPicoリセットから約300ms後にHiになる(実験で確認)
i2c0 = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000) # OLED用I2C0のGPIOピンとF設定
i2c1 = I2C(1, scl=Pin(11), sda=Pin(10), freq=100000) # スキャン用I2C1のGPIOピンとF設定
print("OLED I2C0 Configuration: "+str(i2c0)) # I2C0の設定確認
print("OLED I2C0 Address : "+hex(i2c0.scan()[0])) # OLED I2Cアドレスの確認
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c0) # OLEDの表示サイズを設定
while True: # I2Cアドレスを変更できるデバイス用に連続動作にする
adrlist = i2c1.scan() # 対象デバイスのI2Cアドレスをスキャン
if not(adrlist): # 対象デバイスが検出できなかった場合はnot found
oled.fill(0)
oled.text("I2C Addr. Scan",0,5)
oled.text("No device found!",0,25)
oled.show()
else:
print("I2C1 Configuration: " + str(i2c1)) # スキャン対象 I2C1の設定確認
i = 0
for adr in adrlist: # スキャン結果をadrllistより順にadrに取り込み
i += 1
adr = hex(adr)
print("I2C Address Device " + str(i) + ": " + adr) # スキャン結果の確認
oled.fill(0) # OLED 表示をクリア
oled.text("I2C Addr. Scan",0,5) # 1行目にタイトル書込み
oled.text("Device " + str(i) + ": " + adr,0,25) # 2行目にスキャン結果書込み
oled.show() # OLED 書き込み値を表示する
utime.sleep_ms(800) # 表示時間設定(800+200ms)
oled.text(".",120,25) # 繰返し動作中サイン:2行目末尾にドット表示
oled.show()
utime.sleep_ms(200) # ドット表示時間設定
約1秒毎に各デバイスのアドレスを表示します。
