[番外(5と6の間)] UIFlowとM5GOでプログラミング - RTC Unit
StickC Plusでは、反復の学習にRTCを使用しましたが、M5GOはRTCが内蔵されていないので、標準でRTCを用いることはできません。
反復の概念の導入にあたって、反復の必要性が実感できるのは、更新が入ったときに現状を反映させる必要がある例に遭遇したときで、ここ何年かM5StickC Plusを使用して「反復」について何回も教えていく中で、それには時刻を扱うRTCが最適ではないかと個人的には結論づけています。
…が、M5GOではいくつかの課題点がありそうですので、見送るつもりでいます。
M5StickC Plus搭載のRTCと、M5GOでRTC Unitを使用した場合とを比較した際の課題と利点は次のようになります。
【課題】
M5GOでRTCを使用するためには、Unitで追加する必要がある
年、月、日、時、分、秒を単独で取得するブロックはあるものの、日時ブロックのような、まとめて取得するブロックがない
バッテリ駆動の場合、センサとの通信を失敗してI2C bus errorが出ることがあること(更新頻度を落とすか、Type-C電源供給時は大丈夫)
【利点】
曜日を設定・取得できる
アラームと、タイマーを設定できる
RTC Unit自体が電池内蔵なので、本体のバッテリーが無くなっても時刻を保持できる
あたりでしょうか。
課題点を1つ1つ説明していきます。
(課題1)M5GOでRTCを使用するためには、Unitで追加する必要がある
標準では搭載されていないため、外付けの形でUnitを追加する必要があります。Unitの追加に関しては、プログラミングの基本3要素の「反復」の導入に使うとしては、事前に理解する必要が必ずしもない(M5製品独特の要素)ため、可能なら後回しにしたい部分です。
ただ、難しくはないので、別に他の要素が問題にならないのであれば、さらっと導入する判断になるのですが…。
(課題2)年、月、日、時、分、秒を単独で取得するブロックはあるものの、日時ブロックのような、まとめて取得するブロックがない
「反復」の導入に使うには、わりとここが致命的です。
実際にブロックの比較をしてみます。左(黃)がM5StickC Plus内蔵のRTCブロック、右(ピンク)がRTC UnitのRTCブロックです。
M5StickC Plusの方には「日時」ブロックがあり、ここまで学習した内容だけで(2024,10,26,12,34,56)みたいな表示ができるのですが、
RTC Unitにはないため、同様の表示をさせようとすると、ラベルを複数配置し、それぞれに年、月、日、時、分、秒を単独で取得して表示させるしかありません。
まぁ、やってやれなくはないですが、これだけにラベルを6つ用意してそれぞれ別のパラメータを表示させるのはちょっと作業感があります。
かといって、seconds、minutesだけだといまいち時刻感が出ません。
ラベル1つだけで、M5StickC Plusの「日時」ブロックのように示すなら、全く同じではありませんが、テキスト連結で無理に表示することもできますが、相当面倒ですし、
リストを使用して以下のようにもできますが、リストも序盤で導入するにはちょっと敷居が高いです。
ちなみに、ちゃんと日時文字列を生成するなら変数も使ってこんな感じでしょう。なお、「リストからテキストを作る」ブロックは、型変換も考えないとエラーが出ます。
(課題3)バッテリ駆動の場合、センサとの通信を失敗してI2C bus errorが出ることがある
RTCを「反復」の導入に使用するなら「ずっと」ブロックで、現在時刻を更新し続けるようにする展開にするのですが、バッテリ駆動で動かすと、I2Cエラーが出ました。
Type-C給電時は起きません。多分連続してRTC Unitから値を読むようにすると、電圧が下がるか何かで通信がうまくいかないのだと思いますが…。タイマーを入れて更新頻度を500ミリ秒以上にすると、エラーは激減、ただ、1500ミリ秒でもたまにエラーが起きたりと、安定はしませんでした。給電の上、プログラムを走らせれば問題はないのですが、ただ、原理的に本質的な部分以外でエラーが出る可能性があるプログラムで授業を展開するのは特に初期段階では避けたいです。
ということで、RTCを用いた「反復」の概念の導入はM5GOにおいては避けたほうが無難ではないかと感じています。
この記事が気に入ったらサポートをしてみませんか?