- Group電装班
- Date2026.02.22
S-320 電装File.05 実際の機体の操縦桿でラジコン飛行機を操縦!
今回は、ラジコン飛行機の操縦を、実際の機体の操縦桿でできるシステムについて紹介します!

↑実際の機体の操縦桿
フライバイワイヤでしかできないことを考えたときに、せっかくラジコン飛行機と同じように、電気信号でモータを制御しているのだから、その信号でラジコンを操縦できるようになれば、パイロットの操縦練習として効果的なのでは?と考え、このプロジェクトを始めました(後輩が進めてくれました)。
(「2週間くらいでやってほしい」と無理を言ったのに、何故か、機材が届いた翌々日には終わらせてくれていた後輩に感謝します(笑))
システム概要

こちらが、今回使用するラジコン機です。TBTと同じラダー機で、100g以上あります。そのため、飛行には様々な手続きが必要です(それについては後日引継ぎも兼ねて詳しく書きます)。
一般的にラジコン飛行機は、機体に別途受信機を取り付け、それに対応する送信機(プロポ)で機体を操縦します。

↑これが受信機。機体に取り付け、モータのコネクタと接続する。

↑これが送信機。地上からこのコントローラで、受信機に無線でデータを送る。
万が一通信が途切れた場合、例えば機体の操縦が不能になったり、彼方に飛んで行ってしまったりと、非常にクリティカルな問題になるため、普通、この送信機と受信機は、信頼性のあるメーカーの商品を購入して使用します。
つまり、無線に対応しているマイコンや、無線モジュールなどを使って、直接、自作の操縦桿とラジコン機で無線通信して飛ばすのは、非常に危険なわけです。
そこで、受信機と送信機の通信は、メーカーのものをそのまま使用し、送信機についている「トレーナー機能」と呼ばれる機能を利用して、自作の操縦桿で機体を操縦できるようにします。

トレーナー機能とは本来、トレーナーがラジコン初心者に操縦を教える際、トレーナーの送信機と初心者の送信機を有線で繋ぎ、初心者の入力データをトレーナーの送信機経由でラジコン飛行機に送ることで、万が一初心者が操縦を誤った場合も、即座にトレーナーが操縦に介入し、姿勢を立て直せる機能です。
ここで、初心者側の送信機を、自作操縦桿のマイコンに置き換え、所定の方法で入力データをトレーナーの送信機に送ることで、間接的に、自作の操縦桿でラジコン機を飛ばせるようになります。

上の写真のように、送信機の裏側にあるコネクタにコードをさし、操縦桿のマイコンと繋ぎます。そして、このコードを介して、操縦桿の入力データを、送信機に送ります。
操縦桿の入力データの変換
単純に、操縦桿の入力データ(舵角の角度情報)を、トレーナーの送信機に送っても、何もおこりません。今回の場合、Futaba社の送信機を利用したので、Futabaのトレーナー機能の設計に沿った形式で、データを送信する必要があります。
双葉の送信機を2台用意し、実際にトレーナー機能を使ってみて、送信機間の通信を監視するのがベストですが、丁度よい送信機が2台ありませんでした。
そこで、海外のオタクが似たようなことをやる際に書いてくれていた記事や、オシロスコープによる、マイコンからの信号の観察によって、手探りで入力データの変換方法を探りました(後輩が)。
そしたら、意外と早く、Futabaの送信機がトレーナー機能として受信する信号を作り出すことに成功しました。上記がその動画です。
操縦桿の入力に応じて、電圧のHighとLowの間隔が変わっているのがわかると思います。これが、Futabaの送信機が対応する信号です。
以下に、備忘録として後輩が作ってくれた、それ用のプログラムを記します。
//操縦環の可変抵抗の読み取り
#include <vector>
const int r_elevator = 2; //可変抵抗エレベーター
const int r_rudder = 3; //可変抵抗ラダー
const int outPinPPM = 8;
int ServoDegreeElevatorMax = 8800;
int ServoDegreeElevatorMin = 6200;
int ServoDegreeRudderMax = 8800;
int ServoDegreeRudderMin = 6200;
int Aeleron_uS = 1225;
int Elevator_uS = 1225;
int Throttle_uS = 750;
int Rudder_uS = 1225;
int TI_uS = 750;
int TIsw_uS = 750;
void IRAM_ATTR ppmoutput() {
int Fixed_uS = 300;
// Channel 1 - Aeleron
digitalWrite(outPinPPM, LOW);
delayMicroseconds(Fixed_uS); // Hold
digitalWrite(outPinPPM, HIGH);
delayMicroseconds(Aeleron_uS); // Hold for Aeleron_uS microseconds
// Channel 2 - Elevator
digitalWrite(outPinPPM, LOW);
delayMicroseconds(Fixed_uS); // Hold
digitalWrite(outPinPPM, HIGH);
delayMicroseconds(Elevator_uS); // Hold for Elevator_uS microseconds
// Channel 3 - Throttle
digitalWrite(outPinPPM, LOW);
delayMicroseconds(Fixed_uS); // Hold
digitalWrite(outPinPPM, HIGH);
delayMicroseconds(Throttle_uS); // Hold for Throttle_uS microseconds
// Channel 4 - Rudder
digitalWrite(outPinPPM, LOW);
delayMicroseconds(Fixed_uS); // Hold
digitalWrite(outPinPPM, HIGH);
delayMicroseconds(Rudder_uS); // Hold for Rudder_uS microseconds
// Channel 5 - TI Switch
digitalWrite(outPinPPM, LOW);
delayMicroseconds(Fixed_uS); // Hold
digitalWrite(outPinPPM, HIGH);
delayMicroseconds(TIsw_uS); // Hold for TIsw_uS microseconds
// Channel 6 - TI pot
digitalWrite(outPinPPM, LOW);
delayMicroseconds(Fixed_uS); // Hold
digitalWrite(outPinPPM, HIGH);
delayMicroseconds(TI_uS); // Hold for TI_uS microseconds
// Synchro pulse
digitalWrite(outPinPPM, LOW);
delayMicroseconds(Fixed_uS); // Hold
digitalWrite(outPinPPM, HIGH); // Start Synchro pulse
}
hw_timer_t * timer = NULL;
void setup() {
Serial.begin(115200); //これがないと次書き込む時にESP32-C3が書き込めなくなる→boot押しながらリセット一回押す→bootを押しながら書き込み
pinMode(r_elevator,INPUT);
pinMode(r_rudder,INPUT);
pinMode(outPinPPM,OUTPUT);
timer = timerBegin(1000000);
timerAttachInterrupt(timer, &ppmoutput);
timerAlarm(timer, 22000, true, 0);
}
void loop() {
int elevetor = analogRead(r_elevator);
int rudder = analogRead(r_rudder);
Elevator_uS = map(elevetor,1130,2500,1700,750);
Rudder_uS = map(rudder,1520,3200,750,1700);
Serial.printf("e:%d r:%d\n",elevetor,rudder);
}
動作チェック
オシロスコープで上手くいっていることが確認できたので、早速、送信機と操縦桿を繋ぎ、さらに送信機とラジコン飛行機の受信機を無線で繋いで、動作チェックをしてみました。
すると、、、
うまくいきました!!!(エレベータの動きが逆なのは悪しからず)
操縦桿の動きに合わせて、ラジコン機の尾翼が動いています!!ここまで三日で終わらせてくれた後輩に衝撃を受けました、、(笑)
まとめ
今回は、自作の操縦桿でラジコン飛行機を操縦する方法を紹介しました。実際に先日、パイロットと一緒に河川にラジコン機を飛ばしに行き、このシステムを使ってトレーニングしたので、明日か明後日には、その報告記事をアップする予定です。
ここまで読んでくださりありがとうございました!