- 起動時の初期状態を
STOPに変更。 - 起動シーケンスで必ず
Brake()を実行して安全停止。 - 障害物回避は「
MotionEnabled == Trueかつ前進中」のときだけ有効化。
- 速度コマンド
/speedのパースを改善し、複数形式を受け付けるように変更。 - 対応形式:
/speed?value=12345/speed/12345/speed=12345/speed12345
- 速度値は
0..65535にクランプして異常値を防止。
- ログ関数
log(level, message)を追加。 - 状態遷移ログ
set_state()を追加し、処理がどこまで進んだかを確認しやすくした。 - 主なログレベル:
STATE(状態遷移)NET(通信接続)CMD(受信コマンド)SPEED(速度変更)MOTOR(モータ出力)WARN/ERROR/FATAL(異常系)
- サーバ処理全体を
try/except/finallyで保護。 - 接続ソケット
connをfinallyで確実に close。 - 超音波距離測定にタイムアウトを追加し、
Echoが変化しない場合の無限待ちを防止。 - スレッド側 (
mes_dist) でも例外を捕捉して継続動作できるようにした。
- Core0(メイン):
server()- スマホ(MIT App Inventor)からのHTTPコマンドを受信してモータ制御。
- Core1(サブスレッド):
mes_dist()- 超音波センサで距離測定し、前進中のみ障害物回避を実行。
- 共有変数 (
Direction,Duty1,Duty2,MotionEnabled) はlockで保護。
STATE: WIFI_CONNECTに遷移。Brake()を実行して安全停止。- Wi-Fi接続を待機し、接続後にIPをログ出力。
- 距離測定スレッド
mes_dist()を起動。 server()を起動し、HTTP待受開始。
Forward(duty1, duty2): 前進駆動。Backward(duty1, duty2): 後進駆動。Brake(): 停止。apply_speed_locked(): 現在のDirectionとDutyに応じて実際に出力。stop_locked(reason): 緊急停止系。MotionEnabled=FalseとDirection=STOPを同時に反映。
accept()で接続を待受。- 受信HTTPの1行目から
pathを抽出 (parse_path)。 pathに応じて制御:/forward: 前進開始/backward: 後進開始/turnleft//turnright: 旋回/stop: 停止/speed...: 速度更新
- 例外時はエラーログを出して接続を閉じ、サーバ自体は継続。
measure_distance_cm()で距離測定(タイムアウト付き)。- 前進中で
distance < 15cmの場合:- 一旦停止
- 右旋回(短時間)
- 元の前進速度に復帰
- 測距失敗時は
WARNログを出して次周期へ。
STATE BOOT -> WIFI_CONNECTWIFI connected IP=...THREAD distance thread startedSTATE ... -> LISTENNET listening on ...
NET connected <client-ip>CMD path=/forwardなどMOTOR ...が続けば制御命令は実行されている
WARN invalid speed path: ...- App Inventor側のURL形式が想定外
WARN distance timeout- 超音波センサ配線/反射条件/ノイズの可能性
ERROR server exception...- リクエスト不正、または通信途中切断の可能性
/forward受信時にDuty=0ならデフォルト速度を自動設定する。DEBUG = True/Falseフラグを追加してログ量を切替える。- App Inventor側の送信URLを
/speed?value=xxxxxに統一する。 stopを優先処理する安全系(ウォッチドッグ/タイムアウト停止)を追加する。