前回の記事では、ブロックエディターの高度なブロックの画像と、高度なブロックの入出力端子パート1をmicropythonを対比しながら説明しました。今回は高度なブロックの入出力端子パート2の紹介です。
当記事は、シリーズでマイクロビット(Micro:bit)のプログラミングについて紹介しています。初めての方はこちらをご覧ください。
以下の説明とサンプルプログラムは、こちらのページの内容を私なりに、ブロックエディターと比較してmicropythonで記述する例を紹介しています。高度なブロックですので少し難しくなりますが、サンプルプログラムを参考にしてご自分でプログラムしてみてください。。
高度なブロックの入出力端子パート2について
ブロック | micropython |
1.サーボ出力する |
該当する関数は実装されていないようです。以下、SG90と呼ばれるサーボモーターを使い、私の環境でテストした結果です。SG90のメーカーHPで定格4.8Vとありますので、moto:bitと呼ばれるモーター制御ボードを使いました。 SG90は以下の波形で0.5msで0度、2.4msで180度になるという仕様です。 PWM Periodはpin16.set_analog_period(20)で指定します。 0.5ms~2.4msは直接時間指定できず、pin16.write_analog(値)で値を0~1023で指定する必要がありますので、変換が必要です。実際に試してみますと、23から123で0度から180度まで制御できました。約0.55で1度になりますので、角度を指定すると実際に出力するanalog値に変換する関数を作りました。 以下、何もしないとハートを表示して90度に、aボタンを押すと180度、bボタンを押すと0度に制御するプログラム例 |
2.サーボ設定する |
pin0.set_analog_period_microseconds(パルス幅) 出力される PWM 信号の周期をパルス幅にマイクロ秒単位で設定します。有効な最小値は 256μs です。 pin0.set_analog_period(パルス幅) 出力される PWM 信号の周期をパルス幅にミリ秒単位で設定します。有効な最小値は 1ms です。サンプルプログラムは『1.サーボ出力する』のサンプルを参照してください。 |
高度なブロックの制御について
ブロック | micropython |
1.バックグラウンドで実行する
|
ずっとブロックと等価。 Micro:bitはリアクトシステム(私の理解としてはイベントドリブンシステム)であり、ボタンを押したりMicro:bitを振ったりしたことに対して、LEDを表示する等の処理を行います。そのためには、イベントを確実に捕捉する必要があり、その仕組みが実装されているとのことです。命令を処理するCPUは1つなので、ずっと処理(例えばLEDを表示するには数秒かかる場合もあります)をしている間も6ms間隔でイベントが起きていないかチェックして、イベントがあれば、イベントハンドラーをスケジュールして、次にCPUが空いたときにイベントを処理するという事を繰り返しているとのこと。(ずっとブロックも実際にCPUが処理できる機械語レベルでは、本当にずっと処理しているわけではなく、定期的にスケジュラーに処理が渡るようになっている) 英語版ですが、詳しくはこちらに説明があります。 |
2.リセット |
reset() Micro:bitの背面にあるリセットボタンを押すことと同じです。 |
3.全体を一時停止 |
sleep(ms) マイクロ秒ではなく、ミリ秒で一時停止します。 |
4.イベント関連 |
私自身勉強不足ですので、改めて別の機会に紹介できればと思います。 |
高度な入出力端子パート2、制御についての紹介は以上です。この記事で、一旦ブロックエディターのブロックとmicropythonの対比説明は終了です。無線とシリアル通信について紹介できていませんでしたが、無線についてはこちらの記事を、シリアル通信についてはこちらの記事を参照ください。次は今までの記事を纏めた、micropythonの簡易マニュアルを紹介できればと思います。少し時間がかかるかもしれませんが。
最後まで記事をお読みいただきありがとうございます。
記事の改善に役立てたいと思いますので、よろしければアンケートにご協力ください。
コメントを書く