I2CマルチプレクサーTCA9458を使って、同一アドレスの7セグ4桁LED4つ使いをやるつもりでしたが、、、安価な7セグ4桁LEDに搭載のTM1637は実はI2Cではない、ということで、とりあえず目的そのものとは合致しませんが、I2Cの温湿度センサーを2つ使ってI2Cマルチプレクサーの動作を確認しました。
■環境
・RaspberryPi PICO W
・micropython
・Windows11+Thonny
・I2Cマルチプレクサーモジュール
■出典1:I2Cマルチプレクサー使用例
↑接続方法はこれを参考にしました。ただしコードはCです。
■出典2:TCA9458・TI社データシート
■出典3:micropython-tca9548a
↑コードはこれを参考にしました。
■出典4:温湿度センサAHT20用ライブラリ
↑ライブラリaht0x.pyをコピーし、
Thonny上で新ファイルにペースト、同じファイル名でPICOに保存して利用
■配線状況
↑左側のPICOはイチケンさんのユニバーサル基板にはんだ付け実装したもの。
右のブレッドボード上の紫色がマルチプレクサ。
↑PICOピンアサイン表示付きのロングソケット、アドレス・動作モード設定用の
DIPスイッチ8接点、他のGPIO用にロングソケット、3.3V電源とGNDに複数の
ロングソケット、USB-typeC外部5V電源使用時のソケットと電源スイッチを
装備しています。
↓緑色のAHT20を2個、SD0/SC0とSD1/SC1へ接続
■動作したコード
#標準ライブラリ
#using 7segLED 4 unit with a same I2Caddress
#using TCA9548A I2C multipredxer
# address 102=0X70
#using 7segI2C-LED #TM1637はI2Cではないので今回は使いません。
from machine import Pin, I2C
import time
#from machine import SoftI2C #←今回は使いませんでした。
#外部ライブラリ
from ahtx0 import AHT20 #←温湿度センサー用。
#要否にかかわらずI2Cの0と1の2つのチャンネルともオブジェクト生成しました。
#パラメータ定義
channel_i2c0 = 0
channel_i2c1 = 1
sda_i2c0 = Pin(16)
scl_i2c0 = Pin(17)
sda_i2c1 = Pin(14)
scl_i2c1 = Pin(15)
freq_i2c = 100000 #通信速度。動作確認用に遅くしただけでもっと速く可能。
timeout_i2c = 500000
#オブジェクト生成
i2c0 = I2C(channel_i2c0,
scl=scl_i2c0,
sda=sda_i2c0,
freq=freq_i2c,
timeout=timeout_i2c)
i2c1 = I2C(channel_i2c1,
scl=scl_i2c1,
sda=sda_i2c1,
freq=freq_i2c,
timeout=timeout_i2c)
#使用するI2Cデバイスのアドレス取得、表示。
#例AHT20:0x38,SSD1306:0x3C)
addr_result_scan_i2c0 = i2c0.scan() # I2C0 scanning
print( "I2C0 address is :" + str(addr_result_scan_i2c0) )
addr_result_scan_i2c1 = i2c1.scan() # I2C1 scanning
print( "I2C1 address is :" + str(addr_result_scan_i2c1) ) # print I2C1 address
#温湿度センサーAHT20のオブジェクト生成
#I2C1に繋いだI2Cマルチプレクサの先に2個同一アドレスのAHT20を接続、
#オブジェクト定義は1つでよい。
aht21 = AHT20(i2c1)
# disable all 8 channels I2Cマルチプレクサ全チャンネル閉鎖(初期化?)
i2c1.writeto(0x70, b'\x00')
i2c1.scan()
print(i2c1.scan())
# enable channel 0 (SD0,SC0) I2Cマルチプレクサチャンネル0を指定
i2c1.writeto(0x70, b'\x01')
print(i2c1.scan())
# [60, 112]
#温湿度取得、REPL表示
temp_now = aht21.temperature
humd_now = aht21.relative_humidity
aht20_record ="T" + str(round(temp_now,1)) + "H" + str(round(humd_now,1))
print(aht20_record)
# enable channel 1 (SD1,SC1) I2Cマルチプレクサチャンネル1を指定
i2c1.writeto(0x70, b'\x02') #以下、チャンネル1と全く同じコード
print(i2c1.scan())
# [60, 112]
temp_now = aht21.temperature
humd_now = aht21.relative_humidity
#print("temp:",temp_now," humd:",humd_now)
aht20_record ="T" + str(round(temp_now,1)) + "H" + str(round(humd_now,1))
print(aht20_record)
■結果
問題なく動作しました。
同一アドレスのI2Cデバイスをそのまま使用できるのでなにかと便利です。
電流容量の制限から、デバイス用の電源は別途引いてくるほうがよいと思います。
以上