micro:bitを用いた簡単なチャットプログラム

 Initial release: 25 Jan., 2024

中学校技術の学習内容「D 情報の技術」では,ネットワークを利用した双方向性のあるコンテンツのプログラミングを学習することになっています.

ここでいうネットワークはインターネットには限定されませんので, 極端な話をすれば2台のコンピュータをシリアル接続で繋いでもいいわけですが,そのプログラミングをどうするかはまた悩むところです.

micro:bitにはBluetoothのほかに独自の無線通信機能(micro:bit radio)があり,1対1から多数のmicro:bitが接続する無線通信網を構築してメッセージやデータのやり取りをすることができます.これを用いれば,「ネットワークを利用した双方向性のあるコンテンツのプログラミング」は簡単に実現できます.

次のような処理手順を考えてみましょう.このプログラムで用いる変数は,受信結果を代入する変数(文字列)とキーボードから入力した送信メッセージを代入する変数(文字列)の2種類です.

1. 初期設定(変数定義,無線設定)
2. 以下の(1)〜(4)を繰返し実行
 (1) 受信内容を確認(受信結果を変数に代入)
 (2) 受信内容があれば画面表示
 (3) ボタンAが押されていたら,次のア,イを順次実行
  ア キーボードからメッセージ入力
  イ 入力されたメッセージを無線送信
 (4) ボタンBが押されていたら繰返し処理から抜け出る
3.プログラム終了

これでメッセージを相互にやり取りできるのがイメージできるでしょうか?
ボタンAを押すと送信モードになり,キーボードから入力した文字列が無線で送信されます.それ以外の場合はひたすら受信モードで,何かを受信したら画面に受信文字列が表示されます.ボタンBを押すとプログラムは終了します.

これをアクティビティ図にすると

のようになります.  

micro:bitのPythonでは次のコードになります:

# Author: Cosy MUTO @ Nagasaki Univ., CC BY-NC-SA 4.0 International
from microbit import *
import radio
radio.on()
radio.config(group = 1, length=251)
rec = ''  # 受信メッセージを格納する変数
msg = ''  # 送信メッセージを格納する変数
while True:
    rec = radio.receive()
    if rec != None:
        print(rec)
    if button_a.was_pressed():
        msg = input('送信メッセージ:')
        radio.send(msg)
    if button_b.was_pressed():
        break

コメントを除いてわずか15行のプログラムですね.
もうちょっと工夫すれば13行になります(ヒント:無限ループではなく,「ボタンBが押されていなければ,ずっと繰り返し」).もちろん,アクティビティ図にも修正が必要です.

「受信内容があれば」のところ(9行目)は,実際のコードでは「受信内容が『何もない』でなければ」としています.このコードのライセンスは CC BY-NC-SA 4.0 Internationalとします. 

生徒たちに考えてほしいのは設定や変数定義ではなく,実際に動作している while True:以下の部分です.
ノーヒントで書くのは難しいかもしれませんが,インデントを守ったうえで日本語のコメントをヒントとしてあらかじめ埋め込んだワークシートを準備するとか,あるいはブロックプログラミングでPythonコードを作成するEduBlocksを用いるといった工夫が考えられると思います.

MicroPythonの仕様でinput関数はUTF-8を扱うことができませんので,日本語(というか,ラテン文字以外)の入力はできません.(半角)英数字のみです.しかしながら,プログラム内に直に書き込む文字列は日本語を使用することができますので,定型文をプログラムに埋め込んでおきそれを選択して送信する,というやり方はあります1.プログラムを改良・改善するポイントとして生徒さんに考えてもらうのも良いでしょう.

書誌情報
倉元 賢一, 武藤 浩二, 木村 彰孝, “シングルボードコンピュータを用いたチャットプログラムと模擬授業実践”, 日本産業技術教育学会九州支部論文集, vol.29, pp.27-34, 2022年3月


1 print関数,radio.send関数,radio.recieve関数では日本語を通すことができます.