chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

LEGO SPIKE HUBとマイコンをSerial接続する

課題: LEGO SPIKE HUBとHuskylensを接続するに先立ち、まずLEGO SPIKE HUBとマイコンをUARTで接続を確立する
取り組み:使い慣れたESP32とLEGO SPIKE HUBとUARTで接続してみる(どちらもMicroPythonを使用)
結論:通信はできた(どのIDEでHUBを制御しているか?によって使えるmoduleが変わる印象があるのだが)
詳細:
テストに使ったソースコードは以下
LEGO SPIKE HUB側 (IDEを使わずTeraTermからコーディング) PORT_Fを使っている(PowerUpConnectorで接続)

#
# LEGO UART TEST
#


import utime
from hub import port

port.A.mode(port.MODE_FULL_DUPLEX)
utime.sleep(1)                   #  delay for setup ????

port.A.baud(9600)
MSG = 'from LEGO SPIKE'
counter = 0
buf = bytearray(100)
while True:
    msg = MSG + '(' + str(counter) + ')'
    print("send:", msg)
    port.A.write(msg)
    size = port.A.read(buf)
    if size > 0:
       print('received:', buf[0:size])
    utime.sleep(1)
    counter += 1

port(A)のモードを切り替えてすぐにbaudrateとかread/writeを実行するとエラーになる。
一方、対話的にゆっくり進めるとエラーにならない。なぜ??
よく分からないが、workaroundで1秒待つ utime.sleep(1)を入れるとエラーが出なくなった。
ハードの初期化に時間がかかってメソッドの入れ替えが遅いのか???

マイコン側(ESP32-C3)

import machine
import time

uart1 = machine.UART(1)
uart1.init(baudrate=9600, bits=8, parity=None, stop=1, tx=21, rx=20)

counter = 0
MSG = b'hello from ESP32'
while True:
   if uart1.any() > 0:
       print('received:', uart1.read())
   msg = f'{MSG}({counter})'  
   print('send:', msg)
   uart1.write(msg)
   time.sleep(1)
   counter += 1   

LEGO SPIKE HUBとマイコンの接続

通信テスト中のPC画面

LEGO Education SPIKEのIDEからのPGでも動作を確認