I2CマルチプレクサーTCA9458を使って、同一アドレスの7セグ4桁LED4つ使いをやるつもりでしたが、、、安価な7セグ4桁LEDに搭載のTM1637は実はI2Cではない、ということで、とりあえず目的そのものとは合致しませんが、I2Cの温湿度センサーを2つ使ってI2Cマルチプレクサーの動作を確認しました。

 

■環境

・RaspberryPi PICO W

・micropython

・Windows11+Thonny

・I2Cマルチプレクサーモジュール

    
・温湿度センサーAHT20 2個、同一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デバイスをそのまま使用できるのでなにかと便利です。
電流容量の制限から、デバイス用の電源は別途引いてくるほうがよいと思います。
 

以上