I2Cインターフェースのパーツを使用していますが、時々デバイスのアドレスをメモし忘れてネットで調べなおすことがあり、ArduinoMiniを使って小型でスタンドアロンなI2Cアドレススキャナーを作成しようとしました。
しかしながらArduinoMiniはI2Cインターフェースが1系統しか使えないのでスキャナーの表示に安価な小型のI2CインターフェースOLEDディスプレイを使用すると、同じアドレスのデバイスなのか応答していないのかが判断できないので、I2Cを2系統あるコントローラで価格が550円と安価なRaspberry pi picoを使ってみることにしました。
I2Cスキャナーの仕様
- スタンドアローン
- スキャン対象デバイス用リセット機能
- 電源:USBまたはバッテリー(3.3V~5V)
*PicoのVsys規格:1.8V~5.5V
回路図
Raspberry pi pico、表示器、スイッチ、ダイオードと端子だけです。
プログラム
MicroPythonのi2c.scanを使用したので設定と表示をさせるだけの簡単なコードです。
本コードに必要なssd1306.pyはgithubからダウンロードしました。
# 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後にハイになる(実験で確認)
i2c0 = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000) # スキャン結果表示用OLEDのI2C0のGPIOピンと周波数
i2c1 = I2C(1, scl=Pin(11), sda=Pin(10), freq=100000) # スキャン対象デバイス用のI2C1のGPIOピンと周波数
print("OLED I2C0 Configuration: "+str(i2c0)) # OLED I2C設定の確認(Thonnyのshellに表示)
print("OLED I2C0 Address : "+hex(i2c0.scan()[0])) # OLED I2Cアドレスの確認(Thonnyのshellに表示)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c0) # OLEDの表示サイズを設定
while True: # I2Cアドレスを変更できるデバイス用に連続動作にする
adrl = i2c1.scan() # 対象デバイスのI2Cアドレスをスキャン
if len(adrl) == 0: # 対象デバイスが検出できなかった場合はnot found
adr = "not found"
else:
adr = hex(adrl[0]) # スキャン結果をadrl[0](リスト変数adrlの1番目)より16進数で取得
print("I2C1 Configuration: "+str(i2c1)) # スキャン対象 I2C設定の確認(Thonnyのshellに表示)
print("I2C1 Address : "+adr) # スキャン結果 I2Cアドレスの確認(Thonnyのshellに表示)
oled.fill(0) # OLED 表示をクリア
oled.text("I2C Addr. Scan",0,5) # OLED1行目にタイトルを書き込み
oled.text("Device " + adr,0,25) # OLED2行目にスキャン結果アドレス値を書き込み
oled.show() # OLED 書き込み値を表示
utime.sleep_ms(200) # 繰返し動作中を示すため2行目末尾にドット点滅
oled.text(".",120,25)
oled.show()
utime.sleep_ms(200)
動作確認のためのブレッドボード配置図
ブレッドボードに実装して動作確認
温湿度&気圧センサーのBME280をスキャン対象デバイスに使用。
動作確認が出来たのでユニバーサル基板で作成
配線は裏面なのでfritzingで描いたパターンをフォトアプリで反転させたパターンを見ながら配線しました。
完成!