今回は、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/