PCでIoTゲートウエイ

 Micro:bitは、非常に優れたツールです。すべてが単純で簡単にできていますから、小学生にも感覚的にプログラミングできます。しかしインターネットに接続することができません。そこで、Micro:bitとパソコンをシリアル通信で結び、取得したデータをサーバへHTTPリクエストとしてあげるプログラムを作ってみました。

 今回は、Micro:bitで得た明るさセンサーの値をサーバへ5秒ごとにアップロードし、テキストに追記保存することに挑戦します。

図:今回作るMicro:bitとIoTゲートウエイの構成

Micro:bitのプログラム

 まずは、Micro:bitで得た明るさセンサーの値を、USBケーブルを使ってシリアル通信でパソコンへ送信します。Bボタンを押すことで、パソコンへ処理終了を伝えることとします。

まずは、パソコンとMicro:bitを接続https://makecode.microbit.org/にchromeでアクセスします。

写真1:パソコンとMicro:bitをUSBケーブルで接続

 写真2のように「高度なブロック」から「シリアル通信」を選びましょう。写真3のようにプログラムします。「最初だけ」のブロックは、USBを使ったシリアル通信の設定です。「ずっと」のブロックは、シリアル通信でMicro:bitの環境光センサーの値を書き出し、5秒待つを繰り返す処理です。(※写真では1秒(1000ミリ秒)待つことになっています。5000ミリ秒に直しておいてください。)また、ボタンBを押したときに「b」の文字列を送り出すことにします。

写真2:シリアル通信のブロック群は「高度なブロック」にあります

 設定が終わるとパソコンとMicro:bitをシリアル通信できるように接続します。画面左下の「ダウンロード」ボタンの右側にある「…」ボタンをクリックし、「Connect device」ボタンをクリック。その後何回かOKボタンを押すと、写真4のようにブラウザ(Chrome)と接続する表示が出ますので、選んで「接続」ボタンをクリック。

写真3:ブロックプログラムをMicro:bitに書き込む準備

 「接続」ボタンをクリックすると作ったプログラムがダウンロードできますので「ダウンロード」ボタンをクリックしましょう。作ったプログラムが自動的にMicro:bitに読み込まれます。

写真4:ChromeとMicro:bitを接続

 最後にセンサーの値がうまくパソコンに流れているかを確認します。「Show data デバイス」ボタンを押してみてください。うまくできていれば、写真5のように明るさセンサの値がグラフになって表れるはずです。Micro:bitに影を作ってみたり、照明に近づけてみたりして確認しましょう。

写真5:Micro:bitによるデータの取得

パソコンのプログラム(IoTゲートウエイ)

 Micro:bitから送られてきたシリアル通信のデータを受け取り、サーバへアップロードします。ちなみに、Micro:bitから停止命令(Micro:bitのBボタンを押す)がきたら処理を終了させます。以下は、Pythonのソースコードです。パソコンに Python IDLE 3.8.3 をインストールし作成しました。

#シリアル通信・時間・httpリクエストの各モジュールを読み出し
import serial
import time
import requests

#あらかじめデバイスマネジャーなどでCOMポートを確認しておく
COM="(デバイスのポート番号)"
#シリアル通信のボーレートはマイクロビットの初期値115200にしておく
bitRate=115200

#シリアル通信の準備
ser = serial.Serial(COM, bitRate, timeout=0.5)

while True:
    #処理時間に余裕を持たせる
    time.sleep(0.5)
    #シリアル通信のデータ読み込み
    result = ser.read_all()
    #バイト列を文字列に変換
    result = result.strip().decode()

    #シリアル通信のデータが入ってきたとき
    if result:
        #送信されていた文字列の確認
        print('res:' + result)
        #httpリクエストの準備
        res = '(ご自身のサーバ名かIPアドレス)/(ファイル名).php?d=' + str(result)
        #サーバへのアクセス(レスポンスが返ってくる)
        response = requests.get(res)
        #サーバーから返されたステータスコードの確認(正常であれば200)
        print(response.status_code)

    #bの文字列が送られてきたら処理終了    
    if result == b'\r':	# <Enter>で終了
        break

#処理終了のメッセージを表示
print('program end')

ser.close()

 サーバにデータを送信しますので、実行の際はローカルにサーバを立てるかホスティングサービスを利用するかします。(Google スプレッドシートでも実現できると思います。)また、「デバイスマネージャでUSBのシリアルポートの確認を行います。

写真6:デバイスマネージャの表示(Windwos10)

 私のパソコンでは「COM7」でした。パソコンや接続しているデバイスの数によっても変わりますので、注意してください。

写真7:シリアルポートの確認

サーバのプログラム

 Webサーバで送られてきた信号を受け取り、テキストデータとして追記保存していきます。プログラミング言語はPHPを使います。HTTPリクエストとしてIoTゲートウエイからデータを受け取ります。

<?php
    //httpリクエストのパラメータを受け取る
    $data = $_GET["d"];
    //日時とコンマのあとに受け取ったデータと改行をつけて文字列を生成
    $data = date('Y-m-d H:i:s') . "," . $data . "\n";
    //生成された文字列をlog.txtファイルの末尾に追記して保存する
    file_put_contents("log.txt", $data, FILE_APPEND);
?>

完成デモ

 Micro:bit→IoTゲートウエイの順でプログラムを実行してみましょう。resの後の数値が環境光センサの値で、200の数値はWebサーバからのステータスナンバーです。正常に通信ができていることがわかります。(動画・写真8)サーバにも正確に数値が記録されていました。(写真9)

動画:IoTゲートウエイの実行結果
写真8:IoTゲートウエイを通過したデータの表示
写真9:Webサーバの記録結果