Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
M5Stack に色々な M5ユニットをつないで扱う為の新たなアプローチ
Search
GOB
September 24, 2024
Programming
0
500
M5Stack に色々な M5ユニットをつないで扱う為の新たなアプローチ
M5JPTour2024 にて発表した M5UnitUnified の資料です
GOB
September 24, 2024
Tweet
Share
More Decks by GOB
See All by GOB
M5UnitUnified 最新動向 2025/05
gob
0
120
Other Decks in Programming
See All in Programming
インプロセスQAにおいて大事にしていること / In-process QA Meetup
medley
0
130
State of Namespace
tagomoris
5
2.4k
オープンソースコントリビュート入門
_katsuma
0
120
RubyKaigi Dev Meeting 2025
tenderlove
1
1.2k
Empowering Developers with HTML-Aware ERB Tooling @ RubyKaigi 2025, Matsuyama, Ehime
marcoroth
2
940
Serving TUIs over SSH with Go
caarlos0
0
500
iOSアプリで測る!名古屋駅までの 方向と距離
ryunakayama
0
140
By the way Google Cloud Next 2025に行ってみてどうだった
ymd65536
0
110
Thank you <💅>, What's the Next?
ahoxa
1
590
REALITY コマンド作成チュートリアル
nishiuriraku
0
120
Ruby on Railroad: The Power of Visualizing CFG
ydah
0
280
Cursor/Devin全社導入の理想と現実
saitoryc
28
21k
Featured
See All Featured
Scaling GitHub
holman
459
140k
Faster Mobile Websites
deanohume
306
31k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Documentation Writing (for coders)
carmenintech
69
4.7k
Done Done
chrislema
184
16k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The Language of Interfaces
destraynor
157
25k
How STYLIGHT went responsive
nonsquared
100
5.5k
Producing Creativity
orderedlist
PRO
344
40k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
19
1.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
29
5.7k
Transcript
1 M5UnitUnifed M5UnitUnifed M5Stack に 色々なM5ユニットをつないで扱う為の 新たなアプローチ 2024/Sep. GOB (X:
@GOB_52_GOB)
2 M5UnitUnifed 自己紹介 • ハンドルネーム GOB (ごぶ) X: @GOB_52_GOB •
ゲーム業界を中心に活動 • 30 年以上、有名無名タイトル色々やってました フリーランスとなってからは 20年以上経ちました • 2020年頃 M5Stack を知り、色々作って遊び始める ゲーム作ったり自作ライブラリ書いたりしているうちに沼へ • 2024年春、M5Stack 様のお仕事として当ライブラリの作成を始める
3 M5UnitUnifed 従来のユニットの扱い方 • 各ユニット毎に公式、M5製、個人のライブラリを使用して 計測データの取得や設定を行う
4 M5UnitUnifed 従来のユニットの扱い方 • API や設計思想等がまちまちで、それぞれ独自のルールを知ら なければいけない ※特定のライブラリを揶揄するものではありません
5 M5UnitUnifed 従来のユニットの扱い方 • API や設計思想等がまちまちで、それぞれ独自のルールを知ら なければいけない ※特定のライブラリを揶揄するものではありません 開始は begin
値取得は uint8_t GetHoge(); 設定は void SetHoge(const int a); 返り値が特定の値ならエラーとみなせるよ! Wire は begin の中で僕が開始!
6 M5UnitUnifed 従来のユニットの扱い方 • API や設計思想等がまちまちで、それぞれ独自のルールを知ら なければいけない 開始は start 値取得は
err_t readHoge(uint8_t& c); 設定は err_t writeHoge(const uint8_t c) 返り値には私独自のエラーコードが返ります Wire は begin 済みのものを頂きたい ※特定のライブラリを揶揄するものではありません 開始は begin 値取得は uint8_t GetHoge(); 設定は void SetHoge(const int a); 返り値が特定の値ならエラーとみなせるよ! Wire は begin の中で僕が開始!
7 M5UnitUnifed 従来のユニットの扱い方 • API や設計思想等がまちまちで、それぞれ独自のルールを知ら なければいけない 開始は start 値取得は
err_t readHoge(uint8_t& c); 設定は err_t writeHoge(const uint8_t c) 返り値には私独自のエラーコードが返ります Wire は begin 済みのものを頂きたい API 何か呼んだら開始するだぶー 値取得は void hoge_get(int* p); 設定は void hoge_set(int b); エラーなんか知らないぶー Wire0 を決め打ちで使うぶー ※特定のライブラリを揶揄するものではありませんよ? 開始は begin 値取得は uint8_t GetHoge(); 設定は void SetHoge(const int a); 返り値が特定の値ならエラーとみなせるよ! Wire は begin の中で僕が開始!
8 M5UnitUnifed 従来のユニットの扱い方 • 各ライブラリが I2C 等との通信関数を独自に扱っていて、機能 も性能も異なる ※特定のライブラリを揶揄するものではありません
9 M5UnitUnifed 従来のユニットの扱い方 • 各ライブラリが I2C 等との通信関数を独自に扱っていて、機能 も性能も異なる 外部から関数ポインタで渡してね! それにバグがあっても知らないよ!
仕様? コード見て推測してね! ※特定のライブラリを揶揄するものではありません
10 M5UnitUnifed 従来のユニットの扱い方 • 各ライブラリが I2C 等との通信関数を独自に扱っていて、機能 も性能も異なる 細かい通信制御も可能です もっとも内部では
そこまで細かく使っていませんがね 外部から関数ポインタで渡してね! それにバグがあっても知らないよ! 仕様? コード見て推測してね! ※特定のライブラリを揶揄するものではありません
11 M5UnitUnifed 従来のユニットの扱い方 • 各ライブラリが I2C 等との通信関数を独自に扱っていて、機能 も性能も異なる 細かい通信制御も可能です もっとも内部では
そこまで細かく使っていませんがね 僕のチップとの間だけで動けばいいんだぶー 適当な実装だけど動いているからいいんだぶー 外部から関数ポインタで渡してね! それにバグがあっても知らないよ! 仕様? コード見て推測してね! ※特定のライブラリを揶揄するものではありませんってば
12 M5UnitUnifed 従来のユニットの扱い方 • かつての M5Core のライブラリ群のようなカオスな状況!
13 M5UnitUnifed 統一化(Unifed)しようぜ! M5Core ライブラリ群が M5Unifed (作:らびやんさん)によって統一化され、 便利になったように統一化できないか? 既存プログラム資産には影響を与えてはいけない では新規で作りましょう!
14 M5UnitUnifed 統一化(Unifed)しようぜ! • API を統一化 書式も含めて一貫性のあるものにする • 通信を統一化 通信部分はユニットによらず共通な物を使う
• ライセンスを統一化 ライセンス感染をさける
15 M5UnitUnifed その1 API 統一化 • ベースとなる親クラス(UnitComponent)を制定し、各ユニット のクラスはその派生として、各ユニットのインスタンスを同様に扱 えるようにします
16 M5UnitUnifed その1 API 統一化 • 個々のセンサーに依存する部分については統一化できませんが、 API 名は系統毎に統一化します •
センサーの値の取得と設定 bool readHoge(uint8_t& val) (センサーの現在値の取得) bool writeHoge(const uint8_t val) (センサーの変化を伴う値の 設定) set()/get()/propertyname() 等はセンサーに影響を受けない/与 えない
17 M5UnitUnifed その1 API 統一化 • 定期計測、データの保持、取得、破棄等を統一化します • bool startPeriodicMeasurement(Args&&...
args) 定期計測開始 (args はユニット毎に異なるパラメータ群) • bool updated() 計測更新されたか? • size_t available() 内部循環バッファに蓄積された計測データがいくつ存在する? • T oldest() 最も古い蓄積データ取得(返却型はユニットによって異なる) • void discard() 最も古い蓄積データの破棄 • etc...
18 M5UnitUnifed その1 API 統一化 • 個々のユニットの動作開始(Units.begin時)の初期パラメータ 設定(内容はユニット毎に相違) auto cfg
= unit.confg(); cfg.start_periodic = false; cfg.sampling_rate = 100; unit.confg(cfg);
19 M5UnitUnifed その1 API 統一化 • 全てのユニット共通の開始設定 auto ccfg =
unitFoo.component_confg(); ccfg.stored_size = 8; // 循環バッファ最大要素数 ccfg.clock = 400 * 1000; // アクセスクロック unitFoo.component_confg(ccfg);
20 M5UnitUnifed その1 API 統一化 • 各ユニットクラスのインスタンスは循環バッファ(初期蓄積可能要 素数は基本的に 1)を持っています •
FIFO を持っているチップ等、初期状態で複数データを蓄積でき る物も存在します
21 M5UnitUnifed その1 API 統一化 • 蓄積データの取得例 while(unit.available()) { // データがある?
auto data = unit.oldest(); // 最古のデータ M5_LOGI(“%f,%d”, data.foo(), data.bar()); unit.discard(); // 最古のデータ破棄 } • この辺りはできるだけ馴染みのある書き方で、使用できるように していきたいと考えています
22 M5UnitUnifed その1 API 統一化 • どのユニットでもこのように書ける(はず) m5::unit::UnitUnifed Units; m5::unit::UnitFoo
unitFoo; void setup() { // 初期化済み Wire を使って接続 Units.add(unitFoo, Wire); Units.begin(); // add された unit の開始 } void loop() { Units.update(); // add された unit の更新 if(unitFoo.updated()) { // 計測更新された? M5_LOGI(“%d”, unitFoo.oldest().foo()); //計測された値 } }
23 M5UnitUnifed その2 接続統一化 • 本体とユニットとの接続には多種の方式があります。事前設定 や、扱い方に違いがあり、これもまちまちです。 • SPI /
I2C / GPIO / UART 等、本体とユニット間の接続種別 を意識せず、透過的に使用できるようにするのが目標です 将来的には M5HAL との連携により実現される予定です • 2024/Sep.現在 TwoWire ベースのみサポート中
24 M5UnitUnifed その2 接続統一化 • 残念ながらPnP(自動検出と自動設定)ではありませんが、実際 の接続同様の構成をソースコード上で記述する事で使用すること ができます • PaHub/PbHub等、別のユニットを複数接続することが前提と
なるユニットとの接続を簡易化、統一化します
25 M5UnitUnifed その2 接続統一化 • 実際の接続状況をそのままのイメージで記述 m5::unit::UnitUnifed Units; m5::unit::UnitPaHub2 unitPaHub;
m5::unit::UnitVmeter unitVmeter; m5::unit::UnitTVOC unitTVOC; if (!unitPaHub.add(unitVmeter, 0) /* Vmeter を PaHub2 ch:0 へ接続 */ || !unitPaHub.add(unitTVOC, 1) /* TVOC を PaHub2 ch:1 へ接続 */ || !Units.add(unitPaHub,Wire) /* PaHub を本体へ接続 || !Units.begin() /* M5UnitUnifed 始動 */ ) { M5_LOGE("Failed to add or begin"); }
26 M5UnitUnifed その3 ライセンス統一化 • M5 ではライブラリは MIT ライセンス下で提供されます •
外部ライブラリは GPL や独自ライセンスのものがあり、商用利 用や、改変に対して不都合なものがあります • M5UnitUnfed 並びに関連するライブラリは MIT ライセンス 下にて提供します • チップ公式のクローズドなバイナリを併用する場合は、依存ライブ ラリのライセンスに留意が必要です(e.g. Bosch BME688 BSD-3-Clause)
27 M5UnitUnifed その4 その他 • UnitTest (PlatformIO 上で googleTest による)
を関連 ライブラリに搭載し、リグレッションを起こしづらくします • コードスタイル(書式)を統一化し、読解しやすくします • Doxygen による API ドキュメントを GitHub Pages にて公 開します
28 M5UnitUnifed 現在の M5UnitUnifed • TwoWire を使用した I2C 接続のみサポート •
対応ユニット UnitCO2 UnitENVIII UnitENVPro UnitV/Ameter UnitKmeterISO UnitHEART UnitTVOC UnitGESTURE UnitPaHub2
29 M5UnitUnifed 現在の M5UnitUnifed • ライブラリ依存関係 UnitA UnitB Unit... M5UnitUnified
M5Utility M5HAL 各ユニットの共通親クラスと ユニット管理クラス 各ユニットのクラス 共通ユーティリティ ハードウェア抽象化レイヤ (開発中)
30 M5UnitUnifed M5UnitUnifed を使うには? • ArduinoIDE m5stack/M5UnitUnifed の GitHub リポジトリへ
git pull するか、 zip ファイルをダウンロードして、自分の環境 のライブラリフォルダへ展開しましょう 依存ライブラリ、各ユニット用ライブラリも同様に当該リポジトリ から取得展開してください
31 M5UnitUnifed M5UnitUnifed を使うには? • PlatformIO lib_deps= に、 M5UnitUnifed、 依存ライブラリ、各ユニット
用ライブラリを記述します(GitHub アドレス) 詳しくは各ユニットに付属の platformio.ini を参照
32 M5UnitUnifed M5UnitUnifed を使うには? • ArduinoIDE/PlatformIO ライブラリ登録はβ以降を予定し ています
33 M5UnitUnifed M5UnitUnifed を使うには? #include <M5UnitUnifed.h>//M5UnitUnifed 管理クラスと親クラス等 #include <M5UnitUnifedVmeter.h> //
各ユニット毎のクラス m5::unit::UnitUnifed Units; m5::unit::UnitVmeter unit; void setup() { M5.begin(); auto pin_num_sda = M5.getPin(m5::pin_name_t::port_a_sda); auto pin_num_scl = M5.getPin(m5::pin_name_t::port_a_scl); Wire.begin(pin_num_sda, pin_num_scl, 400000U /* clock*/); Units.add(unit, Wire); // 本体に Wire を使って繋ぎますよ Units.begin(); // では開始しましょう } void loop() { Units.update(); // 計測更新 if(unit.updated()) { // 値更新? M5_LOGI(“%f mV”, unit.voltage()); // 値表示 } }
34 M5UnitUnifed M5UnitUnifed の将来 • M5UnitUnifed 未対応ユニットのサポート • GPIO 接続、
UART 接続のサポート • M5HAL との連携 • ESP-IDF での動作サポート • 本体内臓センサー類の M5UnitUnifed 化 RTC / IMU etc... • M5Unifed との統合
35 M5UnitUnifed M5UnitUnifed の将来 • こんな感じになると素敵? (あくまでイメージですが) m5::unit::UnitHoge unitHoge{}; void
setup() { M5.Units.add(unitHoge, M5.PortA); M5.begin(); // Units も begin } void loop() { M5.update(); // Units も update if(unitHoge.updated()) { M5_LOGI(“%f”, unitHoge.oldest().foo()); } }
36 M5UnitUnifed ロードマップ的な何か • 2024/Sep. α版として公開 • 2024/Sep. 以降 未対応ユニットの対応作業
これは随時公開していく予定です • 2024/Sep. 以降 βに向けての作業 どの程度かかるか正直読めていませんが、季節単位で何らかの 大きな修正の反映を行えればと思っております • フィードバックの反映により、API 名称の変更、構成の変更が今 後十分あり得ます
37 M5UnitUnifed リポジトリURL • M5UnitUnfed https://github.com/m5stack/M5UnitUnifed • M5HAL (M5UnitUnfed との最低限の連携テスト段階)
https://github.com/m5stack/M5HAL • M5Utility https://github.com/m5stack/M5Utility • サポートされている各ユニットのリポジトリは M5UnitUnifed README よりたどってください • 公開準備中、公開時は X などでアナウンスします
38 M5UnitUnifed ご清聴ありがとうございます • 皆様からの忌憚のないご意見、ご要望、ご報告他頂けましたら幸 いです • 自らの意思を正確に表明できる言語で構いません(日本人であれ ば日本語でおk ジュワ!)
• ユニットに特化した物は各ユニットのリポジトリへの Issue / PR にてお願いいたします • ユニットによらない場合は、 M5UnitUnifed リポジトリで構い ません Have a happy coding!