2.4GHz版プロポ作製-PCツール編


久しぶりにプロポ作製の最新状況をカキコします。

Deltang社の送信モジュールに、PICマイコンで生成したPPM信号を送り込むハードウェア構成になっています。

又、WindowsPCをプロポとして、USB経由でPICマイコンから出力するPPM信号を制御も可能ですし、スタンドアロンのプロポとしてPICマイコンに繋いだVRで操作も可能なファームウェアを開発しました。




受信モジュールには、動作チェック用のモータとリニアサーボが繋がっています。

このまま、デジQフォーミュラに載せようと企んでいたのですが、いざバラシテみると、前輪部の構造が想像と違って、機械設計はトーシローではありますが、高校で学んだ幾何を総動員した結果、改造レベルではリニアサーボによるステアリング機構は作れないと判断して挫折しました。

元々の仕様通り、後輪の左右モータでステアリング操作というのも面白く無いし・・・

ボディ内に入る超々小型のロータリーサーボを探している最中です。


今回の本題であるPCツールをご紹介


ボリュームモニター



PICマイコンに繋がっている、スロットルとステアリング用のVR値をリアルタイムにモニターできるツールです。 使用しているPICマイコンは10bit分解能なので0~1023で取れるのですが、ノイズで数値ブレが大きいので、0~511に落としました。

プロポの構造に合わせて、停止、スロットル最大、バック時のVR値を取得してアプリに記憶させられる様にしてあります。

RXダイレクトコントローラ



画面上のTrackBarをマウスで操作したり、キーボードの矢印キーで操作する事で、送信モジュールから送り出されるステアリングやスロットルのPPMパルス幅をUSB経由で操作できるようになっています。

ちょっとプログラムを改造してゲームパッド対応にすれば、PCからラジコンを操作できますね!
Windows系のスマホなら、タッチパネル対応に改造するだけでスマホ操作のラジコンにも出来そう。

このツール自体は、ラジコンカー側の機構に合わせてサーボのセンター位置や左右のリミットを設定したり、スロットル操作時のモーター速度を決める為に作りました。
バック時にモーターの最高速で走るってのも操作性が悪い場合もありますものね。

これも設定した値をアプリに記憶します。

パラメタEEPROMライター


前の2つのツールで設定したパラメタを、USB経由でPICへ送り込んで、PIC内部のEEPROMを書き換えてプロポ操作に反映させる為のツールです。

これらパラメタから、ボリューム値が増減した時にPPMパルス幅をどれだけ増減すれば良いかをプロポ側のファームウェアで算出可能なので、様々なラジコンやプロポに汎用的に使えるツール仕様になっています。

あとは、受信モジュールを何に積んで遊ぶか?ですね!!

---------------

今回のツール開発で悩まされたのが、シリアルポートの受信処理です。

例えばボリュームモニターの場合、PIC側からリアルタイムにVR値がどんどん送られて来て、そのVR値をウィンドウ上に数値とバー表示させています。

ところが、ツールウィンドウを閉じたりアプリ終了時にシリアルポートをクローズすると、例外が発生してフリーズしてしまう事があります。 どうもシリアルポートの受信イベント内で、Windowsフォームの描画など時間の掛かる処理を行うのがご法度の様です。

で、以下のように非同期デリゲートを使用する事でフリーズは解決できました。

private void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
      // 受信文字列の取得
      string receivedData;
      try
      {
           receivedData = serialPort_mon.ReadLine();
           BeginInvoke(new GetRecievedDataDelegate(ShowVolume), receivedData);
      }
      catch { }
}

private delegate void GetRecievedDataDelegate(string data);
private void ShowVolume(string data)
{
// 以下の処理をDataReceived内に書いていたらフリーズが発生していた。

    string[] volume = data.Split(',');
    if (volume[0] == "RX31")
    {
        label3.Text = "Firmware RX31";
        ThrottleBox.Text = "Throttle / Channel 1";
        SterringBox.Text = "Sterring / Channel 2";
         :
         :
    }
    else if (volume[0] == "RX41")
    {
        label3.Text = "Firmware RX41";
        ThrottleBox.Text = "Throttle / Channel 2";
        SterringBox.Text = "Sterring / Channel 1";
         :
         :
    }
}

技術的な詳しい解説は、Windows フォームのマルチスレッド処理の基礎 をご覧くださいませ。

コメント

このブログの人気の投稿

ARM用クロスコンパイラのビルド(Windows8+Cygwin)

Raspberry Pi のsleep時間測定

Cygwin+Emacs Problem