ROBO TXコントローラー用の独自のプログラムを作成する方法

良い一日! 今日は、ドイツの会社FischertechnikからROBO TXコントローラー用のプログラムを開発した経験を紹介します。 おそらく現時点ではトップモデルではないかもしれませんが、後で説明する基本的な原則は、このメーカーのコントローラーに出会う若い開発者にとって役に立つかもしれません。



ROBO TXコントローラー
画像



このコントローラは、主にトレーニングを目的とした単純なロボットの構築を目的としています。 シンプルなアルゴリズムを組み込むのに役立つグラフィカルプログラミング環境が含まれています。 また、Fischertechnikのロシア駐在員事務所の人たちは、作成者からのAPIを備えた動的ライブラリがあり、完全な制御を提供し、自分のソフトウェアを開発することで必要なタスクをより柔軟に解決できるようにすることを提案しました。



以前、私が勉強していたとき、MGUPI研究所に基づいてTsTPO「知的ロボット」で働いていました。 センターでは、ロボット工学の専門分野における志願者と高校生の準備に従事していました。 そして、当時それを率いていたAndrei Nazarovich Budnyakは、このコントローラー用のプログラムを作成して、ロボットをリアルタイムで制御できるようにすることを提案しました。 また、このコントローラーをBluetooth経由で制御して、無線機のようなコントロールパネルを作成するオプションも興味深いものでした。



問題を解決するには、ライブラリに付属のドキュメントを調べる必要がありました。 幸いなことに、それは非常に有益です。



コントローラーには2つのモードがあることがわかりました。

  1. コントローラのファームウェアは事前にプログラムされています(開発者ソフトウェアを使用)。
  2. COMポート経由でコンピューターからコントローラーに接続し、リアルタイムでコマンドを送信します。


第二に興味があります。 それはいくつかの段階に分けられます:

  1. 利用可能なCOMポートを検索する
  2. 特定のCOMポートを介した接続
  3. 転送エリアの起動(コントローラーとコンピューター間の通信プロトコル)
  4. 必要なコマンドを転送する
  5. 乗り継ぎエリアの完成
  6. COMポートを閉じる


結局のところ、Bluetoothを介した接続の場合、このメカニズムは同じであり、ソフトウェアレベルでまったく違いはありません。 唯一のタスクは、事前にBluetooth経由でCOMポートを上げることです。



開発時には、OOPアプローチを使用しました。 この種のタスクの規模については、それほど必要ではなく、場所によっては過度であるとも言えます。 ただし、部外者が理解しやすいように、コンポーネントの形でプログラムを整然と構造化できます。 また、この記事はプログラマーを始めることを目的としており、このキーに慣れるのに役立ちます。



コメント付きのすべてのソースコード 、QTプロジェクトとしてGithubに投稿されます。 ここで、その重要なポイントについて説明します。



問題の声明



コントローラーには、4つのモーター(M1-M4)を接続するための8つの接点があります。 キーを押す/押すときのタスクは、特定のモーターをオン/オフするコントローラーに信号を送信することです。



画像



キーコードと対応するモーター番号を保存するキーのリストが必要です。 しかし、それだけではありません。 ROBO TXの接点は、パルス幅変調(PWM)パルス列を提供して、モーターの速度を制御できます。 調整範囲は1〜512です。これは、数値が小さいほど、電圧が適用される頻度が低くなり、常に同じ値(12V)になることを意味します。 まだ回転の方向があります。 さらに、コントローラーは一度に最大9個のループ(マスター1個と追加8個)を使用してグループにまとめることができます。



要約し、理解を深めるために、主要なパラメーター入力フォームの最終的なインターフェイスを同時に見ていきます。



画像



リストがあると、特定のコードのキーを押すと、それを見つけて、コントローラーに渡すパラメーターを決定し、それらを送信できます。 それはすべて一般的です。



実装



ボタンの状態をメモリに保存するために、次の構造を使用しました。



struct Button { QString name; int code; int controller; int motor; bool direction; int speed; };
      
      





特定のモーターにパラメーターを渡すftMscLib.dll動的ライブラリーのメソッドは、 setOutPwmValuesと呼ばれます



4つのパラメーターが必要です。

  1. COMポートを介した接続ID
  2. コントローラー番号(0-メイン、1-8接続済み)
  3. 連絡先番号(1-8)ですが、この場合はモーター番号(1-4)* 2 +方向(0-1)です
  4. パルス密度(0-512)


プログラムの機能全体は、個別のクラスによって実装される次のコンポーネントに分割されました。

  1. LibLoader-ダイナミックライブラリftMscLib.dllの接続を担当します。
  2. コネクタ-コントローラへの接続を担当します。
  3. コントローラー-キーのリストに応じてコントローラーモーターを制御し、カプセル化します。
  4. FileManager-ファイルとの間でキーのリストをアップロード/ダウンロードします。


コントローラーとの対話の段階。



最初にリストされたステップに戻ります。



1.利用可能なCOMポートを検索する
 Connector::Connector() { //     found = false; connected = false; started = false; } //   bool Connector::searchCom() { ports.clear(); char *portName = new char[256]; for (int i=0;i<libLoader.getAvailableComPorts(0);i++) { libLoader.enumComPorts(i,portName,256); ports.push_back(QString::fromLocal8Bit(portName)); } return found = ports.size()>0 || debug; }
      
      





2.特定のCOMポートを介した接続
 //    bool Connector::openCom(char* comPortName) { DWORD errCode = FTLIB_ERR_SUCCESS; fthdl = libLoader.ftxOpenComDevice(comPortName, 38400, &errCode); if (errCode==FTLIB_ERR_SUCCESS || debug) connected = true; return connected; }
      
      





3.転送エリアの起動
 //     (Transfer Area) [     ] bool Connector::startTA() { if (libLoader.ftxStartTransferArea(fthdl)==FTLIB_ERR_SUCCESS || debug) { started = true; } return started; }
      
      





4.必要なコマンドを転送する
 void Controller::exec(int buttonKey, bool pressed) //          { if (connector.getStarted()) { //    for (int i=0;i<getButtons().size();i++) { //   if (buttonKey==getButtons()[i].code) { //         libLoader.setOutPwmValues( //     ,        (  ) connector.fthdl, getButtons()[i].controller, getButtons()[i].motor * 2 + (getButtons()[i].direction ? 1 : 0), getMemorySpeed(getButtons()[i], pressed) ); } } } }
      
      



getMemorySpeedメソッドについて少し説明する価値があります。 これは、バッファクランプキーの一種です。 同じモーターに関連して押されたキーのシーケンスを忘れずに、異なる速度を送信するために追加されました。 現在のモーターがある場合、最後に押されたキーの速度を返します。 それ以外の場合は、モーターを停止し、0を返します。


5.乗り継ぎエリアの完成
 //     (Transfer Area) [     ] bool Connector::stopTA() { if (libLoader.ftxStopTransferArea(fthdl)==FTLIB_ERR_SUCCESS || debug) { started = false; } return !started; }
      
      





6. COMポートを閉じる
 //   bool Connector::closeCom() { if (libLoader.ftxCloseDevice(fthdl)==FTLIB_ERR_SUCCESS || debug) { started = false; connected = false; } return !connected; }
      
      





原則として、 ftMscLib.dllライブラリがすべての重要な作業を行います。 これを便利なシェルでラップし、ニーズに合わせて調整することが重要です。



この開発は、2012年に開催された「ハードロード」コンテストのロボットフォーラムで役に立ちました。 それを使用して、ロボットはリアルタイムで制御されました。





すべてのソース、リリース、およびライブラリ自体はここに掲載されています 。 必要に応じて、変更と改善を行うことができます。 ご清聴ありがとうございました。良い一日を!



ドイツのサイトFischertechnik

ロシアのサイトFischertechnik

ロシアのコミュニティFischertechnikのサイト

ライブラリ、そのドキュメント、ドイツのサイトFischertechnikからの例とともにアーカイブ



この記事の助けをしてくれたAndrei Nazarovich Budnyakに感謝します。



All Articles