前回のESP8266とRaspberry Piでソケット通信を試すの記事で、ESP8266のWiFiモジュール(NodeMCU)とRaspberry Pi間でソケット通信を使う事が出来たので、これからは温度といった実際のデータを送信するための見ていくことにする。
プログラミング教育で注目すべきはARM + Debian + Pythonであるはずだ
温度はBBC Micro:bit(以後、microbitと略す)であれば、AD変換等を気にせず簡単に取得できるので、microbit - ESP8266 - Raspberry Piのような構成にしてみる。
いきなりmicrobit - ESP8266間のデータのやりとりをするのは難しいので、一つずつ丁寧に見ていくことにする。
はじめにmicrobitのUARTというデータのやりとりを見ていくことにしよう。
microbitのUARTに関しては、Rapberry PiとBBC Micro:bitでUARTを試すの記事で触れたけれども、今回は送受信両方とも見る。
UARTを利用する場合、Raspberry Piの方で事前に設定が必要だけれども、上記のリンク先の記事に記載があるので、内容を参考にしてシリアルポートを有効にしておく。
Raspberry Piの方の設定が終了したら、
上の図のように繋ぐ。
後ほど記述するが、microbitのP0ピンをTX、P1をRXにして、Raspberry PiのTXにP1、RXにP0を繋ぐようにする。
最初に上の図とは逆になるが、microbitからRaspberry Piにデータを送信してみる。
Muエディタを開き、下記のコードをmicrobitにフラッシングする。
from microbit import * # microbitが起動しているか? display.show(Image.HAPPY) uart.init(baudrate=9600, tx=pin0, rx=pin1) while True: # ボタンAを押したとき if button_a.is_pressed(): msg = "microbit to raspberry pi" # 文字列型の値をバイト型に変換して送信 uart.write(msg.encode() # 連続で送信を避けるために1秒待つ sleep(1000) # 今回のコードでは下記のコードまでたどり着かないが、最後に下記コードで初期化しておくと良い uart.init(115200)
続いて、Raspberry PIの方で下記のコードを作成する。
/path/to/dir/uart_pi_receiver.py
import serial # 9600の値はMicrobitの方のbaudrate(ボーレート)と合わせる ser = serial.Serial("/dev/ttyS0", 9600, timeout=1) ser.close() ser.open() print("uart:receiver") while True: # microbitからバイト型のデータを受け取ったら、文字列に変換する data = ser.readline().strip().decode("UTF-8") if len(data) > 0: print(data) # 今回のコードでは下記まで実行されないけれども、何らかの形でcloseした方が良い ser.close()
Raspberry Piの方で端末を開き、作成したコードを実行する。
$ python3 /path/to/dir/uart_pi_receiver.py uart:receiver
Raspberry Piの方で受信側として準備ができたので、microbitの方でAボタンを押してみると、
$ python3 /path/to/dir/uart_pi_receiver.py uart:receiver microbit to raspberry pi
次にRaspberry Piからmicrobitにデータを送信してみる。
※Microbitで値を受信する
Muエディタを開き、下記のコードをフラッシングする。
from microbit import * # microbitが起動しているか? display.show(Image.HAPPY) uart.init(baudrate=9600, tx=pin0, rx=pin1) while True: # raspberry piからの送信を待つ if uart.any(): data = uart.read() # バイト型のデータを文字列に変換して出力 display.scroll(data.decode()) # 初期化 uart.init(115200)
microbitのUARTの値を受信する場合は、uart.any()というのが重要となる。
microbitのMicroPythonでuart.any()を確認すると、
/*********************************************/
なにか待っているデータがあれば True を返し、さもなければ False を返します。
/*********************************************/
※UART — BBC micro:bit MicroPython 1.0.1 ドキュメント#uart.any()
と記載されていた。
uart.any()をかましておくことで、データを受信した時のみ受信した値を出力する事ができるようになる。
Raspberry Piの方のコードを作成する。
/path/to/dir/uart_pi_sender.py
import serial ser = serial.Serial("/dev/ttyS0", 9600, timeout=1) ser.close() ser.open() print("uart:sender") # 下記のメッセージを一回だけ送信する msg = "raspberry pi to microbit" ser.write(msg.encode()) ser.close()
Raspberry Piの端末を開き、下記のコマンドを実行する。
$ python3 /path/to/dir/uart_pi_sender.py
microbitのディスプレイを見てみると、
Raspberry Piから送信したメッセージが出力された。
これで、microbitのUARTの送受信の両方とも動作を把握することが出来た。