koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

M5Stack CoreInk を買った直後の感想と躓きポイント

これを買った。

www.switch-science.com

M5Stack Docs - The reference docs for M5Stack products.

感想など

M5Stackにはその発売当初からそれなりに興味があったのだけれど、当時は買おうと思うと売り切れていて、そのうち興味が薄れていた。今回ディスプレイが電子ペーパーの新商品が出たのでいい機会なので試してみた形だ。

画面があるし何か表示したいのでお約束として温湿度は出しておくか、と M5Stack用環境センサユニット ver.2(ENV II) - スイッチサイエンス も併せて注文した。

とりあえずセンサーでとれる値を画面(電子ペーパー)に表示してみたのだけれど、想像していた通り体験が良い。ボタンもあるし、インターネットにも繋がるし、いろいろ遊べそうだ。

f:id:koudenpa:20201114232328j:plain
繋いだセンサーからの取得値をサッと表示できる。

やったこと・躓きポイント

形態

Arduino IDE向けスケッチでやっている。スケッチはGitHubに放置している。

UIFlowもそのうち触ってみたいとは思う。

github.com

Grove(HY2.0-4P)端子のピン

CoreInkには下部にGrove端子が1つついているのだけれど、ESP32のI2Cの端子(SDA=21, SDL=22)ではなくてGPIOの32, 33番ピンを使う構成になっている。

なので Wire.begin する際には引数なし(デフォルト指定)ではなく、ピン番号を指定する必要があった。

// Grove for M5Stack CoreInk
Wire.begin(32, 33);

何も考えないでWire.beginしていたらI2Cデバイスをスキャンしてもセンサーが出てこなくてしばらく???状態だった。

BMP280ライブラリのアドレス指定

買ったセンサーにはSHT30とBMP280という2つのセンサーが繋がっているらしかった。とりあえず見知ったBMP280からデータを取得しようとしたらコンパイルエラーした。

ライブラリとして何となくGrove_BMP280を使って、デバイスのアドレスがライブラリのデフォルトの0x77でなくて0x76だったので指定したのだけれどこんな感じだった。

GitHub上でソースコードを見ると初期化メソッドのシグネチャbool init(int i2c_addr = BMP280_ADDRESS);なのだけれど、Arduino IDEでインストールしたものを見ると確かにbool init(void);になっていた。

深く考えることはしないで使うライブラリをAdafruit_BMP280に変えてしまった。

こちらは素直にアドレス指定できた。

EEPROM の使い方

2020-11-27追記。

ArduinoにはEEPROMというライブラリが整備されていて、簡単にFlashメモリを読み書きすることができる。のだけれどこれをすんなりはできなかった。

上の文でリンクしている先はArduinoのものだけれど、M5Stackに載っているESP32系のチップセット向けはそれとは別の実装のライブラリだ。

買った当初はこんなことをつぶやいていた。

どうも比較的最近このライブラリの実装、初期化の仕方が変わったっぽくて適当にググった古いバージョンの情報と新しくなった使い方をごっちゃにして試して失敗していたような感じがする。

今となっては何で読み書きできなかったか迷宮入りしている。なんも覚えてない。

追記している現在では必要とする容量を指定して初期化、その後その要領の範囲で読み書きすることでEEPROMを使用できている。

#include <EEPROM.h>

const int eepromSize = 1000;
const int hostIdVersionAddress = 0;

// ~~setup()
if (!EEPROM.begin(eepromSize))
{
    Serial.println("failed to initialise EEPROM"); delay(1000000);
}
// ~~get/put
EEPROM.get(hostIdVersionAddress, hostIdVersion);
EEPROM.put(hostIdVersionAddress, currentHostIdVersion);
EEPROM.commit();

記事のタイトル通り躓いていたが動けばよし。

ちなみに、ESP32においてはEEPROMは非推奨で、Preferencesを使えとのことらしい。そのうち置き換えようかな。