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
300
M5Stack に色々な M5ユニットをつないで扱う為の新たなアプローチ
M5JPTour2024 にて発表した M5UnitUnified の資料です
GOB
September 24, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
230
Why Spring Matters to Jakarta EE - and Vice Versa
ivargrimstad
0
1.1k
Macとオーディオ再生 2024/11/02
yusukeito
0
260
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
660
CPython 인터프리터 구조 파헤치기 - PyCon Korea 24
kennethanceyer
0
250
Sidekiqで実現する 長時間非同期処理の中断と再開 / Pausing and Resuming Long-Running Asynchronous Jobs with Sidekiq
hypermkt
6
2.8k
Quine, Polyglot, 良いコード
qnighy
3
490
Pinia Colada が実現するスマートな非同期処理
naokihaba
2
170
デプロイを任されたので、教わった通りにデプロイしたら障害になった件 ~俺のやらかしを越えてゆけ~
techouse
52
33k
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
380
Content Security Policy入門 セキュリティ設定と 違反レポートのはじめ方 / Introduction to Content Security Policy Getting Started with Security Configuration and Violation Reporting
uskey512
1
440
[PyCon Korea 2024 Keynote] 커뮤니티와 파이썬, 그리고 우리
beomi
0
120
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
37
1.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
231
17k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Typedesign – Prime Four
hannesfritz
39
2.4k
Building Adaptive Systems
keathley
38
2.2k
KATA
mclloyd
29
13k
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.2k
Adopting Sorbet at Scale
ufuk
73
9k
Designing for humans not robots
tammielis
249
25k
Rails Girls Zürich Keynote
gr2m
93
13k
What's in a price? How to price your products and services
michaelherold
243
12k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
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!