Upgrade to Pro — share decks privately, control downloads, hide ads and more …

M5Unifiedの紹介

 M5Unifiedの紹介

2023年5月1日~5月5日、M5JPTour2023 にて使用したスライドです。
M5Stack公式ライブラリのM5Unifiedを紹介します。

らびやん

May 08, 2023
Tweet

More Decks by らびやん

Other Decks in Programming

Transcript

  1. 登壇者の自己紹介 ・ハンドルネーム : @lovyan03 / らびやん / 古井凡人 ・約25年程 Windows用

    業務アプリ開発の会社に在籍。 (稀にマイコン向け案件も…) ・2018年夏頃、個人的にM5Stackを購入、見事にハマる。 ・2020年春頃、自作のグラフィックライブラリ LovyanGFX を公開。 ・2021年春頃より、スイッチサイエンス経由で M5Stack製品のソフト開発を受託。 ・2023年4月、スイッチサイエンスに入社。
  2. M5StackをArduinoIDE環境で使用するには? (一般的に知られている手順) ・M5Stack + Arduino というキーワードで検索すると すぐ見つかる手順はこんな感じ。 ・ボードマネージャに Espressif 公式の

      (またはM5Stack公式の)  ボード定義をインストールする。 ・ライブラリマネージャで「 M5Stack」  ライブラリをインストールする。
  3. 複数の機種に対応するには? ・ボードマネージャの選択に応じて、  ARDUINO_M5STACK_Core2 のような  機種別のdefine値が自動生成される。 ・# if defined で値の有無を判定すれば、  機種別の分岐を作ることができる。

    ・うまく書ければ、ひとつのソースで  複数機種に対応することも …一応可能。 #if defined (ARDUINO_M5STACK_Core2) #include <M5Core2.h> #elif defined (ARDUINO_M5Stick_C) #include <M5StickC.h> #elif defined (ARDUINO_M5Stick_C_Plus) #include <M5StickCPlus.h> #else #include <M5Stack.h> #endif
  4. ・もちろん外付けスピーカにも対応。  ・HAT SPK  ・HAT SPK2  ・ATOMIC SPK  ・Module RCA  ・Module

    Display ・上記以外の独自に接続したスピーカも、  設定を少し記述すれば対応可能。 スピーカーが外付けの場合はどうなるの…?
  5. UIFlow も v2からM5Unifiedを採用 ・UIFlow (MicroPython) は ESP-IDF 用。Arduino ではビルドできない。 ・M5StackライブラリはArduino用。ESP-IDF

    ではビルドできない。 ・このため、Arduino用ライブラリとUIFlowの仕様には共通点がなく、別々のものだった。 ・一方、M5UnifiedならArduinoでもESP-IDFでもビルド可能。 ・ただし従来のUIFlowとは仕様が大きく変更となる …。 ・メジャーバージョンを刷新し、 M5Unifiedを採用したUIFlow2の開発をする運びとなった。
  6. M5Unifiedで複数の画面を使うには? ・複数の画面を使う場合は …  M5.getDisplayCount 関数で画面の数を取得し、  M5.Displays(番号). に対して操作を行えば OK。 #include <M5ModuleDisplay.h>

    #include <M5UnitLCD.h> #include <M5UnitOLED.h> #include <M5Unified.h> void setup() { M5.begin(); int c=M5.getDisplayCount(); for(int i=0;i<c;i++) { M5.Displays(i).print(i); } } Displays(0) Displays(1) Displays(2) Displays(3)
  7. M5Unifiedで音を鳴らすには? ・音の再生も共通に。 ・単純な音であれば、 M5.Speaker.tone 関数。  引数1で周波数、引数2で再生時間を設定。 ・別タスクで動作するので自動的に止まる。 ・右の例はド・ミ・ソの3つの音を順に  500 msec間隔で開始、各音を2秒再生。

      ( 和音になります! ) ・最大8音まで重ねることが可能。 #include <M5Unified.h> void setup() { M5.begin(); M5.Speaker.tone(523.251, 2000); delay(500); M5.Speaker.tone(659.255, 2000); delay(500); M5.Speaker.tone(783.991, 2000); }
  8. M5Unifiedで後付けスピーカを使うには? ・外部スピーカを使用したい場合は M5.begin 関数の実行時に設定を行えば OK。 #include <M5Unified.h> void setup() {

    auto cfg = M5.config(); // 使用するスピーカに true を設定する cfg.external_speaker.hat_spk = true; cfg.external_speaker.hat_spk2 = true; cfg.external_speaker.atomic_spk = true; cfg.external_speaker.module_rca = true; cfg.external_speaker.module_display=true; M5.begin(cfg); }
  9. 複数機種に対応したコードを書くコツ (例:画面の縦横比で配置を変えるには?) ・より実践的には…  分岐の中では座標計算のみを行う。 ・描画は分岐の外で行うと、一か所に纏められる。 ・さらに、描画処理を自作関数化しておくと、  呼び出し側の記述をシンプルにできます。 ・この例では fillRect1 と

    fillRect2 が自作関数。  関数内で、引数の座標に描画すれば OK! int w = M5.Display.width(); int h = M5.Display.height(); int x = 0, y = 0; if (w >= h) { w /= 2; // 描画幅を半分に x = w; // X座標を変更 } else { h /= 2; // 描画高さを半分に y = h; // Y座標を変更 } fillRect1(0, 0, w, h); fillRect2(x, y, w, h);
  10. ・M5.getBoard関数で機種別に分岐を作れば OK! ・StickC/CPlusの場合のみ判定内容を変えて、  PWR = 左移動 A = 決定 B

    = 右移動 とする。 A B C A B C A B PWR HAT PWR 複数機種に対応したコードを書くコツ (例:操作方法を共通化するには?) switch (M5.getBoard()) { case m5gfx::board_M5StickC: case m5gfx::board_M5StickCPlus: // StickC/CPlus用の操作判定 // PWR=左移動,A=決定,B=右移動 break; default: // それ以外の機種用の操作判定 // A=左移動,B=決定,C=右移動 break; }