前回の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の送受信の両方とも動作を把握することが出来た。




