本記事の内容
- Raspberry Pi PicoとSSD1306 OLEDディスプレイモジュールを使って、気圧・高度計を作製しました。
- 気温と気圧の測定はBMP180を使用しています。また、Raspberry Pi Pico特有のI2C通信エラーを防ぐ方法についても解説しています。
- 全体的に省電力な構成なので、単四電池駆動のハンディデジタル気温・気圧・高度計にしてみました。
※本内容をSeeeduino xiao RP2040とリポバッテリーでアレンジした内容は、以下の記事にまとめています。
必要なもの
- Raspberry Pi Pico:550円
- BMP180モジュール:190円
- KeeYees OLEDディスプレイモジュール SSD1306:560円
- 単四電池×4本ケース:140円
KeeYees OLEDディスプレイモジュール SSD1306は初めて使いましたが、文字が小さすぎることを除くと、値段と性能は非常に良いものでした。
今回は電池で駆動させるため、単四電池×4本ケースも用意しています。Amazonなどのネットショッピングでも購入できますが、こういった小型パーツは送料が不要な分、秋葉原の店頭の方が安く購入できます。
配線
Raspberry Pi Pico | SSD1306 OLEDディスプレイモジュール | BMP180 |
①GP0(I2C0 SDA) | SDA | |
②GP1(I2C0 SCL) | SCL | |
㊳GND | GND | GND |
㊱3V3(OUT) | VIN | VIN |
㉛GP26(I2C1 SDA) | SDA | |
㉜GP27(I2C1 SCL) | SCL |
ここで注意するべきポイントは、「BMP180」と「SSD1306ディスプレイモジュール」でRaspberry Pi Picoの異なるSPI通信を使用することです。
Raspberry Pi Picoには同時にI2C通信が2つ行えるように、I2C_0とI2C_1の二系統が用意されています。それぞれのピンの割り当ては以下の通りです。
SDA | SCL | |
I2C_0 | GP0, GP4, GP8, GP12, GP16, GP20 | GP1, GP5, GP9, GP13, GP17, GP21 |
I2C_1 | GP2, GP6, GP10, GP14, GP18, GP26 | GP3, GP7, GP11, GP15, GP19, GP27 |
今回は、SSD1306ディスプレイモジュールにI2C_0、BMP180にI2C_1が割り当たるように配線しました。あとは、㊱3V3(OUT)とGNDを共用して繋ぐだけです。
電池で駆動させる際は、㊴VSYSと㊳GNDを電池に繋いで、6V(直列×4本)をかけています。
プログラムコード
BMP180で気圧を測定して高度を計算するまでは、前回の記事と同じになります。
注意点としては、Githubのmicropython-bmp180からダウンロードしたbmp180.pyの47行目をコメントアウトさせることです。この作業を忘れると、I2C通信のエラーでRaspberry Pi Picoで気温と気圧を測定できません。
SSD1306ディスプレイモジュールの使い方は、こちらの方の記事を参考にさせていただきました。
が、Thonny IDEからmicropython-ssd1306をダウンロードしようにも、「Internal Error」で弾かれてしまう始末、、、
私のPCの設定が悪いのか、Thonny IDE経由でのダウンロードが既にできなくなったのか、、、仕方がないので、結局はGitHubからssd1306.pyをダウンロードして、いつも通りRaspberry Pi Picoにアップロードしました。
プログラムコードは下記の通りです。bmp.pyとssd1306.pyを読み込んで、I2C通信開始、5秒おきに気圧を測定してSSD1306ディスプレイモジュールに出力する仕組みです。
from ssd1306 import SSD1306_I2C
from bmp180 import BMP180
from machine import I2C, Pin
from utime import sleep
i2c = I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
i2c = I2C(1, sda=Pin(26), scl=Pin(27), freq=200000)
bmp180 = BMP180(i2c)
while True:
temperature = bmp180.temperature
pression = bmp180.pressure/1000.0
altitude = bmp180.altitude
oled.text("Temperature:", 0, 5)
oled.text("{:.1f} C".format(temperature), 10, 15)
oled.text("Pression:", 0, 25)
oled.text("{:.1f} kPa".format(pression), 10, 35)
oled.text("Altitude:", 0, 45)
oled.text("{:.1f} m".format(altitude), 10, 55)
oled.show()
sleep(5)
oled.fill(0)
oled.show()
ブレッドボード(一応は横17ピンのArduino用)と単四電池×4本ケースがちょうど収まるアクリルケースを100均で見つけたので、ケースに収納してみました。ポケットサイズの小型気温・気圧測定計となっております。
本当はスイッチをBMP180の右側に置いて、スイッチ押下で測定となるようにしたかったのですが、ブレッドボードの面積不足です。
とはいえこれ以上大きなブレッドボードとなると、ケースに入り切りません。ゆくゆくはRaspberry Pi Picoよりも小さなマイコンボードを活用して、更なる小型化を目指します。
まとめ
- Raspberry Pi PicoとBMP180、SSD1306 OLEDディスプレイモジュールを使って、デジタル気圧・高度計を作製しました。
- SSD1306 OLEDディスプレイモジュールは6行表示なのでちょうどピッタリですが、ロガーとして過去の記録も図示させると、いっそう面白いかもしれないですね。
コメント