RP2350-GEEKを購入 ~ 液晶とSDスロットが付いたRP2350互換機

Raspberry Pi Pico 2 が出ているので購入しようと思ったのですが、RP2350を搭載したRP2350-GEEKが安いので購入してみました。
1.ハードウェア

RP2350-GEEKにはコンパクトな筐体に1.14インチ液晶画面とSDカードスロットが付いています。その代わりに入出力(GPIO)が6つしか用意されていないことには注意です。インタフェイスには、I2C/UART/ADCが用意されています。なお、液晶をSPIで使用しています。
詳しくは、公式サイトで
今回は、RP2350-GEEKにBME280センサーを付けて気圧、温度、湿度を測定してみます。
使用したものは4つのピンがあるタイプですが、6ピンタイプの方が今は安く売られているようです。
RP2350-GEEKとBME280センサーは、以下のように接続します。左がBME280センサーで、右がRP2350-GEEKです。
VIN -> 3V3
GND -> GND
SDA -> GP28
SCL -> GP29
BME280センサーは5V電源で動作するので、RP2350-GEEKが提供する3.3Vでは電圧が足りません。そのため、今回の動作が正しくない可能性があります。ご了承ください。(大丈夫そうではあるが)
こういうところが、RP2350-GEEKの弱い部分ですね。コンパクトになった分、制約がいろいろあります。(後ほど詳しく)
2.プログラム
気圧、温度、湿度、高度を表示するプログラムを作成します。液晶のドライバはST7789で、外付けした時と同様にプログラムします。Arduino IDEのボードには「Raspberry Pi Pico 2」を選択します。各種ライブラリはライブラリマネージャーでインストールしておいてください。
// BME280で気圧高度計
#include <Adafruit_GFX.h> // Adafruitのグラフィックスライブラリ
#include <Adafruit_ST7789.h> // ST7789液晶ディスプレイ用のライブラリ
#include <SPI.h> // SPI通信を行うためのライブラリ
#include <Adafruit_BME280.h> // BME280用のライブラリ
#define TFT_CS 9 // TFT液晶のCSピン
#define TFT_DC 8 // TFT液晶のDCピン
#define TFT_MOSI 11 // TFT液晶のMOSIピン
#define TFT_SCK 10 // TFT液晶のSCKピン
#define TFT_RST 12 // TFT液晶のRSTピン
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSansBold18pt7b.h>
// ST7789 インスタンス
Adafruit_ST7789 tft = Adafruit_ST7789(&SPI1, TFT_CS, TFT_DC, TFT_RST);
// BME280インスタンス
Adafruit_BME280 bme;
// 高度の取得
float getAltitude(float wkTemp, float wkPress) {
float wkAltitude = 0;
float seaAltitude = (float)1013.25 ;
float PressJyou = (float)1 / (float)5.257 ;
float wkPressHi = seaAltitude / wkPress ;
float wkPress2 = powf(wkPressHi, PressJyou) ;
wkPress2 = wkPress2 - (float)1 ;
float wkTemp2 = wkTemp + 273.15 ;
wkAltitude = wkPress2 * wkTemp2 / (float)0.0065 ;
return wkAltitude ;
}
void setup() {
// put your setup code here, to run once:
// SPI1初期設定(TFT液晶用)
SPI1.setSCK(TFT_SCK); // TFTのSCK (GP10)
SPI1.setTX(TFT_MOSI); // TFTのMOSI (GP11)
// 出力端子初期設定
pinMode(25, OUTPUT); // TFTバックライト用端子
digitalWrite(25, HIGH); // TFTバックライト点灯
// TFT液晶の初期設定
tft.init(135, 240); // TFT初期化(画面サイズ指定)
tft.fillScreen(ST77XX_BLACK); // 背景の塗りつぶし
tft.setRotation(3); // 画面回転
// フォントの設定
tft.setTextSize(1); // 文字サイズ
tft.setFont(&FreeSans12pt7b); // フォント
tft.setTextColor(ST77XX_GREEN); // 文字色
Wire.setSDA(28); // SDA GP28
Wire.setSCL(29); // SCL GP29
Wire.setClock(400000);
Wire.begin();
if (!bme.begin(0x76)){
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
void loop() {
// put your main code here, to run repeatedly:
char buff[256] ;
float temp, altitude, pressure, humid;
pressure = (float)bme.readPressure() / 100;
temp = (float)bme.readTemperature();
humid = (float)bme.readHumidity() ;
altitude = getAltitude(temp, pressure) ;
tft.fillScreen(ST77XX_BLACK); // 背景の塗りつぶし
sprintf(buff, "%4.2f m", altitude) ;
tft.setCursor(6, 20); // 表示開始位置
tft.println(buff);
tft.setCursor(6, 40); // 表示開始位置
sprintf(buff, "%4.2f hPa", pressure) ;
tft.println(buff);
tft.setCursor(6, 60); // 表示開始位置
sprintf(buff, "%3.2f C", temp) ;
tft.println(buff);
tft.setCursor(6, 80); // 表示開始位置
sprintf(buff, "%3.2f per", humid) ;
tft.println(buff);
delay(500);
}
高度は気圧から取得しているので、補正が必要です。高度を補正するボタンの追加が必要でしょう。

このように、単に並べて表示しただけなので視認性は良くありません。また、ちらつきがあるので、スプライトの対応も必要ですね。
3.RP2350-GEEKは、Picoのデバッグインターフェースに使える
Raspberry Pi Pico上のプログラムでデバッグする場合は、「デバッグプローブ」というハードウェアが必要になります。しかしながら、そのためにデバッグプローブを購入するのも面倒なので、もう一台のRaspberry Pi Picoをデバッグプローブにするという方法もあります。そして、RP2350-GEEKはRaspBerry Pi Pico互換ですから、デバッグプローブとして利用できます。
今回の購入したRP2350-GEEKは、デバッグプローブとして利用することが多いかもしれません。
4.RP2350-GEEKを何に使おう?
実は、RP2350-GEEKを購入したのはGPSロガーとして使おうと思ったからでした。RP2350-GEEKはUARTが使えますから、GPSセンサーにも容易に接続できると考えたからです。
ところが、受信がうまく行きません。何かライブラリのせいかもしれませんが、動作が不安定なのです。これはRaspberry Pi Picoでも起きていて、緯度経度、速度、進行方向、時刻は取得できるけど高度や衛星数が取れないなどが起きています。これは受信タイミングの調整が必要なようですが、一度頭を冷やしています。
そこで今回、I2Cを使ってみたわけですが、問題なく動作しました。しかしながら、取得したデータをSDカードに保存するにしても、時刻がありません。RP2350-GEEKにはWi-Fi機能がないため、時刻の取得が面倒です。そのため、GPSであれば時刻の取得ができるので、GPS用途と最初は考えたわけです。
時刻なしでディスプレイとSDカードを利用したプログラムとなると、意外にないものです。気圧の変動をグラフ化するのが一番かなと今は考えていますが、どうでしょうか。