前回の記事までで、シリアル通信以外のブロックエディターとMicropythonの対比説明は完了しました。今回はシリアル通信のブロックとMicropythonについて紹介します。
当記事は、シリーズでマイクロビット(Micro:bit)のプログラミングについて紹介しています。初めての方はこちらをご覧ください。
以下の説明とサンプルプログラムは、こちらのページの内容を私なりに、ブロックエディターと比較してmicropythonで記述する例を紹介しています。
前回の記事『シリアル通信』レッスンのチャレンジ回答例
チャレンジは、『ボタンでメッセージを送る以外に、例えばMicro:bitを左に傾けたら、『Great』を送り、右に傾けたら『Not bad』を送るプログラムを追加する。』でした。以下、その1例です。(当プログラムはV0ブロックエディターを使用)
シリアル通信ブロックについて
ブロック(V1) | micropython |
1.1行書き出す |
uart.write(message) 通信先の設定で指定したtxバスにmessageを送信します。 |
2.数値を文字で書き出す |
uart.write(str(数字)) str()関数で数字を文字列に変換して、1と同じ命令で送信します。 |
3.名前と数値を書き出す |
uart.write(message) 名前と変数からmessageを作成して、1と同じ命令で送信します。 |
4.文字列を書き出す |
uart.write(message) 文字列からmessageを作成して、1と同じ命令で送信します。 |
5.複数の数値をカンマくぎりで書き出す |
uart.write(message) カンマ区切りのmessageを作成して、1と同じ命令で送信します。 |
6.次のいずれかの文字の手前まで読み取る |
uart.readline() 改行文字まで読み込みます。読み込んだデータには改行が含まれます。他の文字『, $ : . #』などの文字まで読み込むには、1行読み込んだあと文字列を1文字ずつ比較して必要な文字列を取り出します。 |
7.1行読み取る |
uart.readline() 改行文字まで読み込みます。 |
8.文字列を読み取る |
uart.read() 文字列を読み取ります。 |
9.つぎのいずれかの文字を受信したとき |
uart.any() なにかバッファーにデータがあればTrueが返るので、その後bufの内容を改行と比較するなどして改行であれば何か処理するということができます。 |
10.通信先を変更する |
microbit.uart.init(baudrate=115200, bits=8, parity=None, stop=1, tx=None, rx=None) この命令で通信先を変更しないと、USB経由でパソコンのTerminalソフトと通信できます。Terminalソフトと通信する場合は、Terminalソフト側のシリアルポートの設定とこの設定を合わせる必要があります。Micro:bit同士で通信するには、txとrxでどのピンを使うか指定します。それ以外の設定は基本的に変更しなくても大丈夫です。 |
11.USBにリダイレクト |
実装されていないようです。USBでパソコンのTerminalソフトと通信したい場合は通信先を変更しなければUSB経由でシリアル通信できます。 |
12.write buffer |
uart.write(buf) バイト列の buffer をバスに書き出します。UARTのtxバッファーは64バイトです。 注:V1の当ブロックは日本語訳がおかしいため開発元の問い合わせ中です。(バグ#1565として受け付けられました。2018/11/2修正済み)代わりにV0のブロックを載せてあります。 bufferについてはまだ動作確認をしていませんので、確認後更新します。 |
13.バッファーに読み取る |
uart.readinto(buf[, nbytes]) buf にバイト列を読み込みます。nbytes が指定されていれば、そのバイト数まで読み込みます。さもなければ len(buf) のバイト数まで読み込みます。 bufferについてはまだ動作確認をしていませんので、確認後更新します。 |
以下は、ボタンAを押したら『Hello』、ボタンBを押したら『Hi』を送信し、受け取ったメッセージを表示するプログラム。 このプログラムを2台のMicro:bitに転送してP0とP2を2本、GNDとGNDをつないでボタンを押してみてください。1点注意ですが、プログラムを転送する際に正しく接続してあっても通信エラーになります。その場合はエラーメッセージを消して再度転送してください。2回目は上手くいくようです。(個人的見解ですが、USB転送とUART使用のためかと思われます。また、このプログラム使用中はREPL機能も使えません。同じ理由と思われます。) |
シリアル通信は配線が必要ですので、Micro:bit同士の通信には無線を使われるのが便利と思います。シリアル通信はMicro:bit以外のボードと接続する場合(パソコン接続など)に利用できます。以下はパソコンのteratermというソフトとMicro:bitとの通信の例です。
パソコンとMicro:bitのシリアル通信
以下のプログラムをMicro:bitに転送してください。(1回目はエラーします。またTeraTermは起動しないこと。起動すると転送がうまくいきません)Micro:bit同士の通信プログラムとの違いは、以下3点。
uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=pin0, rx=pin2) USB通信したいので、tx,rx設定を削除
uart.write(“Hello\r\n“) Tera Term で改行するためのコード追記
uart.write(“Hi\r\n“) Tera Term で改行するためのコード追記
お手持ちのシリアル通信できるソフトか、Tera Term をこのサイトからダウンロードして導入してみてください。以下の説明はTeraTermの説明です。
1.TeraTermを起動します。以下のようにTCP/IPかシリアルかの選択画面が表示されます。
2.以下のようにシリアルを選択して、OKをクリックします。その時表示されているポートはMicro:bitが接続されたCOMポートが表示されています。
3.シリアルポートの設定がMicro:bit側の設定と同じかどうか確認のため、設定→シリアルポートを選択します。
4.以下のような情報が表示されます。Micro:bitの設定はbaudrate=9600, bits=8, parity=None, stop=1 ですので同じです。異なっているようであれば、Micro:bitの設定に変更してください。
5.次にパソコンのキーボードから文字を送る際にTeraTermに表示したいので、設定→端末を選択します。
6.ローカルエコーにチェックします。
7.同じ設定画面で、送信をCRからCR/LFに変更して右上のOKをクリックします。
8.これで準備が終りましたので、Micro:bitのAボタンとBボタンを押してみてください。以下のようにHelloとHiが表示されます。
9.今度はパソコンのキーボードからアルファベットの例えばAを押してみてください。画面にAが表示されてMicro:bitのLEDにAが表示されるはずです。次にエンターキーを押すとLEDに?が表示されて画面では改行されて次の文字を入力できます。今のプログラムでは、1文字でもMicro:bitの受信バッファーにデータが送られると表示されてしまいます。改善についてはバッファーの動作確認後に記事にしたいと思います。
シリアル通信についての紹介は以上です。これで一連のブロックとMicropythonの比較の連載は終了です。今までの連載をpdfファイルでまとめた資料を準備中ですので、出来上がりましたらまた紹介させていただきます。
最後まで記事をお読みいただきありがとうございます。
記事の改善に役立てたいと思いますので、よろしければアンケートにご協力ください。
コメントを書く