Raspberry Pi Zero + Arduino連携のカメラ付きリモコン戦車

##概要
※改良版の[【改良版】Raspberry Pi Zero + Arduino連携のカメラ付きリモコン戦車](https://qiita.com/Momopi/items/4c8e4d7926525d14b375)を作成しました（2021/1/10追記）
Raspberry Pi Zero + Arduino連携のカメラ付きリモコン戦車を製作しました。
Raspberry Piだけでも実現可能ですが、「モーター制御はマイコンに任せる」ということをやってみたくなり、Raspberry Piからのシリアル通信でArduinoを制御してみました。
１作目の[Raspberry PIを使用したRC戦車の製作](https://qiita.com/Momopi/items/b485966ce8701a81551f)の改良です。
（バッテリー・モータの配置を変えて重心が前に移り、走行性能が改善しました。（2019/3/17））
![DSC_0004.JPG](https://qiita-image-store.s3.amazonaws.com/0/219051/bee3d33e-2033-b694-da2a-d2f5a202c2b9.jpeg)


##構成
- 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側プログラム](https://github.com/type89/newtank_L293D)
- Raspberry Pi側は、WebIOPiで操作画面を表示し、操作を受け付けることと、mjpg-streamerで動画配信するのみです。JavaScriptで操作画面のボタンからコマンドを生成し、pythonでシリアル通信します。
- 安定して操作するには、直進安定性が良くなくてはなりません。モーターのデューティー比率の調整はカット＆トライになるので、画面更新で変更を反映できる、JavaScript側で設定した方が便利です。
[Arduinoスケッチ](https://github.com/type89/newtank_L293D/blob/master/L293D_serial.ino)
- Arduino側では、シリアル通信で受けたコマンドをもとに、DCモータ・サーボモータを制御します。

##デバイス名の固定
今回はRaspberry PiとArduinoを連携しますが、プログラム内でデバイス名を指定するので、デバイスが毎回同じ名前で認識される必要があります。以下のサイトを参考に、Arduinoのデバイス名を固定しました。
[usb-serial のデバイスファイル名を固定する方法](http://pyopyopyo.hatenablog.com/entry/20160223/p1)

##動作デモ
![0.jpg](http://img.youtube.com/vi/y4sx5S6k5XI/0.jpg)
[障害物超え](https://youtu.be/y4sx5S6k5XI)
![0.jpg](http://img.youtube.com/vi/0C6d-8TTk_o/0.jpg)
[操縦動画（Arduino自動運転戦車を追跡）](https://youtu.be/0C6d-8TTk_o)
[Arduino自動運転戦車の記事](https://qiita.com/Momopi/items/7202f730987d0aab574d)

##作ってみた感想
- Raspberry Piのみの構成と比べると、操作ボタンを連打したときもハングせず、安定して動作するようです。
- Arduino互換機は、ATmega328Pのタイプを使用した方が認識に苦労しないので無難です。
- バッテリーを小型化するために、2ポートの「Anker PowerCore 13000」を使用しました。1ポートでRaspberry Pi、Arduino、サーボを駆動し、もう1ポートでDCモータを駆動します。
- ArduinoのUSBポートがタイプBですが、タイプBのケーブルには短くて細いものがあまりないようです。車のサイズに合わせるため、[タイプAメス-タイプBオスの変換アダプタ](https://www.amazon.co.jp/gp/product/B00008BA8P/ref=ppx_yo_dt_b_asin_title_o01__o00_s00?ie=UTF8&psc=1)と、タイプ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・シリアルで文字列受信するには](https://ch.nicovideo.jp/yugata/blomaga/ar1177727)
- [hitochan007のブログ（Pythonの勉強ブログ）](https://ameblo.jp/hitochan007/entry-12103254519.html)
- [そこに仁義はあるのか(仮) -ローカルで起動したサーバーを簡単に外部公開できるngrokと活用方法-](https://syobochim.hatenablog.com/entry/2018/12/09/183749)


##作者のサイト
- [New Momopi Blog](http://type89.pythonanywhere.com/)