本記事の内容
前回のADCに引き続き、Seeeduino xiao Wikiにも載っていない、裏ワザ紹介第二弾になります。今回は、Seeeduino xiao RP2040で2系統のI2C通信を実行させてみました。
「BMP180による温度気圧測定」と「OLEDディスプレイ出力」という2系統のI2C通信を同時に実現し、Raspberry Pi Picoよりもさらに小サイズ高効率の気圧高度センサーを作製しています。
Seeeduino xiao RP2040のI2C通信について
前回は、公式ページにも記載されていなかったADC(アナログデジタル変換)が、Seeeduino xiao RP2040の左上3ピンで実行可能なことを確認しました。
ここまで来て、感の良い人なら気づくでしょう。「ADCが使用できたのであれば、I2C通信もまだ隠されているのではないか!?」
そうなんです。公式ページには、「I2C通信はP6とP7の一系統のみ実行可能」としか書かれていませんが、実はRaspberry Pi Picoのピン配置図と見比べると、P0とP1でI2C_0が利用可能なはずなんです。
ということで、本記事では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を使うことが前提のようなコネクタ準備で、驚きですね。
まずはOLEDディスプレイと同様に、BMP180もお手製でGroveコネクタ化させてしまいます。
あとは、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 RP2040では、I2C_1に加えてI2C_0も使用できることが確認できました。
Groveバッテリーシールドと組み合わせて、I2C通信のBMP180で気温と気圧を測定し、同じくI2C通信のOLEDディスプレイで画面表示をする「超コンパクト・モバイル気圧高度計」が完成しました。
コメント