2017-01-18 10 views
-2

私は無線を介して1つのマイクロコントローラから別のマイクロコントローラにデータを送信する必要があるプロジェクトを作っています(433MHzのRFモジュールまたは2.4Ghzを使用する予定ですが、まだ決定していません)。具体的には、4つのDCモータを制御するジョイスティックを作っています。だから私の質問です:私はコードを書くとき、私は受信機のマイクロコントローラ(モータを制御するボード)または送信機のマイクロコントローラ(ジョイスティックのボード)に 'x'モータを加速するコマンドを置くべきですか?たとえば、モータ3と4を加速するためにジョイスティックを左に置くと、このコードはどこに書き込まれますか? 私はarduino(arduinoブートローダを備えたATmega328)でこのプロジェクトをやっています。マイクロコントローラから別のものにデータを送信する

+1

ジョイスティックでモーターをコントロールしたいと思う。ジョイスティックの移動=>トランスミッタMCUで 'x'を加速する=>ワイヤレス=>レシーバMCUは「accelerate X」コマンドを受信する=>モータを加速する。これが正しければ - 何が問題なのですか? – i486

+0

ジョイスティックMCUまたはレシーバMCUにモータを加速するコマンドを入力する必要がありますか?レシーバのMCUは注文を受け取り、モータに直接渡しますか?私はこれが説明するための巨大な主題であることを知っていますが、私はこれについて研究する必要があるところでは失われています。 –

+0

はい、あなたの言うことはまさに私がやりたいことです。 –

答えて

0

は、まあ、これはほとんど間違いなく「主の意見に基づく」問題であり、非常によく、閉じたかもしれません...しかし...

これはあなたのデザインで、あなたはそれを設計する必要があります。この場合、間違った答えはありません。ジョイスティックボードにジョイスティックスイッチの状態やアナログの状態を単純に渡すことができます...または...ジョイスティックボードにタイミングとジョイスティックの長さを使用させることができますあなたがデバイスの位置がすべきであると思うものを計算し、それを単に伝える(mステップをこのようにしてnステップをそのように回転させる必要があります)。または、システム全体の設計によっては、マイクロコントローラ間の負荷を均衡させるための他のソリューションが考えられます。私はあなたが本当にここでやりたがっていることは、ジョイスティックを配線しないようにするための方法としてワイヤレスと余分なMCUを「単純に」使うことだと考えています。ジョイスティックが配線されていて、あなたが1つのMCUでそれをした場合、これらはスイッチベース(アナログ抵抗ではない)のジョイスティックであるため、あるMCUはある期間(おそらくデバウンス)でスイッチ状態を読み取るだけです。そのため、無線を追加すると、無線ソリューションは同じレジスタ空間でなく、データが同じビット位置でなく、スイッチ状態だけで同じスイッチ状態を渡すことができます。必要に応じて、ジョイスティックmcuの追加の利点をデバウンスすることができます。また、状態変更を送信するだけで、N台の時間単位ごとにモーターMCUを煩わせる必要はありません。

最近、このようなモジュールを試してみましたが、非常に失望しましたが、再度試したり、別のベンダー/ビルドを検討しています。彼らは、ある種の遅い速度で4800ボー、2400ボー、などのシリアルデータのためのワイヤのような "感じる"必要があります。私は常に同じバイト0xAAを言うパターンを送信するようなことをしなければならなかった、 0xAAを検索すると、何か他のものがペイロードである数え切れないほど多くカウントされるのを見ると、そこに現れます。別のコンピュータや消耗品を使ってデータを送ったときのように、私の成功の大部分はあたかも実際には無線ではなく雑音によるものでした。彼らはこれらのトンを販売しているので、私がやったことやゴミモジュールを買ったことは間違いないでしょうか、あるいはアンテナでそれらを購入してはいけなかったのでしょうか?

私は2つのことをお勧めします。まず、mcusを起動し、有線接続を使用してアプリケーションを実行します。ちょうどいくつかのジャンパー線です。必要に応じて、おそらくプロトコルやボーレートなどを変更するときに、これに戻ってくる必要があるかもしれません。無線接続が完全に信頼できない場合でもデータが変更されていなくても、ペイロードを頻繁に送信したい場合があります(たぶん)。次回のデータパケットの処理に間に合わないことがあります。ワイヤレス接続を使用するための第2の学習は別の実験です。両側のコードは、このインターフェイスで話す方法、モータードライバなしのジョイスティック、ちょうど1つのコードから別のコードへのコードです。

あなたが常に送信する必要がない場合、おそらく良いアイデアは、あなた自身のパケットを設計することです。理想的には1つまたは複数の機能、同期パターンと長さ、または同期パターンとチェックサムまたは同期パターン、長さとチェックサム(およびペイロード)。おそらく0x7Eバイトを同期パターンとして使用します。おそらく、常に32ビットまたは4バイトのペイロードを送信するので、長さが必要ありませんし、多分ペイロードのチェックサムまたは全体の同期パターンとペイロードのチェックサムが必要になります。あなたのレシーバは、uartから循環バッファに基本的にバイトを取り込みます。まったく単純な状態マシンを使用しても、同期とバイトの検索が0x7Eでない場合は廃棄し、0x7eがゼロのペイロード状態になると破棄しますそれぞれが到着すると、チェックサムに合計する次の4バイト(ペイロード)を受信します。ペイロードの次のバイトがチェックサムである場合、それが全部一致すれば、ペイロードを制御システムに渡してスイッチ状態を更新し、またはそれを制御システムが見ているグローバル変数に押し込むジョイスティックのスイッチ状態への直接接続。

あなたは必要以上に複雑になることがありますが、この種のデザインでは、両サイドが常に同期していると仮定し、Nバイトごとに正しい位置に送信されたNバイトバイトを決して落とさない、これは一方向の通信経路なので、送信機がミッドペイロードである間に受信機が現れた場合、受信機はペイロード/パケットの中央に現れ、データの解釈において常にオフである。 slip/pppのどちらかを行うことができ、より多くの作業を追加することで、同期パターンがデータにないことを保証することができます。そうでない場合は、1回の更新につき1バイトまたは数バイトの実際のデータしか送信しない可能性が高いと想定して、複雑にする必要があるかどうかは疑問です。

なぜ私はこれらの製品を試して初めて初めて連続ストリームを試していましたか?ebayの中国からはずっと前から、「遷移密度」を保証する必要がありました。 2つの零点を連続して2つ、または2つを連続して言うことができなかったのは、基本的にバイフェーズ-1(マンチェスターⅡ)をソフトウェアで実行してから、バイトを押してから元に戻すそれは反対側にあります。うまくいけば、ハードウェアはあなたのためにそれを行い、あなたはする必要はありませんが、プッシュするとあなたはすべてのバイトを取らなければならないかもしれませんし、バイトの1ビットおきにしかペイロードがありません。 0x01(00000001)を(0101010101010110)0x55 0x56とする。うまくいけば、あなたはそれをやらなければならない、それほど楽しいことではない。

あなたのマイクロコントローラ開発ツールボックスには、いくつかのUSBシリアルソリューションが含まれている必要があります、または中国からのeBayで2つまたはadafruitまたはsparkfunから10-15ドルのためにそれらを得ることができます。陶器は時には5Vまたは3.3Vのジャンパーまたはスイッチを持っています。これらのモジュールで始める1つの方法は、これらのusbの1つを、rxまたはtxモジュールに必要なシリアルブレークアウト5Vまたは3.3に接続することです。 txの場合は、データピンにrxを入力し、データピンにはrxを入力します。そして、minicomの2つのコピーか、あなたが使っているどんなダムターミナルプログラムでも起動し、1200baudのような低速の両方に設定して、タイプを入力して、あなたが入力したものが他のものから出てくるかどうか見てください。キャラクターを押し続けると、Uは8n1と同様に良いものになり、方形波が生成されます。それはきれいに来るのですか?あなたは両側を遅くすればどうなるでしょうか?スピードアップすればどうなるでしょうか?このような簡単な実験から、プロトコールの開発を始めることができます。あなたはスコープを持っていれば(最近の方が簡単ですが、まだ数百ドルの高価かもしれませんが、1つにアクセスすることはかなり重要です)、これをさらに簡単に行うことができ、マイクロコントローラまたはUSBスコープで相手側に表示されるものを見て、どのように醜い/きれいですか?データを変更するか、連続したデータでインターフェースを叩くことで、より見やすくなりますか?

関連する問題