概要
※改良版の【改良版】Raspberry Pi Zero + Arduino連携のカメラ付きリモコン戦車を作成しました(2021/1/10追記)
Raspberry Pi Zero + Arduino連携のカメラ付きリモコン戦車を製作しました。
Raspberry Piだけでも実現可能ですが、「モーター制御はマイコンに任せる」ということをやってみたくなり、Raspberry Piからのシリアル通信でArduinoを制御してみました。
1作目のRaspberry PIを使用したRC戦車の製作の改良です。
(バッテリー・モータの配置を変えて重心が前に移り、走行性能が改善しました。(2019/3/17))
構成
- Raspberry Pi Zero WH ーー> WebIOPi 、カメラ画像のストリーム、ngrokによるインターネット公開
- Arduino Uno互換機 ーー> DCモータの制御(L293D)、サーボの制御(カメラ台)
- Raspberry PiとArduinoをUSB接続し、Arduinoへのシリアル通信および給電を行う。
機能
- 前進・後進各4速、超信地旋回
- カメラ上下左右首振り可能
- 起動時にコンソール画面のURLをslackに投稿
必要なもの
- Raspberry Pi Zero(今回の構成では、GPIOピンを使いません)
- ELEGOO UNO R3 ボード ATmega328P ATMEGA16U2 +USBケーブル Arduino用
- タミヤ 楽しい工作シリーズ No.168 ダブルギヤボックス 左右独立4速タイプ (70168)
- タミヤ 楽しい工作シリーズ No.100 トラック&ホイールセット (70100)
- タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)
- Rasbee オリジナル L293D モーター ドライブ シールド
- HiLetgo OV5647 5MP Raspberry Pi 3 カメラ OV5647 HDカメラモジュール
- サインスマート(SainSmart) v1.3 Camera Cableカメラケーブル for Raspberry Pi Zero
- SG90 Servo SG90サーボ用ミニ2軸 オリジナル FPV 特殊なナイロン PTZ(NOサーボ) カメラマウント A838
- デジタル・マイクロサーボ SG90 *2
- 0.01μfコンデンサ
- Anker PowerCore 13000 (13000mAh 2ポート 大容量 モバイルバッテリー)
ソースコード
Raspberry Pi側プログラム
- Raspberry Pi側は、WebIOPiで操作画面を表示し、操作を受け付けることと、mjpg-streamerで動画配信するのみです。JavaScriptで操作画面のボタンからコマンドを生成し、pythonでシリアル通信します。
- 安定して操作するには、直進安定性が良くなくてはなりません。モーターのデューティー比率の調整はカット&トライになるので、画面更新で変更を反映できる、JavaScript側で設定した方が便利です。
Arduinoスケッチ
- Arduino側では、シリアル通信で受けたコマンドをもとに、DCモータ・サーボモータを制御します。
デバイス名の固定
今回はRaspberry PiとArduinoを連携しますが、プログラム内でデバイス名を指定するので、デバイスが毎回同じ名前で認識される必要があります。以下のサイトを参考に、Arduinoのデバイス名を固定しました。
usb-serial のデバイスファイル名を固定する方法
動作デモ
障害物超え
操縦動画(Arduino自動運転戦車を追跡)
Arduino自動運転戦車の記事
作ってみた感想
- Raspberry Piのみの構成と比べると、操作ボタンを連打したときもハングせず、安定して動作するようです。
- Arduino互換機は、ATmega328Pのタイプを使用した方が認識に苦労しないので無難です。
- バッテリーを小型化するために、2ポートの「Anker PowerCore 13000」を使用しました。1ポートでRaspberry Pi、Arduino、サーボを駆動し、もう1ポートでDCモータを駆動します。
- ArduinoのUSBポートがタイプBですが、タイプBのケーブルには短くて細いものがあまりないようです。車のサイズに合わせるため、タイプAメス-タイプBオスの変換アダプタと、タイプAオス-MicroBオスのリール型ケーブルを使いました。変換アダプタが高いのが難点です。
- シリアル通信で受けた文字列をArduinoで識別する際、ポインタを使って文字を区切っている制作例が多いのですが、私は苦手なので、String関数で作成しました。
- 当初、Raspberry Pi3 + Arduino Mega + L298Nモータシールド + RE-260RAモータの組み合わせで大型の車を試作しましたが、動かしているうちにUSB接続のArduinoを認識しなくなる問題が頻発しました。また、消費電力が大きいことから電池の数が多くなり(Raspberry Pi用モバイルバッテリー、モータ用単3*8、Arduino用006Pの3種)、実用に耐えない代物になってしまいました。Arduinoの認識が不安定な理由は不明ですが、Raspberry Piにいろいろなソフトが入っていたので、初期化して使用した方が良かったかのもしれません。ちなみに今回の構成では、認識には全く問題ありません。
- もともと、モーターが後部にあったことから重心が後寄りで、超堤能力に難がありました。いろいろな製作例を参考にして、駆動輪を上にして、バッテリーを車体中央に据えることで、バランスが向上し、走行性能が大幅に向上しました。バッテリーの幅が広く、そのままではキャタピタに干渉してしまうのですが、キャタピラの輪の中にバッテリーを収めることで解決しました。(2019/3/17追記)
参考にしたサイト
- 【prog】Arduino・シリアルで文字列受信するには
- hitochan007のブログ(Pythonの勉強ブログ)
- そこに仁義はあるのか(仮) -ローカルで起動したサーバーを簡単に外部公開できるngrokと活用方法-