前回の記事では、u-bloxのモジュールをPCから操作しました。
この記事では、実際のユースケースのように、別のマイコンから利用する方法を試してみます。
結線は以下のようにしています
u-blox USB-NORA-W2 | Raspberry Pi pico |
---|---|
TX(GPIO43) | UART0RX(GP1) |
RX(GPIO44) | UART0TX(GP0) |
Raspberry Pi picoはMicroPythonが使えるようにファームウエアを書き込んでいます。
VS Codeでコーディングしていますが、MicroPicoの拡張機能を入れると試すのが楽でした。
いかがプログラムです。
from machine import UART
import json
import time
uart = UART(0, 115200)
def send_command(cmd: str):
print(f"SEND: {cmd}")
uart.write(f"{cmd}\r")
recieve_result()
def recieve_result():
time.sleep(0.5)
rxData = bytes()
while uart.any() > 0:
rxData += uart.read(1)
print(rxData.decode('utf-8'))
print("Start!")
#
send_command("AT")
send_command("AT+CONF? Version")
send_command("AT+CONNECT")
send_command("AT+CONF Topic1=ublox/data")
for i in range(5):
msg = {"message": f"Hello World! {i}"}
send_command(f"AT+SEND1 " + json.dumps(msg))
time.sleep(1)
やっていることは単純で、MQTTの接続を行った後、メッセージをpublishしています。
AWS IoT Coreのマネージメントコンソールに以下のようなメッセージが届きました。
{
"message": "Hello World! 4"
}
こうやってみるとホストマイコンの方は、少ない実装でクラウドと接続できることが確認できたかなと思います。
MQTTにsubscribeするプログラムを書く場合に、頻繁に AT+GET
で監視する必要があるかというと、ExpressLinkにはEvent Pinの仕様もあります。このPinはハードウエアのモジュールによって変わりますが、USB-NORA-W2の場合は、GPIO11に割り当てられているようです。このPinをホストマイコン側と接続することで、ホストマイコンの通知すべきイベントが発生したら、PinはHighになります。イベントキューが空になると、Lowになります。
ホストマイコンはこの信号を検出したら、どんなイベントがあるかをAT+EVENT?
のコマンドで確認し、必要な処理を行うことで、イベントドリブンな実装を行うことができます。