【Arduinoドローン自作】NO.5 ソフトウェア製作編
...ん?!
なんか見覚えのあr....
はい。
ということで、Arduinoを使ったドローン自作連載、第五回です。
この記事では、ドローンに搭載したArduinoのプログラムの説明を行います。
本研究において、ドローンを飛行させるために、主に3つの部分においてプログラミングを行っている。1つ目は、ドローン本体の制御機能、2つは、リモコン側の制御指令の送信機能、3つ目はパソコンのGUIである。この章では、それぞれのプログラミングについて説明を行います。
機体側のプログラム
本体プログラムの一番大きな役割は、もちろん、ドローンの制御です。リモコンから送られてきた操縦指令をもとに、4つのプロペラの回転速度をリアルタイムで制御します。
そのためには、高速にループを行う制御系が必要となります。
このドローンを制御するにはPID制御というものを用いているのですが、それについては後日別の記事で説明します。
簡単に言うと、センサーから機体の姿勢角を算出して、その値と目標値(水平状態)の誤差をもとに制御する方法です。
姿勢角算出
ドローンの姿勢角を取得するために、PmodNAVというセンサーを搭載しています。
PmodNAVから機体の加速度と各速度のデータを取得して、姿勢角を算出を算出します。
詳しいプログラムは、こちらを参照ください。
shizenkarasuzon.hatenablog.com
shizenkarasuzon.hatenablog.com
算出方法は、以下の数式に基づいています。
ピッチ角:
ロール角:
ヨー角:
加速度から姿勢角が求められるように変更した。式中のax, ay, azはそれぞれx、y、z軸のドローンの角速度を表しています。また、Gx,Gy、Gzはそれぞれの軸の磁束密度を表しています。
(参考文献:ロボティクスにおける地磁気センサの基礎知識 - MyEnigma)
モーター出力
ArduinoはESCにPWM(Pulse Width Modulation )信号を入力することで,モーターの回転速度を調整しています。
PWM信号とはパルス幅(入力がONになっている時間、上の図の赤い四角の部分)を変えることで信号を伝達する方式です。このドローンは、信号のON時間を1000μs~2000μsに変化させることによってモーターの回転数を変化させることができます。
ArduinoではPWMを出力する関数
analogWrite(pin, value);
という関数が存在しますが、1000μs~2000μsの間でマイクロ秒単位で出力を調整したいので、
servo.writeMicroseconds(uS)
という関数を使用しました。
詳しいプログラムは、この記事を参考にしてください。
shizenkarasuzon.hatenablog.com
バッテリー電圧取得
二次的な機能として、バッテリーの電圧を定期的に監視して、バッテリーが一定電圧以下になると、飛行を中断し下降動作に移るようなプログラムもあります。
普通に
analogRead(pin);
関数を使用して、バッテリーの電圧を0~1023の値に変換し、その値をもとに判断しています。
なお、バッテリーの電圧はそのままでは約12Vなので、抵抗を使って降圧しています。
(抵抗によるバッテリーの分圧)
リモコン側のプログラム
リモコンの役割は、ジョイスティックの傾きをもとに、ドローン本体にスロットル、前後、左右、ヨー軸回転速度の4つの操縦データを送信することである。また、ドローンから受信した姿勢角のデータを受信して、PCのディスプレイ上に表示させることもできます。
コントローラは、機体と通信するためのxBeeと、PCの2つのデバイスとシリアル通信を行っているため、SoftwareSerialというライブラリを導入しました。
shizenkarasuzon.hatenablog.com