前回のESP8266のUARTの記事で、ESP8266からRaspberry Piに対してUARTでデータを送信してみた。
Raspberry Piでは任意のデータを受け取れたが、合わせてREPLに関する値も含まれていた。
REPL周りは置いといて、今回はESP8266を受信側にして試してみる。
ESP8266(NodeMCU)のコードを下記のように変更してみる。
※前回のコードから変更する場合、ファームウェアの再インストールが必要になるかもしれないので、その時はNodeMCUにファームウェアをインストールするの記事を参考にして再インストールを行う。
main.py
import machine import time uart = machine.UART(0) # init with given baudrate uart.init(9600, timeout=3000) # init with given parameters while True: # データを受け取った時 if uart.any() > 0: msg = uart.readline() # 値の確認 if msg is not None: raspberry piから受け取った値を少し変更して送り返す msg = str(msg.decode('utf-8')) msg = 'received:' + msg # 下記のコードはエンコードすると受信側でエラーになるのでエンコードしないで送信 uart.write(msg) time.sleep(1)
上記のコードで注意する点はuart.any()で、BBC Micro:bitの方のMicroPythonにもuart.any()があったが、こちらの返り値がbooleanに対して、ESP8266の方の返り値が0 or 1となっている。
続いて、Raspberry Piの方のコードを作成する。
/path/to/dir/uart_pi_srv.py
import serial import time ser = serial.Serial('/dev/ttyS0', 9600, timeout=3) print("uart:receiver") try: while True: msg = "send from pi." ser.write(msg.encode()) msgFromEsp8266 = ser.readline() print(msgFromEsp8266.decode('UTF-8')) time.sleep(1) except KeyboardInterrupt: print(' Ctrl+C was pressed') finally: if ser.is_open: ser.close() print(' Serial connection was closed')
上記のコードはsend from pi.というメッセージを何度も送信というもの。
Raspberry Pi側で端末を立ち上げ、下記のコードを実行してスタンバイしておく。
$ python3 /path/to/dir/uart_pi_srv.py uart:receiver
ESP8266(NodeMCU)のUSBをコンセントに繋いだ後に、Raspberry Piの方の端末を確認してみると、
$ python3 /path/to/dir/uart_pi_srv.py uart:receiver received:send from pi.
となった。
ESP8266のUARTを受信側にすると、返ってくるデータはREPLではなくなるようだ。