Arduinoを使用したRCレシーバーPPM信号の読み取り
コンポーネントと消耗品
> |
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
RC送信機は、適切な範囲の暗号化されたリンクを備えているため、ワイヤレスリンクが必要なプロジェクトに非常に適しています。
すべてのRCレシーバーはサーボモーターを駆動するように作られています。したがって、各チャネルには、グランド、Vcc、および信号の3つのピンがあります。ここでは、特別な種類の信号が使用されます。ある間隔でパルスを送信します。サーボが1.5msのパルスを受信すると、90度に設定され、この値を1〜2msから変化させることにより、サーボは最小値と最大値になります。 (上の写真では、6チャンネルの受信機がPPMピンで示されています)
とても簡単な方法は、各ピンのパルス幅を測定し、要件に従ってそのデータをマッピングすることです。しかし、ここでの問題は次のとおりです。
- レシーバーのチャネルごとに、Arduinoピンにワイヤーを接続する必要があります。これには多くの接続が必要なだけでなく、Arduinoで多くのピンを消費します。
- ほとんどのArduinoには2つの割り込みピンがあるため、2つ以上のチャネルを使用する場合は、それを読み取ってコードに遅延を追加します。これは、一部のアプリケーションで問題になる可能性があります。
この問題を解決するために、多くの受信機にはPPMと呼ばれる追加のピンが付属しています。このPPMピンは、すべてのチャネルのデータを1つの信号で送信します。
PPMピン信号はどのように構成されていますか? <図> <図>
この信号は、空白で区切られたデータパケットで構成されます。ここで、ピーク間のスペースはチャネルの値を表します。この場合、私は6チャンネルの受信機を使用したので、7つのパルスがあります。
したがって、最初にコードで分離スペースを検出してから、各チャネルのパルスからデータの記録を開始する必要があります。
2番目の画像に見られるように、
すべてのデータは約11500マイクロ秒の時間で分離されます。各チャネルには6つ以上の値があります。
コードの使用: <図>
ここで 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; }}
この部分は割り込みピンで実行され、15の時間値を取り、配列に格納します。
別の関数 read_rc()
この部分は、10000マイクロ秒を超えるスペースを探します。この場合、分離スペースを検出し、スペースコードが次のセクションに移動することを検出します。
このスペースの後、次の6つの値はチャネル位置ごとにあり、ch [channelno]という名前の配列に格納されます。ここでは ch [1]、ch [2]、ch [3]、ch [4]、ch [5 ]、ch [6] 各チャネルの値を表します。
コード
- RCレシーバーチャネル読み取りのコード
RCレシーバーチャネルのコード読み取り Arduino
unsigned long int a、b、c; int x [15]、ch1 [15]、ch [7]、i; //値を格納する配列と変数を指定するvoidsetup(){Serial.begin(9600); pinMode(2、INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2)、read_me、FALLING); //ピン2で割り込みを有効にする} 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(){//このコードは、PPMピン(ピン2または3)からRCレシーバーから値を読み取ります//このコードは0〜1000の値のチャネル値を提供します//-:ABHILASH:-// a =micros(); //ピン値fallingc =a-b;の場合、時間値aを格納します。 // 2つのピーク間の時間を計算しますb =a; // x [i] =c; // 15個の値をarrayi =i +1に保存します; if(i ==15){for(int j =0; j <15; j ++){ch1 [j] =x [j];} i =0;}} //コピーは一時配列からのすべての値を別の配列に格納します15回の読み取り後voidread_rc(){int i、j、k =0; for(k =14; k> -1; k-){if(ch1 [k]> 10000){j =k;}} //別の配列で分離スペース10000usを検出for(i =1; i <=6; i ++){ch [i] =(ch1 [i + j] -1000);}} //分離スペースの後に6つのチャネル値を割り当てます
製造プロセス