プログラムと電子工作・M5StickC Plus2が来た!
M5StickC Plus2
今さらですが、M5StickC Plus2 を買いました。
M5StickC Plus と何が変わったのかは、スイッチサイエンスの Webサイトに説明があります。ケースの色は明らかに異なりますね。
M5StickC(無印)、Plus、Plus2 のそれぞれでスケッチを書き換えるのは面倒です。スケッチを共通化できるのか調べてみました。
Arduino-IDE の準備
Arduino-IDE のメニュー「ツール」→ライブラリを管理… で、M5Unified と M5GFX をインストールしてください。
スケッチ
インクルードするヘッダファイルを <M5StickCPlus.h> から <M5Unified.h> に置き換えるだけで、けっこう行けそうです。
#include <M5Unified.h>
例えば、下記の hello.ino のスケッチは、M5StickC(無印)、Plus、Plus2 で同一です。
hello.ino
#include <M5Unified.h>
void setup() {
// 電源ON時に 1回だけ実行する処理をここに書く。
M5.begin(); /*M5を初期化する*/
M5.Lcd.setTextSize(2); /*文字サイズはちょっと大きめ*/
M5.Lcd.setRotation(3); /*上スイッチが左になる向き*/
M5.Lcd.print("Hello, World!");
}
void loop() {
// 自動的に繰り返し実行する処理をここに書く。
}
Arduino-IDE のメニューの次の 2点を変更するだけで、M5StickC(無印)、Plus、Plus2 を切り替えて、書き込めます。
メニュー「ツール」→ボード→M5Stack Arduino→<device>
<device>は、M5StickC、M5StickCPlus、M5StickCPlus2 のいずれかを設定します。メニュー「ツール」→シリアルポート→COM?
<device>が接続されている COMを指定します。複数表示されてどれか分からないときは、デバイス マネージャーのポート(COM と LPT)で確認できます。(Windows11では、スタートを右クリック)
これまでに投稿した記事について整理すると、次のようになります。
OS:Windows11
開発環境:Arduino-IDE 1.8.19
ライブラリ:M5Unified バージョン 0.1.14
Compile、テスト:M5StickC(無印)、M5StickC Plus、M5StickC Plus2 の順に
O:通った、△:条件付きで通った、X:別ソース、-:使用不可
========================================================================================
スケッチ #include Compile テスト 備考
----------------------------------------------------------------------------------------
hello M5Unified.h OOO OOO
blinky M5Unified.h OOO OOO
button M5Unified.h OOO OOO
mysketch-C M5Unified.h OOO OOO
webserver M5Unified.h OOO OOO
references M5Unified.h OOO OOO
line_notify M5Unified.h OOO OOO AXPはないのでLCDバックライト調整できない
wifisetup M5Unified.h OOO OOO 文字サイズ、行高などの設定のため、条件コンパイルが不可欠
alarmclock M5Unified.h XXX XXX M5.Beepがない
beep M5Unified.h XXX XXX alarmclockと同様
beep2 M5Unified.h △△△ OOO AXPはないのでLCDバックライト調整できない
dacwrite M5Unified.h △△△ OOO beep2と同様
dacwrite2 M5Unified.h △△△ OOO beep2と同様
pwm2 M5Unified.h △△△ OOO beep2と同様
========================================================================================
Xと△の原因は次のようになります。
M5.Beep
内蔵スピーカーを鳴らす alarmclock と beep が <M5Unified.h> ではコンパイルエラーになります。原因は M5.Beep がないためです。
次のように書き換えればコンパイルは通ります。内蔵スピーカーから音が出ます。
M5.Beep.begin() → M5.Speaker.setVolume(128)
M5.Beep.tone(freq) → M5.Speaker.tone(freq, period)
M5.Beep.mute() → M5.Speaker.stop()
setVolume(255) が最大音量のはずですが音が割れます。128くらいが関の山。また tone() は period を指定しないと鳴り続ける仕様のようです。delayMicroseconds() も必要です。何となくギクシャクします。
beep.ino(改)
//#include <M5StickCPlus.h>
#include <M5Unified.h>
/*(中略)*/
void setup() {
// 電源ON時に 1回だけ実行する処理をここに書く。
M5.begin(); /*M5を初期化する*/
M5.Lcd.setTextSize(2); /*文字サイズはちょっと小さめ*/
M5.Lcd.setRotation(3); /*上スイッチが左になる向き*/
M5.Lcd.println("beep");
Serial.begin(115200); /*デバッグ用のシリアル通信を初期化する*/
M5.Lcd.println("BtnA to play");
// M5.Beep.begin();
M5.Speaker.setVolume(128); /*0 off~255 max*/
}
/*(中略)*/
void playSound(const tone_t* tone, uint32_t length)
{
Serial.println("*** playSound()");
for (int i = 0; i < length; i++) {
Serial.printf(" freq: %f, period: %d\n", tone[i].freq, tone[i].period);
// 指定した周波数の音を出す。
if (0 < tone[i].freq) {
// M5.Beep.tone(tone[i].freq); /*set duty*/
M5.Speaker.tone(tone[i].freq, tone[i].period); /*set duty*/
}
else {
// M5.Beep.mute();
M5.Speaker.stop();
}
// 指定した時間待つ。
delayMicroseconds((uint32_t)(tone[i].period) * 1000);
}
// M5.Beep.mute();
M5.Speaker.stop();
}
M5.Axp
M5StickC Plus2 には電源管理IC AXP192 がないため、M5.Axp.ScreenBreath() がエラーになります。
液晶ディスプレイのバックライトの明るさは、M5.Display.setBrightness(n) で変えられます(n=0 バックライトOFF、n=255 最大)。(無印)、Plus と Plus2 では n が同じ数値でも明るさが全然異なります。結局、条件コンパイルが必要です。
参考
M5Unified の紹介
GitHub - m5stack/M5Unified
<M5Unified.h> の使用方法は、サンプルスケッチを参照
Arduino-IDE メニュー→ファイル→スケッチ例→M5Unified→Basic→HowToUse
ライセンス
このページのソースコードは、複製・改変・配布が自由です。営利目的にも使用してかまいませんが、何ら責任を負いません。
謝辞
福武教育文化振興財団から 2023年度助成をいただき製作しました。
この記事が気に入ったらサポートをしてみませんか?