RCヘリコプターの自動操縦システム。 パート2:乗っ取り

これは、ラジコンヘリコプター用の自動操縦システムの開発に関する記事の続きです。



本格的なUAVを構築する計画はないので、ほとんどの場合、依然として手動で制御されるヘリコプターであり、レシーバーを完全に取り外すことはしません。 したがって、Arduino、ラジオ、エンジンコントローラー間の通信を何らかの方法で実装する必要があります。



まず、レシーバーがコントローラーと通信する方法を理解することにしました。 サーボがレシーバーとコントローラーに接続されると、モーターを制御する原理は、PWMに基づいたサーボと同じになります。



次に、レシーバーの出力から値を読み取ろうとすることにしました。



レシーバーとモーターコントローラーのピン配列:1-GND、2-VCC、3信号。



画像



これを行うには、レシーバー信号出力(全部で4つあり、上位2つはサーボ、次の2つはモーター制御用)をArduinoピン5,6,7,8、VCC入力の1つを5v Arduinoに、GND入力の1つをGND Arduinoに接続します。 特定の入力で信号長を読み取るpulseIn()関数を使用して、レシーバーによって生成された値を取得します。 コントロールパネルのレバーを最大限に曲げることで、必要な値を修正しました。 これらは1080から1800までの値で、ハンドルがロール、ピッチ、コースの通常の状態にあるときに表示される値は1450で、ガスの場合は1080です。



画像



スケッチは非常に簡単です。



int c1; int c2; int c3; int c4; void setup() { pinMode(5, INPUT); pinMode(6, INPUT); pinMode(7, INPUT); pinMode(8,INPUT); Serial.begin(9600); } void loop() { c1 = pulseIn(5, HIGH, 25000); c2 = pulseIn(6, HIGH, 25000); c3 = pulseIn(7, HIGH, 25000); c4 = pulseIn(8, HIGH, 25000); Serial.print("C1:"); Serial.println(c1); Serial.print("C2:"); Serial.println(c2); Serial.print("C3:"); Serial.println(c3); Serial.print("C4:"); Serial.println(c4); }
      
      







まあ、実際にはすべてがすでにArduinoに転送できるように思えますか? ここで、モーターコントローラー(Arduinoピン5および6)とサーボ(Arduinoピン7および8)をArduinoに接続し、別のスケッチを作成します。



 #include <Servo.h> Servo right; Servo left; Servo rightmot; Servo nizmot; int rightmot_pin = 5; int nizmot_pin = 6; int serv_left_pin=7; int serv_right_pin=8; int js_position = 800; int max_position = 3000; int spd1_now; void setup() { left.attach(serv_left_pin, js_position, max_position); right.attach(serv_right_pin, js_position, max_position); rightmot.attach(rightmot_pin, js_position, max_position); nizmot.attach(nizmot_pin, js_position, max_position); } void loop() { for(int i=1080,j=1800;i<1800,j>1080;i++,j--) { left.write(i); right.write(j); } for(int j=1800,i=1080;j>1080,i<1800;j--,i++) { left.write(j); right.write(i); } }
      
      





それを埋めて、待ってください、そして、ここで問題は始まります。 第一に、長い間、コントローラーがオンになる理由について困惑しなければなりませんでしたが、調整して動作を開始できませんでした。 30分後、解決策を見つけました。問題は、任意の電圧でオンになり点滅することでしたが、最低電圧が7.4ボルトのバッテリーを使用している場合にのみ機能し始めます。 一般に、Arduinoは非常によく食べられ、バッテリーからコントローラーを介して動作し、1つのバッテリーをコントローラーに、もう1つのバッテリーをモーターコントローラーに置く必要はありません(通常、コントローラーには11.1Vの大容量と電圧の強力なバッテリーがあり、小型バッテリー(850 mAh)および電圧7.4Vの制御)。



バッテリーを接続し、再試行します。 再び点滅します。 この問題を解決するには約3時間かかりましたが、コントローラーが機能するためには、電源を入れたときに何らかの形で受信機と対話する必要があることがわかりました。 どのくらい正確に、私はまだ見つけることができませんでした、おそらく受信者はそれにいくつかの特別な値を送信します。 これを解決するために、レシーバーをArduino(Arduinoピン9,10,11,12)に接続し、そこからリモートコントロールから値を読み取り、コントローラーに転送します。



 #include <Servo.h> Servo right; Servo left; Servo rightmot; Servo nizmot; int rightmot_pin = 5; int nizmot_pin = 6; int serv_left_pin=7; int serv_right_pin=8; int js_position = 800; int max_position = 3000; int c1; int c2; int c3; int c4; int spd1_now; void setup() { pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12,INPUT); left.attach(serv_left_pin, js_position, max_position); right.attach(serv_right_pin, js_position, max_position); rightmot.attach(rightmot_pin, js_position, max_position); nizmot.attach(nizmot_pin, js_position, max_position); } void loop() { c1 = pulseIn(5, HIGH, 25000); nizmot.write(c1); c2 = pulseIn(6, HIGH, 25000); rightmot.write(c2); c3 = pulseIn(7, HIGH, 25000); left.write(c3); c4 = pulseIn(8, HIGH, 25000); right.write(4); }
      
      







充填、接続、動作します!



これで、レシーバーはArduinoを介してコントローラーに接続され、Arduinoは信号をインターセプトして、コントローラーの目的のチャネルに送信します。 信号が変化するという事実(通常、値は15〜20単位減少します)にもかかわらず、ヘリコプターは空中にさえ上がります。



Arduinoボタンに追加すると、クランプされると自動制御がオンになります。



スケッチ:



 #include <Servo.h> Servo right; const int SEL = 2; // digital Servo left; Servo rightmot; Servo nizmot; int rightmot_pin = 5; int nizmot_pin = 6; int serv_left_pin=7; int serv_right_pin=8; int js_position = 800; int max_position = 3000; int c1; int c2; int c3; int c4; int spd1_now; void setup() { pinMode(SEL,INPUT); digitalWrite(SEL,HIGH); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12,INPUT); left.attach(serv_left_pin, js_position, max_position); right.attach(serv_right_pin, js_position, max_position); rightmot.attach(rightmot_pin, js_position, max_position); nizmot.attach(nizmot_pin, js_position, max_position); } void loop() { if(SEL == HIGH) { c1 = pulseIn(5, HIGH, 25000); nizmot.write(c1); c2 = pulseIn(6, HIGH, 25000); rightmot.write(c2); c3 = pulseIn(7, HIGH, 25000); left.write(c3); c4 = pulseIn(8, HIGH, 25000); right.write(4); } else { for(int i=1080,j=1800;i<1800,j>1080;i++,j--) { left.write(i); right.write(j); } for(int j=1800,i=1080;j>1080,i<1800;j--,i++) { left.write(j); right.write(i); } } }
      
      





Arduinoに制御を移すには、バッテリーを接続し、コントローラーのインジケーターが常時点灯し始めるまで待つ必要があります。その後、原則として、レシーバーをオフにすることもできます。 初期化後、コントローラーはレシーバーなしですでに動作している場合があります。



この例では、(スムーズなサーボのために)サイクルを使用して、ブレードの傾斜角度が変更されます。 将来的には、ヘリコプターも同様に飛行中に制御されます。



仕事のデモンストレーション:






All Articles