送信機と受信機を作りネットワーク越しでRCカーを操作してみます。
前回はRCカーのサーボとモーターをUSBゲームパットで操作しました。今回はネットワーク経由で送信側と受信側を分けて小さなリモート操作のテストをしてみます。送信側はWindowsでもスマートフォンでも良いのですが、今回はraspberry Pi5を送信機にします。raspberry Pi5(ubuntu24.04)で以下のセットアップします。USBゲームパットの信号を送るだけですから環境は単純なものです。
raspberry Pi5を送信機にセットアップ
sudo apt update && sudo apt upgrade
sudo apt install python3-pip python3-venv build-essential git
python3 -m venv myenv
source myenv/bin/activate
pip3 install inputs
ネットワークで送受信をするためにIPを設定します。適宜環境に合わせてください。記事当初はシンプルなネットワーク経由の信号送受信チェックの記事にする予定でしたが、さまざまな問題があり以下コードは改良したものになります。そのためコードが長く複雑になっています。未知のエラーや不要なブロックなどもあるでしょう。例えばサーボに関しては、1~-1ではなく、0.5~-0.5にするべきですが改善していません。サーボが回転し過ぎてギリギリっとなっています。Raspberry Piを使ってゲームパッドの操作信号を受け取り、UDPソケットを介して別のRaspberry Piへ送信するためのものです。
raspberry Piの送受信コード
send.pyとreceive.py
ワードプレスに張り付けるとインデントがどうしても削除されてしまいます。どうやらコード内の<と、離れた場所の>があるため、掲載すると一行になるという現象です。google docに貼り付けました。
コードの作成で考慮したこと
リアルタイム性を重視するためにUDP(User Datagram Protocol)を使用してデータを送信しています。UDPの特性として、非接続型プロトコルであるため接続確立の遅延がなく、低オーバーヘッドでデータを送受信でき、データの損失を許容しながらも即時性を確保することが可能です。
これにより遠隔操作されるRCカーへの指令を迅速かつ連続的に送ることができ、応答性を最大化しています。
送信側が信号を出しながら突然切断が発生した場合に、RCカーは走り続けてしまうことがあります。完全な仕組みではありませんが、簡易的なタイムアウトと安全モードを入れてあります。
最後の受信時刻から一定期間データが受信されない場合(タイムアウト)、デバイスを安全な状態(モーターを停止状態に)に設定します。これにより、予期せぬ動作や事故を防ぐことができます。ネットワークが切断されるとすぐに停止状態になります。ネットワークが切断には、急発進を防ぐためにBボタンを1秒以上を押すと解除されます。まだまだ改善する部分は多いでしょう。
VPN環境を作って5G/4Gなど無線環境で操作するための準備
次はVPN環境を作って5G/4Gなど無線環境で操作するための準備をしましょう。WireGuardで構築します。Ubuntu24.04で準備します。
sudo apt update && sudo apt upgrade
sudo apt install openssh-server
sudo ufw allow 22
sudo apt install nano
以下の記事を参考にWireGuardセットアップです。セットアップしたものをサーバーの下にぶら下げます。CHUWIのミニPCは安い割に良い感じです。サーバーとして十分に性能が良いのです。
ubuntu24.04/ubuntu22.04にWireGuardをインストール
https://riragon.com/ubuntu22-04wireguard/
VPNの簡単な図
10.0.1.1-VPNサーバー
10.0.1.201-raspberry Pi4受信側 (IP:192.168.10.201)
10.0.1.202-raspberry Pi5送信側 (IP:192.168.10.202)
とこんな感じの接続になります。
前回のコードのIPをVPNに書き換えます。そしていろいろ改良しました。ワードプレスに貼るとインデントが崩れるのでgoogle docです。
RCカーの配線周りの整理整頓
熱で縮小するチューブでジャンパ線(ジャンバケーブル、テストケーブル)の接続などを外れないようにします。
ヒートガンも使いました。
ピンをまとめて蓋をします。
こういった3ピンなどは作業をしていると、接続がポロポロとれます。これにチューブを通して熱します。
こんな感じに養生できました。安心感がありますね。
ラズパイ用の電源も載せられます。いったん仮設置は完了です。
5Gでリモート操作のテスト
RCカーに5G携帯を載せてraspberry Pi4にテザリングします。5Gネットワークから、VPNを経由してraspberry Pi5と接続されます。raspberry Pi5からUSBゲームコントローラでRCカーを制御します。
片手なので上手く操作できていませんが、5GネットワークとVPNを通して操作しても十分に操作できる品質でした。サーボが左に傾いていたり、細かい微調整は必要ですが原理的には完成です。
つまり5G/4Gの電波があるところなら、どこでもリモート操作ができるRCカーが完成しました。