航空機の無線制御を行います



この記事を読んだ後、私は発火し、飛行機にリベットを掛けるというアイデアを思いつきました。 既製の図面を取り、中国からモーター、バッテリー、プロペラを注文しました。 しかし、ラジコンは自分でそれを行うことに決めました。まず、それはとても面白く、次に、他のスペアパーツを含むパッケージがうまくいく間に何かを自分で取り上げる必要があります。

注意、写真!





管理方法と管理対象



普通の人は、受信機を取り、サーボ、速度調整器をそれに入れ、リモコンのレバーを動かし、仕事の原理について詳しく調べたり、詳細に立ち入ることなく生活を楽しんでいます。 私たちの場合、これは機能しません。 最初のタスクは、サーボがどのように制御されているかを知ることでした。 すべてが非常にシンプルであることが判明し、ドライブには3つのワイヤがあります:+電源、-電源、信号。 信号線では、可変デューティサイクルの矩形パルス。 それが何であるかを理解するために、写真を見ます:



したがって、ドライブを左端の位置に設置する場合、0.9msの持続時間で20msの間隔でパルスを送信する必要があります。右端の場合-2.1msの持続時間で、間隔は同じで、平均位置は同じです。 判明したように、速度コントローラーは同じ方法で制御されます。 主題の人は、これは通常のPWMであると言うでしょう。これはどんなマイクロコントローラーにも実装できます-些細なことです。 そこで、私は地元の店でサーボを購入し、ブレッドボード上でいわゆるATtiny13サーボテスターでリベットで固定することにしました。 そして、PWMは非常に単純ではなく、落とし穴があることがわかりました。 上記の図からわかるように、デューティサイクル(パルスの持続時間と周期の持続時間の比)は、ATtiny13の256桁のPWMカウンターの5%から10%(将来的には1.0msと2.0msの持続時間でパルスを取得します)からATtiny13の値に対応します25〜50。ただし、カウンターを埋めるのに20ミリ秒かかるという条件で、実際にはうまくいかず、9.6 MHzの周波数とプリスプリッター1024の場合、カウンターを187(TOR)に制限する必要があります。この場合、周波数は50.134 Hzになります。 ほとんどの(すべてではないにしても)サーボには正確な基準周波数ジェネレーターがないため、制御信号の周波数が少し変動することがあります。 カウンタ255のTOPから離れると、制御信号の周波数は36.76 Hzになります-一部のドライブでは動作しますが(グリッチが発生する可能性があります)、まったく動作しません。 したがって、現在、187桁のカウンターがあります。5〜10%が10〜20の値に対応しているため、10個の値のみで、ビットが不連続になります。 以下のクロック周波数とプリセレクターでプレイする場合は、8ビットPWMの比較プレートを示します。





しかし、ほとんどのマイクロコントローラーには、PWMを生成するための16ビット(またはそれ以上)のタイマーがあります。 ここで、離散性の問題はすぐに消え、周波数は正確に設定できます。 私は長い間ペイントしません、私はすぐにタブレットを与えます:





中国のサーボでは600と1200の値に大きな違いがあるとは思わないので、位置決め精度の問題は閉じていると考えることができます。



マルチチャネル管理



1つのサーボを見つけましたが、飛行機の場合は少なくとも3つと別の速度コントローラーが必要です。 「額の」解決策は、16ビットPWMの4つのチャネルを備えたマイクロコントローラーを使用することですが、そのようなコントローラーは高価であり、ボード上の多くのスペースを占有する可能性が高くなります。 2番目のオプションはソフトウェアPWMをフラッシュすることですが、プロセッサ時間を消費することもオプションではありません。 信号図をもう一度見ると、80%の時間で情報が伝達されないため、パルス自体をPWMとして1〜2ミリ秒に設定する方が合理的です。 デューティサイクルが10〜90%以上のパルスを形成して読み取る方が簡単なため、なぜデューティサイクルがこのような狭い範囲内で変動するのでしょうか。 なぜ80%の時間を占める情報量の少ない信号が必要なのですか? おそらく、これらの80%が他のアクチュエーターのパルスである可能性があり、この信号はいくつかの異なるものに分割されると思われます。 つまり、20ミリ秒の周期で、1〜2ミリ秒の持続時間を持つ10個のパルスが収まり、この信号はある種のデマルチプレクサによって、わずか20ミリ秒の周期で10個の異なる信号に分割されます。 言われるとすぐに、プロテウスでそのようなスキームを描きました:



デマルチプレクサーの役割-74HC238では、マイクロコントローラーの出力からのパルスがその入力Eに供給されます。 これらのパルスは、2ms(500Hz)の周期と50-100%のデューティサイクルを持つPWMです。 各パルスには、各チャネルのステータスを示す独自のデューティサイクルがあります。 これは、入力Eでの信号のようです。



74HC238がどの出力に電流信号を適用するかを知るには、PORTCマイクロコントローラーとデマルチプレクサーの入力A、B、Cを使用します。 その結果、出力で次の信号を取得します。



出力信号は、正しい周波数(50Hz)とデューティサイクル(5-10%)で得られます。 したがって、500 Hzの周波数と50〜100%の充填でPWMを生成する必要があります。ここに、プリスケーラと16ビットカウンタのTOPをセットアップするためのプレートがあります。



興味深いことに、可能なPWM値の数は、タイマー周波数のちょうど1000分の1です。



ソフトウェア実装


AtmelStudio6のクロック周波数が16 MHzのATmega8では、すべてが次のように実装されます。最初に、サーボの極端な位置のカウンター値を定義します。

#define LOW 16000U #define HIGH 32000U
      
      





次に、タイマー/カウンター1でPWMジェネレーターを初期化します。

 OCR1A = HIGH; //  TCCR1A = 0<<COM1A1 | 0<<COM1A0 | 1<<COM1B1 | 0<<COM1B0 | 0<<FOC1A | 0<<FOC1B | 1<<WGM11 | 1<<WGM10; //  Fast PWM   OC1B    ,    OCR1A TCCR1B = 0<<ICNC1 | 0<<ICES1 | 1<<WGM13 | 1<<WGM12 | 0<<CS12 | 0<<CS11 | 1<<CS10; // 1 TIMSK = 1<<OCIE1A | 1<<OCIE1B | 0<<TOIE1; //   
      
      





割り込みを実装するために残ります:

 ISR(TIMER1_COMPA_vect) //     ,      { //c_num- ,    , channels -    if (c_num <= 7) { OCR1B = channels[c_num]; } else { OCR1B = 0; //      8  9  } } ISR(TIMER1_COMPB_vect, ISR_NOBLOCK)//      { if (c_num <= 7) { PORTC = c_num; //  0-7     PORTC } //     0  9 if (c_num >= 9) { c_num = 0; } else { c_num++; } }
      
      





割り込みと準備をグローバルに有効にし、チャネルの値をLOWからHIGHに詰まらせ、チャネルの値を変更します。



鉄の実現



さて、理論を整理し、これをすべて実装するときが来ました。 ATmega8Aマイクロコントローラーはシステムの頭脳として選択され、16MHzのクォーツからクロックされます(16,000のサーボ位置が欲しかったからではなく、横に置いていたからです)。 MKの制御信号はUARTを経由します。 結果はそのような概略図です:



しばらくすると、そのようなスカーフが現れました。





2つの3ピンコネクタは必要ないのでハンダ付けしませんでした。また、穴のメタライゼーションがないため、それらは連続してハンダ付けされません。両側のトラックの下部コネクタでは、ワイヤで置き換えることができますが、ソフトウェアに信号を出力する問題はありません。 また、エンジンレギュレーターにはビルトインスタビライザー(WEIGHT)があるため、78L05もありません。

データを受信するには、HM-R868 無線モジュールをボードに接続します



当初、ボードに直接貼り付けると思っていましたが、このデザインは飛行機には収まりませんでした。ループを介してそれをしなければなりませんでした。 ファームウェアを変更すると、プログラミングソケットの接点を使用して、一部のシステム(サイドライトなど)のオン/オフを切り替えることができます。

料金は約20 UAH = 2.50ドル、受信者-30 UAH = 3.75ドルです。



トランスミッション部



航空機の部品がありますが、地上設備を扱うために残っています。 前述したように、データはUARTを介してチャネルごとに1バイト送信されます。 最初に、 アダプターを介してコンピューターにワイヤーでシステムを接続し、端末からコマンドを送信しました。 デコーダーがパーセルの開始を決定し、将来的にそのパーセルにアドレス指定されたパーセルを割り当てるために、最初にバイト識別子が送信され、次にチャネルの状態を決定する8バイトが送信されます。 その後、彼は無線モジュールの使用を開始し、送信機がオフになると、すべてのモーターが激しく動き始めました。 ノイズから信号をフィルタリングするために、前の9バイトすべてのXORゲートウェイの10番目のバイト。 それは助けましたが、弱く、バイト間のタイムアウトの別のチェックを追加しました。これを超えると、送信全体が無視され、受信が再開され、識別子バイトを待ちます。 XORの形式でチェックサムが追加されると、端末からコマンドを送信するのがストレスになり、スライダーでこの種のプログラムをすばやくリベットしました。



左下隅の数字はチェックサムです。 コンピューターのスライダーを動かすと、飛行機の舵が動きました! 一般に、私はこれをすべてデバッグし、リモートコントロールについて考え始めました。彼のためにこれらのジョイスティックを購入しました。

画像

しかし、その後、1つの考えが思いつきました。 かつて、Il-2 Sturmovik、Lock On、MSFSX、Ka-50 Black Sharkなど、あらゆる種類のフライトシミュレーターから引きずり出されていました。したがって、Genius F-23ジョイスティックがあり、それを固定することにしました。スライダー付きの上記プログラム。 これを実装する方法をグーグルで調べ、この投稿を見つけて、うまくいきました! 本格的なジョイスティックを使用して飛行機を制御するには、リモコンの小さなスティックを使用するよりもはるかにクールです。 一般に、すべてが最初の写真に一緒に描かれています-これは、ネットブック、ジョイスティック、FT232上のコンバーター、それに接続されたHM-T868トランスミッターです。 コンバーターは、プリンターからの2 mのケーブルで接続されているため、何らかの種類のツリーなどにマウントできます。



スタート!



だから、飛行機があり、ラジコンがあります-行きましょう!(C)最初の飛行はアスファルトの上で、その結果、胴体は半分に壊れ、半分はエンジンが切れました。 2番目の飛行は、より柔らかい表面上でした。



後続の10便もあまり成功していません。 私がジョイスティックを非常に離散的であると考える主な理由-ロールによると、ピッチ軸で16の値(可能な256ではなく)だけを与えました-良くありません。 しかし、テストの結果、航空機は著しく損傷を受け、修理することができませんでした。



-このバージョンの真実性を検証することはまだできません。 このバージョンに賛成して、飛行機を水平にするためにビデオに記録された試みも話します-それは傾いて飛んでから、反対方向に鋭く転がります(そして滑らかになければなりません)。 より視覚的なビデオを次に示します。



機器の範囲は約80mで、それでもキャッチしますが、たまにキャッチします。

まあそれだけです、あなたの注意をありがとう。 提供された情報が誰かに役立つことを願っています。 すべての質問にお答えできることを嬉しく思います。

Proteusのアーカイブ図と配線板。



All Articles