ArduinoでRC受信機のPPM信号をデコードする──ステップバイステップガイド
必要な部品と材料
- Arduino UNO × 1
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
RC送信機は暗号化されたリンクと長距離通信が可能で、ワイヤレスリンクが必要なプロジェクトに最適です。RC受信機はサーボ駆動用に設計されており、各チャンネルにGND、VCC、信号の3ピンがあります。信号はパルス幅変調(1.5msで中立、1-2msで最小/最大)です。
各チャンネルをArduinoのピンにつなぐ方法だと、配線とピン数が大量に必要になり、Arduinoの割り込みピン(通常2本)以上のチャンネルを読むには遅延が生じます。これを解決するため、多くの受信機には全チャンネルデータを1信号にまとめたPPMピンが備わっています。
PPMピン信号の構成


PPM信号は、データパケットがブランク期間(約11500μs)で区切られています。パケット内のパルス間隔が各チャンネルの値に対応します。6チャンネル受信機なら7つのパルス(同期用1つ+チャンネル6つ)が含まれます。
コードではまずブランク期間を検出し、その後の6パルスを各チャンネル値として記録します。
コードの使い方

read_me() 関数:割り込み(Pin 2立ち下がり)で呼ばれ、15個の時間間隔を配列に格納します。
a = micros();
c = a - b;
b = a;
x[i] = c;
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) { ch1[j] = x[j]; }
i = 0;
}
read_rc() 関数:メインループで呼ばれ、ch1配列から10000μs以上の間隔(ブランク期間)を探し、その直後の6値をチャンネル値 ch[1]〜ch[6] として抽出します。
for (k = 14; k >= 0; k--) { if (ch1[k] > 10000) { j = k; } }
for (i = 1; i <= 6; i++) { ch[i] = (ch1[i + j] - 1000); }
Arduinoスケッチ(RC受信機チャンネル読み取り)
unsigned long int a, b, c;
int x[15], ch1[15], ch[7], i;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), read_me, FALLING);
}
void loop() {
read_rc();
Serial.print(ch[1]); Serial.print("\t");
Serial.print(ch[2]); Serial.print("\t");
Serial.print(ch[3]); Serial.print("\t");
Serial.print(ch[4]); Serial.print("\t");
Serial.print(ch[5]); Serial.print("\t");
Serial.print(ch[6]); Serial.print("\n");
delay(100);
}
void read_me() {
a = micros();
c = a - b;
b = a;
x[i] = c;
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) { ch1[j] = x[j]; }
i = 0;
}
}
void read_rc() {
int i, j, k = 0;
for (k = 14; k > -1; k--) { if (ch1[k] > 10000) { j = k; } }
for (i = 1; i <= 6; i++) { ch[i] = (ch1[i + j] - 1000); }
}
製造プロセス
- Raspberry Piダッシュボードで家庭の温度を監視する
- ArduinoだけでDTMFデコーダーを構築 – 外付けIC不要
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduinoで超音波レベーション(浮遊)装置を自作:ステップバイステップガイド
- Arduino UnoでAtmel AT89シリーズを簡単プログラミング──ステップバイステップガイド
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- Arduino UNO WiFi Webサーバー:ブラウザからLEDをON/OFF制御
- スマート駐車場カウンター:Arduino、Processing、PHPでリアルタイム車両管理
- リアルタイム心拍LEDビジュアライザー – ECGパワード
- Arduinoで自動化するChrome恐竜ゲーム – LDRとPythonで障害物を検知してジャンプ