【IC2は2系統可能?】Seeeduino xiaoでI2C通信を実行させる方法まとめ

Seeeduino xiao

本記事の内容

前回のADCに引き続き、Seeeduino xiao Wikiにも載っていない、裏ワザ紹介第二弾になります。今回は、Seeeduino xiao RP2040で2系統のI2C通信を実行させてみました。

「BMP180による温度気圧測定」と「OLEDディスプレイ出力」という2系統のI2C通信を同時に実現し、Raspberry Pi Picoよりもさらに小サイズ高効率の気圧高度センサーを作製しています。

Seeeduino xiao RP2040のI2C通信について

seeeduino-xiao-adc-summary-1
公式ページより加工

前回は、公式ページにも記載されていなかったADC(アナログデジタル変換)が、Seeeduino xiao RP2040の左上3ピンで実行可能なことを確認しました。

ここまで来て、感の良い人なら気づくでしょう。「ADCが使用できたのであれば、I2C通信もまだ隠されているのではないか!?

そうなんです。公式ページには、「I2C通信はP6とP7の一系統のみ実行可能」としか書かれていませんが、実はRaspberry Pi Picoのピン配置図と見比べると、P0とP1でI2C_0が利用可能なはずなんです。

Raspberry Pi Pico
公式ページより

ということで、本記事ではI2C通信が可能かどうか確かめてみました。※公式ページには書かれていない内容なので、あくまで自己責任でお願いします。

配線とIC2アドレスの確認

まずは、2つのI2C通信機器を接続して、MicroPythonでI2Cアドレスを確認してみます。これが読めれば、成功したも当然です。

配線は下図の通りです。OLEDディスプレイは正規のI2Cポート、BMP180は使えるであろうP0とP1に接続しています。

MicroPythonでIC2アドレスを確認するコードは、以下になります。ここでは、I2C_0とI2C_1を同時に確認してみました。

from machine import I2C,Pin
i2c0 = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
i2c1 = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)

addr0 = i2c0.scan()
print( "address is :" + str(addr0) )
addr1 = i2c1.scan()
print( "address is :" + str(addr1) )

上記の実行結果の通り、無事にI2Cアドレスを確認できました。すなわち、P0とP1を使用したI2C_0系統はSeeeduino xiao RP2040でも生き残っておりました。

気圧・高度計のさらなる小型化

以前は、Raspberry Pi PicoとOLEDディスプレイ、BMP180、単四電池4本を使用して、モバイル気圧・高度計を作製していましたが、こちらをSeeeduino xiaoでさらに小型化させたいと思います。

とはいえ、単純にRaspberry Pi PicoをSeeeduino xiao RP2040に置き換えても、単四電池ホルダーとブレットボードが大きすぎて、結局のところ小型化にはなりません。

ここで、Groveバッテリーシールドとリポバッテリーの出番です。なんと、Groveバッテリーシールドには、I2C_0用のピンがコネクタとして用意されています。I2C_0を使うことが前提のようなコネクタ準備で、驚きですね。

Seeeduino用グローブシャオと バッテリ 管理チップ 車 の リチウム 電池 充電 グローブ拡張 ボード モジュール

まずはOLEDディスプレイと同様に、BMP180もお手製でGroveコネクタ化させてしまいます。

KKHMF GY-68 圧力センサー,BMP180 BMP085 圧力気圧センサモジュールデジタルブルー [並行輸入品]

あとは、Groveバッテリーシールドの真ん中下「GND、3V3、TX-6、RX-7」のコネクタに、BMP180を繋ぐだけです。

一番左上の「GND、3V3、1、0」のコネクタに繋いでしまいそうですが、I2C_0とは違うピンに繋がってしまうので気を付けてください。ここでの1と0はMicroPythonのGPピンではなく、Groveバッテリーシールドでの1ピンと0ピンです。(要するに、GP26とGP27に繋がる)

プログラムコード

プログラムコードについては、以前のRaspberry Pi Picoのものと大差ありません。丁寧な解説を読みたい場合は、過去の記事を参考にしてください。

ライブラリのアップロード

BMP180とOLEDディスプレイを使用するには、それぞれのPythonライブラリをSeeeduino xiaoにアップロードする必要があります。

Bbmp180.pyはGithubのmicropython-bmp180より、ssd1306.pyはSeeeduino xiaoの公式ページからダウンロードできます。ダウンロードしたら、Thonny IDEで該当ファイルを開き、「Upload to /」でアップロードします。

bmp180.pyについては、47行目のコメントアウトを忘れずにしておきます。47行目が残っていると、”I2C operation not supported”でOSErrorになります。

メインコードの作成

基本的に、以前のRaspberry Pi Picoのものと変更はありません。バッテリー残量の表示は、お遊びです。

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from bmp180 import BMP180
from time import sleep

i2c0 = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
bmp180 = BMP180(i2c0)

i2c1 = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)
oled = SSD1306_I2C(128, 64, i2c1)

while True:
    #バッテリー残量の表示(お遊び)
    oled.rect(71,0,54,14,1)
    oled.fill_rect(68,5,3,4,1)
    oled.fill_rect(74,3,8,8,1)
    oled.fill_rect(84,3,8,8,1)
    oled.fill_rect(94,3,8,8,1)
    oled.fill_rect(104,3,8,8,1)
    oled.fill_rect(114,3,8,8,1)
    oled.show()
    
    temperature = bmp180.temperature
    pression = bmp180.pressure/1000.0
    altitude = bmp180.altitude
  
    oled.text("Temp:", 0, 8)
    oled.text("{:.1f} C".format(temperature), 10, 17)
    oled.text("Pression:", 0, 27)
    oled.text("{:.1f} kPa".format(pression), 10, 36)
    oled.text("Altitude:", 0, 47)
    oled.text("{:.1f} m".format(altitude), 10, 56)
    oled.show()

    sleep(5)

    oled.fill(0)
    oled.show()

実行結果

無事に、リポバッテリーからの給電のみで、BMP180で測定した気温と気圧を、OLEDディスプレイに表示させることができました。

100均の鉛筆削りケースに入れると、こんな感じです。ちょうどいいサイズのケースがこれしかありませんでした。

seeeduino-xiao-i2c-case

まとめ

Seeeduino xiao RP2040では、I2C_1に加えてI2C_0も使用できることが確認できました。

Groveバッテリーシールドと組み合わせて、I2C通信のBMP180で気温と気圧を測定し、同じくI2C通信のOLEDディスプレイで画面表示をする「超コンパクト・モバイル気圧高度計」が完成しました。

コメント