【Arduinoドローン自作】NO.4 コントローラの製作
ドローン自作連載第4回です。
ドローンのコントローラを自作します。プロポとも呼ばれています。
コントローラの役割
ドローンのコントローラーは、専用のものがいくつも市販されています。
そして、それらを使ってドローン側のArduinoを制御することもできます。
shizenkarasuzon.hatenablog.com
しかし、今回はあえてコントローラーも製作しました
コントローラーの主な役割は、左右2つのジョイスティックの傾きをもとに、ドローンに操縦指令を送信することです。ジョイスティックの左右、上下野かは向きはそれぞれ特定の役割を持っており、リアルタイムで制御することができます。
コントローラの主な動作内容は、
- ジョイスティックの傾きを読み取る
- 傾きを0~255の値に変換
- その値をxBeeを通じてドローン本体に送信
というものです。
もう一つ、二次的な機能として、ドローンから受け取ったドローンの現在状況(姿勢角、どこかに異常がないか、etc.)をPCに送信して画面に表示させる、というものもあります。
コントローラの製作
以下のようにコントローラを製作しました。
ジョイスティックからデータ取得
まず、ジョイスティックの傾きを読み取る方法です。
shizenkarasuzon.hatenablog.com
このページを参考にしてください。
簡単に言うと、Arduinoの関数、
analogRead(pin); //ピンの入力電圧をアナログでゲットする関数
を使用しました。
ドローン本体との通信
ドローン本体とコントローラは 「xBee S2C 」という無線通信のデバイスを使用しました。
(↑通信テスト中)
これを使うと、通常のシリアル通信を行うように無線通信ができます。
だがしかし!
ただ単に
byte data = ○○; Serial.write(data);
と送信するだけだと、ドローンは正常に動きません。
なぜなら、送信しなければならないデータの数が4個(左右ジョイスティックの値で、ジョイスティック一つにつき左右の傾きと前後の傾きの2つ、つまり合計4個)あるからです!
そして、それらを一つ一つ区別してデータ送受信を行わなければなりません。
そこで、下のような独自の送受信アルゴリズムを使用しました。
shizenkarasuzon.hatenablog.com
PCとの通信
今回製作したドローンは、状態表示機能がついており、ドローンの姿勢角や速度などの飛行情報をリアルタイムでPCのディスプレイ上で確認できるようにしました。
そのために、以下のようなアルゴリズムを追加つました。
- ドローンがコントローラに飛行情報を送信
- コントローラがその情報を受信して、PCに送信
- PCにおいて、自作GUIがその情報を受信してディスプレイに表示
ここでも、1つ問題があります。
Arduinoはシリアル通信用のピンが1セット(0ピンと1ピンのこと、RXとTXと書かれている)しか用意されていません。そして、そのピンたちは、PCとシリアル接続するUSBとも電気的につながっているのです。
そのため、もしPCとUSB接続してしまうと、ドローンとの通信に使用するxBeeとのシリアル通信に使えるピンが無くなってしまうのです。(本来、xBeeとの通信は0ピンと1ピンで行う予定だった)
このアルゴリズムを実装するためにArduinoに必要な技術が「Software Serial」と呼ばれるものです。
Software Serialを使うと、通常のI/Oピンを疑似的にシリアル通信用のピンとして使用できます。
shizenkarasuzon.hatenablog.com
この機能を利用して2,3ピンをxBeeとのシリアル通信用のピンに設定し、無事プログラムを動作させることができました。
ちなみに、コントローラ裏面の様子(配線途中)です。