[5187] M5StickC+obnizOSを使ってみる(2)

投稿:  著者:



《コードを見れば一目瞭然だが》

■クリエイター手抜きプロジェクト[647]
 IoT編 M5StickC+obnizOSを使ってみる(2)
 本体内蔵のLEDを点滅させる
 古籏一浩




━━━━━━━━━━━━━━━━━
■クリエイター手抜きプロジェクト[647]
IoT編 M5StickC+obnizOSを使ってみる(2)
本体内蔵のLEDを点滅させる

古籏一浩
https://bn.dgcr.com/archives/20210315110100.html

─────────────────

今回は、obnizOSで本体内蔵のLEDを点滅させてみます。前回と同様に、obniz社が提供するブロックエディタ(GUI)を使って作成していきます。

あれ? obniz社ではなく、CambrianRobotics社では? と気づいた人もいるかもしれませんが、3月1日に社名が変更され、製品名と同じになりました。

https://prtimes.jp/main/html/rd/p/000000029.000040376.html


obnizOS+M5StickCでの接続方法については、先週の記事を参照してください。

obnizOS+M5StickCの場合、obnizボードとはLEDの処理が異なります。obnizボードを使うときは本体にLEDを直接接続するか、ブレッドボードにLEDや抵抗を組み合わせて点灯させます。ブロックエディタで処理する場合、LED関係は「光る」のカテゴリ内にあります。

・ブレッドボード
https://www.switch-science.com/catalog/313/


obnizOS+M5StickCの場合は、M5StickC本体に赤色LEDが内蔵されているため、新たにLEDを購入したり接続したりする必要はありません。M5StickC本体のLEDを点灯させるには、ブロックエディタの「M5StcikC」のカテゴリ内にあるブロックを使います。

LEDの分類の中に「[m5]のLEDを光らせる」というブロックがあります。

これを使って、M5StickCのLEDを点灯させることができます。このブロックを、接続処理のブロックの直下に連結します。

[m5]の部分は、生成したobnizオブジェクトのインスタンス名を指定するので、必要に応じて変更します。

「実行」ボタンをクリックするだけで、M5StickCのLEDを点灯させることができます。

こういうテキストベースで説明する時に、GUI/ブロックエディタは、説明しにくいというデメリットがあります。ということで、ソースコードを以下に示します。

以後のコード内にある9999-9999の数値の部分は、使用しているM5StickCのobnizIDになります。何もプログラムが動いていない状態で、M5StickCの画面に表示される8桁の番号です。これを指定してください。

なお、$("#bploading").text("RUNNING...");の行は、Webブラウザ画面に状況を表示するためのものなので削除しても問題ありません。

<script>
$("#bploading").text("RUNNING...");
(async function(){
var obniz;
obniz = new Obniz.M5StickC('9999-9999');
await obniz.connectWait();
obniz.led.on();
})();
</script>

点灯させたら、今度は点滅させてみます。点滅も専用のブロックがあるので、これを配置します。このブロックは、単体で繰り返し点滅処理を行います。

注意しないといけないのは、繰り返し(ループ)のブロック内に、このLED点滅ブロックを入れると、期待通りに動作しません。ずっとLEDが点灯したままになります。

実際のソースコードは以下のようになります。

<script>
$("#bploading").text("RUNNING...");
(async function(){
var obniz;
obniz = new Obniz.M5StickC('9999-9999');
await obniz.connectWait();
obniz.led.blink(500);
})();
</script>

M5StickCには、2つのボタンがあります。上面にあるのがボタンA、向かって右側にあるのがボタンBです。ちなみに、左側にあるのは電源ボタンです。ブロックエディタから取得できるのは、ボタンAとボタンBです。

今度は、Aボタンが押されている間だけ、LEDを点灯させてみます。これは、点滅処理のブロックのように手軽ではありません。繰り返し処理を行なう、ループブロックが必要です。

無限に繰り返すので、「ループ」カテゴリ内にある「ずっと」ブロックを配置します。

このブロックの中に論理カテゴリ内にある「もしも<true>実行〜他〜」ブロックを入れ込みます。

これはIF...THEN...ELSE、if(...){...}else{...}など値が真(true)の時と偽(false)の時に処理するブロックです。

条件式には、M5StickCカテゴリ内にある「[m5]の[button A]が押されている」ブロックをはめ込みます。

そして、条件を満たした場合は「[m5]のLEDを光らせる」ブロックを、そうでない場合は「[m5]のLEDを消す」ブロックを入れ込みます。

実際のソースコードは、以下のようになります。下手な説明よりもコードを見た方が一目瞭然という気もしますが、コードを書かないでプログラムが作れるなら、その方が便利です。

<script>
$("#bploading").text("RUNNING...");
(async function(){
var obniz;
obniz = new Obniz.M5StickC('9999-9999');
await obniz.connectWait();
while (true) {
await ObnizUI.Util.wait(0);
if ((await obniz.buttonA.isPressedWait())) {
obniz.led.on();
} else {
obniz.led.off();
}
}
})();
</script>

作って実行すると、さすがにボタンAを押しっぱなしにするのは疲れます。M5SticKCは安いプラスチック製で、ボタンもあまり頻繁に押していると壊れてしまいます(根元からちぎれる)。

ということで、今度はボタンAを押したらLEDが点灯し、ボタンBが押されたら消灯するようにします。前のプログラムと似ていますが、論理ブロックは「もしも<true>実行」ブロックを使います。

ボタンAが押された場合はLEDを点灯、ボタンBが押された場合はLEDを消灯するブロックを、それぞれはめこみます。実際のソースコードは以下のようになります。

<script>
$("#bploading").text("RUNNING...");
(async function(){
var obniz;
obniz = new Obniz.M5StickC('9999-9999');
await obniz.connectWait();
while (true) {
await ObnizUI.Util.wait(0);
if ((await obniz.buttonA.isPressedWait())) {
obniz.led.on();
}
if ((await obniz.buttonB.isPressedWait())) {
obniz.led.off();
}
}
})();
</script>

今度は、ボタンAを押す度にLEDの点灯と消灯を、交互に切り替えるようにしてみます。ボタンAをトグルスイッチにするわけです。

obnizOSでは、M5StickCのLEDの点灯状態を知ることができません。そこで、変数flagを用意しLEDの点灯状態を入れておくことにします。値が0なら消灯状態、1なら点灯状態とします。

変数の作成は、「変数」のカテゴリをクリックすると、上部に「変数の作成...」というボタンが出てきますので、これをクリックします。変数名を入力し、OKボタンをクリックします。ここでは、flagという名前の変数にしました。

obnizOS+M5StickCに接続した直後に、変数flagに0を入れておきます。あとは、ボタンAが押されたら変数flagの値に応じてLEDの点灯、消灯を行います。

処理的には難しくありませんが、このまま実行するとボタンAを押しても、うまく機能しません。

これはobnizOSの処理が速いために、ボタンAを押した時の処理が高速に処理されてしまうからです(チャタリング状態)。これを回避するにはボタンが押された後に、少しウェイトを入れてやります。これで、期待通りの動作になります。

実際のソースコードは以下のようになります。

<script>
$("#bploading").text("RUNNING...");
(async function(){
var obniz, flag;
obniz = new Obniz.M5StickC('9999-9999');
await obniz.connectWait();
flag = 0;
while (true) {
await ObnizUI.Util.wait(0);
if ((await obniz.buttonA.isPressedWait())) {
if (flag == 0) {
obniz.led.on();
flag = 1;
} else {
obniz.led.off();
flag = 0;
}
await obniz.wait(500);
}
}
})();
</script>


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/


obnizのブロックエディタのページ。しばらく見なかったら、ブロックエディタのファイルメニューに「ひらがなモード」なる項目が。選択するとブロックエディタの文字がぜんぶ平仮名に! 

これなら子供でも読める……。obnizOS+M5StickCなら、小学校高学年なら十分できそうだけど、さすがに低学年だとどうなんだろう。小学校1〜2年生のIchigoJamの破壊具合を見ると、M5StickCはボタンとかあっという間に壊されそうな気も。

そうやってみると、マイクロビットは剥き出しだけど結構頑丈に作られてるんですよねぇ……。投げても大丈夫だし。

どうやら、21日で緊急事態宣言が解除されるようですが、田舎暮らしなので全然関係のない話になってしまってる感じがします。東京は大変だねぇ、という……話題にもならず、完全に別世界。

NHKのニュースも東京など都市部中心なので、何もかもセレブすぎてついていけず、ほとんど見なくなっていたテレビを、よけい、に見なくなってきました(だいたい人口の8割近くの人には東京の事は実際のところ意味がないのでは……)。

その代わりMacBook Air(M1)にHDMI出力できるケーブルをつけて、YouTubeを大きな画面で見たりしています。2画面あると効率アップ。

MacBook Air(M1)は都合2画面までしか使えませんが、現状これで十分な感じです。リアル+Zoom会議などの場合、3画面使えてミラーリングできると便利ですが。

先週、ようやくAdobe Photoshopが、Appleシリコンにほぼネイティブ対応したようです。他のAdobeアプリも早めに、ネイティブ対応して欲しいところ。

特によく使うMedia Encoderが高速化されると嬉しいところ。でも、MacBook Air(M1)にはファンがついていないので、期待するほど高速エンコードできないかもしれませんが。

・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram


・8K/4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/


・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/



━━━━━━━━━━━━━━━━━
編集後記(03/15)

●偏屈BOOK案内:関 裕二「古代史は知的冒険」PHP研究所 2015
https://www.amazon.co.jp/exec/obidos/ASIN/4569821413/dgcrcom-22/


筆者は日本古代史の研究家。冒頭で「古代史は簡単に解ける! 誰もがすぐに古代史を理解できる!」と断言するが、古代史のナニが簡単に解けるっていうのか。普通、「古代史の謎」とかだろう。いきなり何言ってんだか。

「『日本書紀』の中に、まだ、古代史の謎と秘密はいっぱい眠っていますよ〜、コツをつかめば、今まで見過ごされてきた貴重なヒントを、誰でも見つけられます」とお気楽なことをいう筆者は、そのコツを自信満々で20個並べている。

コツその1は、「なんといっても甘樫丘に登ってみることだ。大和路を歩き回ることだ」であるが、わたしは最初からつまずいた。もはや大和路に行って帰る経済力がない。コツその2は、「日本書紀」を読む、である。「古事記」を読んでも、絶対に古代史を読み解くことはできないという。

ここで再びつまずいた。というより、あきらめた。そんな能力はもはや失われた。かつてはあったのか、と問われれば、そこそこあったのだ。それに続くコツは何かというと。

「一度先入観を棄ててみよう」「古代史は知的冒険であると知ること」で、はいはいわかりました。以下、それがコツかよ〜って話もあるが、おおむね納得できる。

そしてコツの5「聖徳太子を徹底的に疑ってかかる」こと。これがこの本の重要な視点であろう。「古代史を解くには、入口が肝心だと思う。闇雲に突き進んでも、的をはずすだけだ。ならば、どこから迷路に紛れ込めば良いのだろう。正解は『聖徳太子』だと思う」

一部の教科書で聖徳太子ではなく厩戸皇子(うまやどのみこ)と記されるようになったそうだが、そのわけは「日本書紀」に「聖徳太子」という名の人物は登場しないからだ。ただし、厩戸皇子、豊耳聡聖徳など五つほどの名があり、どれが本当なのか分からない。不自然である。

じつは、「日本書紀」編纂の最大の目的は、「聖徳太子を創作すること」だったのではないか。そう思えるフシがあると筆者はいう。有名な冠位十二階や憲法十七条も、本当に太子の手柄かどうか不明である。

「聖徳太子には、これまで気付かなかったカラクリが用意されている。聖徳太子から古代史に潜り込めば、面白いように謎は解けてくる」と、彼は自信をもって言うのだが。

「『日本書紀』は、聖徳太子という虚像を構築したことによって、藤原氏の正義を証明できたのであり、それを逆手にとり、先入観や常識を取っ払って聖徳太子を見直せば、これまでどうしても解けなかった数々の古代史の謎が、おもしろいように解けてしまうはずなのである」。なんかビミョーな表現である。

聖徳太子があまりに持ち上げられるわけは、政敵に睨まれ抹殺された可能性があるからだ。「日本書紀」は真相を記録できぬ代わりに、聖徳太子を必要以上に美化し、礼讃したのではないかと筆者は考える。聖徳太子の子、山背大兄王も同様だ。聖徳太子とは何者なのか。史学会はなぜか聖徳太子の謎には目をつむる。

哲学者の梅原猛が「隠された十字架」(1972)で斬新な説を発表し、史学者たちを震撼させた。梅原は聖徳太子の一族を滅亡に追い込んだ事件の黒幕は、蘇我入鹿を背後から操った中臣鎌足であると推理した。筆者はこの本に触発され、古代史に没頭することになったという。

「史学者は無視するが、藤原氏と法隆寺の関係は、不可解きわまりない。(だからといって梅原猛のように考えると)話がややこしくなってくる。(略)ここから、スリリングな謎解きの旅が始まる」。なかなか興味深い。自慢たらたらの姿勢がちょっと気にさわるけど。

コツの19は、良い本に巡り会うこと。独断と偏見で決める、古代史関係のとびっきりのお薦めの書き手は、森浩一、大和岩雄、五来重、そして岸田秀。絶対に忘れてはいけない本、それは土門拳の写真集「古寺を訪ねて」シリーズ。仏像を撮らせたら右に出る者はいない。仏像の真価を見抜ける唯一の天才だ。

そしてコツの20。「蘊蓄を人に自慢してみること……。そして究極の極意は関裕二を信じること」だという。「じつにおこがましい話かもしれないが、行き着くところは『逆転する楽しさ』がある『関裕二の本』なのだと思う」と、ぬけぬけと書いているんだからナントモ。版元のPHPよ、これで1600円とはいい度胸だ。(柴田)


●そうなの、東京の地域情報を見ていると、関係ないって思っちゃうの。新型コロナやオリンピックは気になるけど。

/今期のTVerドラマ(TVerで、ながら見しているドラマ)……もう最終回が近いんだけど、『その女、ジルバ』が好きだなぁ。「夢なし、恋人なし、貯金なし……がけっぷちアラフォー女性が人生を変えようと飛び込んだのは平均年齢70歳以上の超高齢熟女バー?」

自分に諦め気味だった40歳の女主人公が、いろんな人生を背負って生きている年上の女性たちに、「若い、これから」と言われ、違う世界や価値観と出会い、自分の生き方を見つけていく話。

その年上の女性たちは元気で生き生きとしていて、恋なんかもしてる。長く生きている人たちの、サバサバ・達観した言葉やアドバイスって素敵だなぁと思っちゃう。そして、いくつになっても変わらないところはあるんだなぁ、とも。続く。(hammer.mule)

その女、ジルバ
https://www.tokai-tv.com/jitterbug/


原作マンガ
https://www.amazon.co.jp/exec/obidos/ASIN/4091850243/dgcrcom-22/