Skip to content

Instantly share code, notes, and snippets.

@vestige
Created April 30, 2026 01:35
Show Gist options
  • Select an option

  • Save vestige/d3db655feb9860158ce80957a96d671e to your computer and use it in GitHub Desktop.

Select an option

Save vestige/d3db655feb9860158ce80957a96d671e to your computer and use it in GitHub Desktop.

RoboCar.py メモ

1. 今回の修正ポイント

1-1. 起動直後に勝手に動く問題への対策

  • 起動時の初期状態を STOP に変更。
  • 起動シーケンスで必ず Brake() を実行して安全停止。
  • 障害物回避は「MotionEnabled == True かつ前進中」のときだけ有効化。

1-2. スライダーを動かさないと動かない問題への対策

  • 速度コマンド /speed のパースを改善し、複数形式を受け付けるように変更。
  • 対応形式:
    • /speed?value=12345
    • /speed/12345
    • /speed=12345
    • /speed12345
  • 速度値は 0..65535 にクランプして異常値を防止。

1-3. デバッグしやすさ向上

  • ログ関数 log(level, message) を追加。
  • 状態遷移ログ set_state() を追加し、処理がどこまで進んだかを確認しやすくした。
  • 主なログレベル:
    • STATE (状態遷移)
    • NET (通信接続)
    • CMD (受信コマンド)
    • SPEED (速度変更)
    • MOTOR (モータ出力)
    • WARN / ERROR / FATAL (異常系)

1-4. 例外処理・ハング対策

  • サーバ処理全体を try/except/finally で保護。
  • 接続ソケット connfinally で確実に close。
  • 超音波距離測定にタイムアウトを追加し、Echo が変化しない場合の無限待ちを防止。
  • スレッド側 (mes_dist) でも例外を捕捉して継続動作できるようにした。

2. RoboCar.py の解説

2-1. 全体構成

  • Core0(メイン): server()
    • スマホ(MIT App Inventor)からのHTTPコマンドを受信してモータ制御。
  • Core1(サブスレッド): mes_dist()
    • 超音波センサで距離測定し、前進中のみ障害物回避を実行。
  • 共有変数 (Direction, Duty1, Duty2, MotionEnabled) は lock で保護。

2-2. 起動フロー

  1. STATE: WIFI_CONNECT に遷移。
  2. Brake() を実行して安全停止。
  3. Wi-Fi接続を待機し、接続後にIPをログ出力。
  4. 距離測定スレッド mes_dist() を起動。
  5. server() を起動し、HTTP待受開始。

2-3. モータ制御の基本

  • Forward(duty1, duty2): 前進駆動。
  • Backward(duty1, duty2): 後進駆動。
  • Brake(): 停止。
  • apply_speed_locked(): 現在の DirectionDuty に応じて実際に出力。
  • stop_locked(reason): 緊急停止系。MotionEnabled=FalseDirection=STOP を同時に反映。

2-4. 通信処理 (server)

  • accept() で接続を待受。
  • 受信HTTPの1行目から path を抽出 (parse_path)。
  • path に応じて制御:
    • /forward: 前進開始
    • /backward: 後進開始
    • /turnleft / /turnright: 旋回
    • /stop: 停止
    • /speed...: 速度更新
  • 例外時はエラーログを出して接続を閉じ、サーバ自体は継続。

2-5. 障害物回避 (mes_dist)

  • measure_distance_cm() で距離測定(タイムアウト付き)。
  • 前進中で distance < 15cm の場合:
    1. 一旦停止
    2. 右旋回(短時間)
    3. 元の前進速度に復帰
  • 測距失敗時は WARN ログを出して次周期へ。

3. ログの見方(デバッグ)

3-1. 正常起動の目安

  • STATE BOOT -> WIFI_CONNECT
  • WIFI connected IP=...
  • THREAD distance thread started
  • STATE ... -> LISTEN
  • NET listening on ...

3-2. コマンド受信確認

  • NET connected <client-ip>
  • CMD path=/forward など
  • MOTOR ... が続けば制御命令は実行されている

3-3. 典型的な異常

  • WARN invalid speed path: ...
    • App Inventor側のURL形式が想定外
  • WARN distance timeout
    • 超音波センサ配線/反射条件/ノイズの可能性
  • ERROR server exception...
    • リクエスト不正、または通信途中切断の可能性

4. 今後の改善候補

  • /forward 受信時に Duty=0 ならデフォルト速度を自動設定する。
  • DEBUG = True/False フラグを追加してログ量を切替える。
  • App Inventor側の送信URLを /speed?value=xxxxx に統一する。
  • stop を優先処理する安全系(ウォッチドッグ/タイムアウト停止)を追加する。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment