Raspberry Pi PicoとSSD1306で気圧・高度計を作製する

pico-ssd1306Raspberry Pi

本記事の内容

  • 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 PicoSSD1306 OLEDディスプレイモジュールBMP180
①GP0(I2C0 SDA)SDA
②GP1(I2C0 SCL)SCL
㊳GNDGNDGND
㊱3V3(OUT)VINVIN
㉛GP26(I2C1 SDA)SDA
㉜GP27(I2C1 SCL)SCL

ここで注意するべきポイントは、「BMP180」と「SSD1306ディスプレイモジュール」でRaspberry Pi Picoの異なるSPI通信を使用することです。

Raspberry Pi Picoには同時にI2C通信が2つ行えるように、I2C_0とI2C_1の二系統が用意されています。それぞれのピンの割り当ては以下の通りです。

SDASCL
I2C_0GP0, GP4, GP8, GP12, GP16, GP20GP1, GP5, GP9, GP13, GP17, GP21
I2C_1GP2, GP6, GP10, GP14, GP18, GP26GP3, 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均で見つけたので、ケースに収納してみました。ポケットサイズの小型気温・気圧測定計となっております。

pico-ssd1306

本当はスイッチをBMP180の右側に置いて、スイッチ押下で測定となるようにしたかったのですが、ブレッドボードの面積不足です。

とはいえこれ以上大きなブレッドボードとなると、ケースに入り切りません。ゆくゆくはRaspberry Pi Picoよりも小さなマイコンボードを活用して、更なる小型化を目指します。

まとめ

  • Raspberry Pi PicoとBMP180、SSD1306 OLEDディスプレイモジュールを使って、デジタル気圧・高度計を作製しました。
  • SSD1306 OLEDディスプレイモジュールは6行表示なのでちょうどピッタリですが、ロガーとして過去の記録も図示させると、いっそう面白いかもしれないですね。

コメント