前回のESP8266とRaspberry Piでソケット通信を試すの記事で、ESP8266のWiFiモジュール(NodeMCU)とRaspberry Pi間でソケット通信を使う事が出来たので、これからは温度といった実際のデータを送信するための見ていくことにする。


P6248915

プログラミング教育で注目すべきはARM + Debian + Pythonであるはずだ


温度はBBC Micro:bit(以後、microbitと略す)であれば、AD変換等を気にせず簡単に取得できるので、microbit - ESP8266 - Raspberry Piのような構成にしてみる。

AD変換器の概要に触れる


いきなりmicrobit - ESP8266間のデータのやりとりをするのは難しいので、一つずつ丁寧に見ていくことにする。




はじめにmicrobitのUARTというデータのやりとりを見ていくことにしよう。

microbitのUARTに関しては、Rapberry PiとBBC Micro:bitでUARTを試すの記事で触れたけれども、今回は送受信両方とも見る。


UARTを利用する場合、Raspberry Piの方で事前に設定が必要だけれども、上記のリンク先の記事に記載があるので、内容を参考にしてシリアルポートを有効にしておく。

Raspberry Piの方の設定が終了したら、


rpi2bit

上の図のように繋ぐ。

後ほど記述するが、microbitのP0ピンをTX、P1をRXにして、Raspberry PiのTXにP1、RXにP0を繋ぐようにする。




最初に上の図とは逆になるが、microbitからRaspberry Piにデータを送信してみる。

Muエディタを開き、下記のコードをmicrobitにフラッシングする。

Code With Mu


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()

ボー - Wikipedia


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