無線通信

離れた場所での対話は魔法のようです。

あなたがエルフ、魔法使い、ユニコーンであれば、魔法が使えるでしょうが、そのようなことは物語にしかありません。

しかし、魔法よりもはるかに優れたものがあります: 物理学です!

無線のやりとりはすべて物理学に基づくものです: 電波(可視光に似た電磁波の一種)は、送信機によって変調される特性(振幅、位相、パルス幅など)を持っていて、これを利用して情報をコード化して送信します。電波が電気導体(すなわち、アンテナ)に遭遇すると、波の情報が抽出され、元の形に変換された交流電流が発生します。

レイヤー上のレイヤー

覚えているでしょうか? ネットワークは複数の層で構成しています。

ネットワークにとって最も基本的な要件は、信号があるデバイスから別のデバイスに到達できるようにする何らかの接続です。ネットワークのチュートリアルでは、I/O 端子に接続されたワイヤを使用しました。無線モジュールのおかげで、ワイヤーをなくし、上記で要約した物理学をデバイス間の見えない接続として使用することができます。

ネットワークスタック内の次のレイヤーも、ネットワークのチュートリアルの例とは異なります。有線の例では、デジタルのオンとオフを使用して端子から信号を送信して読み取りました。micro:bit に内蔵の無線機能を使用すると、信号の最小単位が 1 バイトになります。

バイト

バイトは、(通常) 8 ビットで構成される情報の単位です。ビットは、オンまたはオフの2つの状態しかないので、最小限の情報単位です。

バイトは、一種のそろばんのように機能します。バイトの各位置は、そろばんの列のようなもので、関連する数字を表します。そろばんは通常、千、百、十、一のように並びます。バイトでは 128, 64, 32, 16, 8, 4, 2, 1 となります。ビット(オン/オフ信号)が無線で送信されると、それらは受信側でバイト列に再結合されます。

あなたはそのパターンを見つけましたか? (ヒント: 基数が2)

「オン」に設定されたバイト内の位置に数を割り当てることにより、0 〜 255 の数値を表すことができます。下の図は、これが 5 ビットでどのようになるのかを示しています。

../_images/binary_count.gif

私たちが(バイトでエンコードされた) 255 個の数値のそれぞれが〜1文字〜を表すのに同意すれば、一度に 1 バイトあたり 1 文字のテキストを送ることができます。

面白いことに、人々はすでに このことを考えていて いました。情報のエンコードとデコードにバイト列を使用するのが普通です。これは、有線ネットワーキングの例でのモールス符号の「プロトコル」層にほぼ対応します。

「バイト列のすべて」についての実に素晴らしい子ども(と教師)向けのの説明が、CS unplugged ウェブサイトにあります。

アドレッシング

無線通信の問題は、一人に直に送信できないということです。適切なアンテナを持っていれば、あなたの送信したメッセージを受け取れてしまいます。つまり、誰が放送を受信すべきかを区別できるようにすることが重要となります。

micro:bit に内蔵の無線通信では、この問題を解決するのが非常に簡単です。

  • 無線通信を異なるチャンネル(0〜83 の番号)にチューニングすることは可能です。これは、子ども向けのトランシーバーのおもちゃとまったく同じように機能します。誰もが同じチャンネルに同調し、誰もがそのチャンネルを介してブロードキャストするものを聞きます。トランシーバーと同様に、隣接するチャンネルを使っても干渉の可能性はわずかです。
  • 無線モジュールでは、アドレスとグループという2つの情報を指定できます。アドレスは郵便アドレスのようなものですが、グループはアドレスの特定の受信者に似ています。重要なのは、無線通信があなたのアドレスとグループと一致しない受信したメッセージを除外することです。つまり、アプリケーションが使用する予定のアドレスとグループを事前に配置することが重要です。

もちろん、 micro:bit は、他のアドレス/グループの組み合わせのブロードキャストメッセージも受信しています。重要なことは、それらをフィルタリングすることについて心配する必要はないということです。それにもかかわらず、誰かが賢明だったなら、ターゲットアドレス/グループが何を想定していたとしても、すべての無線ネットワークのトラフィックを読み取ることができます。この場合、暗号化された通信手段を使用することが 不可欠 であり、そのようにすれば必要な受信者だけが実際にブロードキャストされたメッセージを読むことができます。暗号は魅力的なテーマですが、残念ながらこのチュートリアルの範囲を超えています。

ホタル

これはホタルです:

../_images/firefly.gif

ホタルは生物発光を使って(ワイヤなしで)仲間に信号を送る虫の一種です。お互いに信号を送るときの様子は次のとおりです:

../_images/fireflies.gif

BBC はオンラインで入手できるホタル`美しい映像 "<http://www.bbc.com/earth/story/20160224-worlds-largest-gathering-of-synchronised-fireflies>`_ を持っています。

無線モジュール radio を使って、ホタルの群れがお互いに交信するようなものを作ってみましょう。

まず Python プログラムで関数を利用できるように import radio します。次に、無線をオンにする radio.on() 関数を呼び出します。これを行うと radio はパワーを得てメモリを確保するので、 あなた が無線通信の有効化を決定したことになります(もちろん、無効にする radio.off 関数もあります)。

この時点で、radio モジュールは、BBC micro:bit をターゲットとする可能性のある他のプラットフォームと互換性を持つように、適切なデフォルトに設定されています。上述した多くの機能(チャネルやアドレス指定など)や、メッセージをブロードキャストするための電力量や着信メッセージキューが占有する RAM の量を制御することが可能です。APIドキュメントには、必要に応じて radio を設定するために必要なすべての情報があります。

デフォルトで十分であれば、メッセージを送信する最も簡単な方法は次のようなものです:

radio.send("a message")

この例では、"a message" をブロードキャストするために send 関数を使っています。メッセージを受け取るのはさらに簡単です:

new_message = radio.receive()

メッセージが受信されると、それらはメッセージキューに置かれます。receive 関数は、新しい着信メッセージのためのスペースを作り、文字列としてキューから最も古いメッセージを返します。メッセージキューがいっぱいになると、新しい受信メッセージは無視されます。

本当にこれだけです(が、radio モジュールは文字列だけでなく任意のタイプのデータを送信することもできます。これについてはAPIドキュメントを参照してください)。

この知識を武器とすれば、 micro:bit のホタルを作るのは以下のように簡単です:

# micro:bit ホタル。
# 作成者 Nicholas H.Tollervey。パブリックドメインで公開。
import radio
import random
from microbit import display, Image, button_a, sleep

# "発光" (flash)アニメーションフレームを作成。何をしているかわかりますか?
flash = [Image().invert()*(i/9) for i in range(9, -1, -1)]

# 無線を使うためのスィッチをオンにします。
radio.on()

# イベントループ。
while True:
    # ボタンAは "flash" メッセージを送ります。
    if button_a.was_pressed():
        radio.send('flash')  # a-ha
    # 受信メッセージを読み込みます。
    incoming = radio.receive()
    if incoming == 'flash':
        # "flash" メッセージを受信したら、ランダムな短い
        # 一時停止の後にホタルの発光アニメーションを表示
        # します。
        sleep(random.randint(50, 350))
        display.show(flash, delay=100, wait=False)
        # 少し休んだ後に、flash メッセージをランダムに
        # 再送信します。
        if random.randint(0, 9) == 0:
            sleep(500)
            radio.send('flash')  # それっ

重要なことはイベントループ内で起きています。最初に、ボタン A が押されたかどうかをチェックし、そうであれば、radio を使用してメッセージ "flash" を送信します。次に、 radio.receive() でメッセージキューからメッセージを読み込みます。メッセージがある場合は、(ディスプレイをより面白くするために)短くランダムな時間の休止と display.show() を使って、ホタルの光の点滅を表現します。最後に、物事を少しエキサイティングにするために、誰かに ""flash" メッセージを再ブロードキャストするチャンスが 1/10 になるように乱数を選択します(これはいくつかのデバイス間でホタルの表示を維持する手段です)。ブロードキャストを決定すると、 "flash" 信号を再び送信する前に(最初のフラッシュメッセージからの表示が確実に終われるように)、0.5秒間待機します。このコードは while True ブロック内にあるため、無限に処理を継続します。

このプログラムを使った様子は次のようになります(micro:bit のグループを使用)。

../_images/mb-firefly.gif