Twitter

最近のトラックバック

無料ブログはココログ

TDS01V制御クラス

2008年3月20日 (木)

TDControl2(テスト版)

*追記
*なんと、Macへの移植に挑戦して下さっている方がいます。
*興味のある方は是非ご覧ください。
http://d.hatena.ne.jp/akio0911/20080320/1206026739

「tdc2.lzh」をダウンロード

だいぶ前に作ったTDControlですが、色々バグも有ったので、少し作り直してみました。

まだまだテスト中なので、バグが有るかもしれません。
もし、何か見つけた方は遠慮なくコメント等でお知らせください。
申し訳ないです。

さて、今回は自動で出来る処理を増やしてみました。

まず、オープンと初期化ですが、

bool Open(int com);
bool Init(float alt,float henkaku);

この二つだけで実行できます。
但し、初期化の方は少しだけ時間がかかります。
altとhenkakuについては、前までのバージョンと同じです。

次に受信ですが、

bool Recv(void);

だけで出来るようにしてみました。

これはコマンド送信、受信全て行います。
そして、データを受信した時だけtrueが戻ります。
なので、スレッドやメインループの中で、次のように使ってください
(tdcとして宣言した場合)

if(tdc.Recv()){
  
// 何か受信処理
}

結果は今までどおり、RecvData構造体に入ります。
必要なデータを10か100で割って使ってください。

詳しくは前のバージョンの解説ページをご覧ください。
前バージョン

まだまだ未完成なのでマニュアルもありません。
申し訳ないです。
なので、何か疑問や質問があったら遠慮なくお知らせください。
出来る限り答えようと思います。

■ 関数一覧

bool Open(int com)
bool Close(void)
bool Init(float alt,float henkaku)
bool Recv(void)
+今までのマニュアル操作関数
(但し、AutoStartはInitに置き換わっています)

■ 変数一覧

RECVDATA RecvData
int romver
BYTE check

2007年9月15日 (土)

TDS01V 制御クラス(詳細)

*最新テスト版公開しました
テスト版へ

■TDS01V制御クラス(TDControl)

「TDControl.lzh」をダウンロード

■はじめに

先日公開したTDS01V制御クラスの公開ページを書き直してみました。
ここで言う「制御」とは評価ボードの制御のことです。
なにぶんプログラミング初心者なので、バグや何らかの問題がある可能性もあります。
また、このページ自体にもミスがある可能性があります。
何か問題があった場合、コメント等で遠慮なくお知らせください。すいません。

■これは何?

秋月電子で販売されている TDS01V を Windows上でC++を用いてなるべく簡単に制御できるようにしたクラスです。

■動作環境

C++Builder6、Borland C++Compilerにて確認済み。
VC++では不明。

■免責・著作権

作者は、このコードを使用したことによって発生したと思われる、直接的、間接的被害に対して一切責任を負わないものとします。
このコードの著作権はMasato Takahashiが所有します。

■関数一覧

 □初期化 / 終了用
  bool OpenCom(int ComNum)
   動作:Comポートを開く。
   引数:Com番号。
   戻値:true / false ( 成功 / 失敗 )

  bool SetCom(void)
   動作:Comポートを設定する。
   引数:なし
   戻値:true / false ( 成功 / 失敗 )

  bool CloseCom(void)
   動作:Comポートを閉じる。
   引数:なし
   戻値:true / false ( 成功 / 失敗 )

 □通信用
  bool AutoStart(int cycle,float alt,float henkaku)
   動作:TDS01Vを自動的に初期化する。
   引数:cycle = 通常0 、alt = 高度の基準気圧 、henkaku = 偏角
   戻値:true / false ( 成功 / 失敗 )

  void SendCommand(WORD Command)
   動作:TDS01Vへコマンドを送る。
   引数:コマンド (後述)
   戻値:なし

  int RecvCommand(void)
   動作:TDS01Vからコマンドの返答を受信。
   引数:なし
   戻値:RECV_GOOD / RECV_BAD / RECV_NO ( 成功 / 失敗 / 未受信 )
   備考:CMD_READの返答の場合、計測結果受信処理も一度に行う

 □その他
  void SetSensorParam(int cycle,float alt,float henkaku)
   動作:自分で初期化を行う場合のセンサー設定用
   引数:cycle = 通常0 、alt = 高度の基準気圧 、henkaku = 偏角
   戻値:なし
   備考:AutoStart使用時には不要。

■使用変数

 □RecvData構造体
   int MagVX
    用途:地磁気センサ ベクトルデータX軸(μT)
    備考:10で割ることで、読むことが出来る。

   int MagVY
    用途:地磁気センサ ベクトルデータY軸(μT)
    備考:10で割ることで、読むことが出来る。

   int MagVZ
    用途:地磁気センサ ベクトルデータZ軸(μT)
    備考:10で割ることで、読むことが出来る。

   int DirDeg
    用途:方位角(度)
    備考:10で割ることで、読むことが出来る。

   int AccVX
    用途:加速度センサ ベクトルデータX軸(G)
    備考:100で割ることで、読むことが出来る。

   int AccVY
    用途:加速度センサ ベクトルデータY軸(G)
    備考:100で割ることで、読むことが出来る。

   int AccVZ
    用途:加速度センサ ベクトルデータZ軸(G)
    備考:100で割ることで、読むことが出来る。

   int RollDeg
    用途:ロール角(度)
    備考:10で割ることで、読むことが出来る。

   int PitchDeg
    用途:ピッチ角(度)
    備考:10で割ることで、読むことが出来る。

   int Barometer
    用途:気圧情報(hpa)
    備考:10で割ることで、読むことが出来る。

   int Altitude
    用途:高度情報(m)
    備考:最初に設定した基準気圧を0とした相対値で計測されている。
    備考:割る必要はない。

 □BYTE CheckSystem
  用途:状態要求に対する返答を格納
  備考:この値が0ならば正常と言うことになる。

 □int RomVersion
  用途:ロムバージョンを格納
  備考:200等のように記録されている。

■コマンド一覧

 □CMD_SET_CONDITION ( 初期化用 )( 計測条件設定 )
  動作:TDS01VにSetSensorParamで指定した設定を送る。
  備考:AutoStartを使用した場合は不要。

 □CMD_SET_SENSORTYPE ( 初期化用 )( センサ情報項目設定 )
  動作:TDS01Vから送られてくるデータ形式を指定。
  備考:AutoStartを使用した場合は不要。
  備考:データ形式は「全データ」で固定されている。

 □CMD_RESET ( 初期化用 )( リセット )
  動作:初期化する
  備考:AutoStartを使用した場合は不要。

 □CMD_MAGINIT ( 初期化用 )( 地磁気センサ初期化要求 )
  動作:地磁気センサ初期化
  備考:AutoStartを使用した場合は不要。

 □CMD_ROMVER ( ROMバージョン要求 )
  動作:ロムバージョン要求
  備考:AutoStartを使用した場合は不要。結果は int RomVersion に保存される。

 □CMD_CHECK ( 状態要求 )
  動作:状態要求
  備考:AutoStartを使用した場合は不要。結果は int CheckSystem に保存される。

 □CMD_START ( 計測開始 )
  動作:測定を開始する。
  備考:これを送るとTDS01Vはデータを送信してくる。

 □CMD_READ ( センサ情報要求 )
  動作:TDS01Vから送信されたデータを読む。
  備考:計測データの受信もコマンドへの返答の受信もこれで行う。

 □CMD_STOP ( 計測停止 )
  動作:測定停止
  備考:通常は使わない。

■例

 □宣言
  TDControl td;

  
// クラスの宣言をします。
  // ここより下は「td」として宣言したと仮定して書いています。

 □COMオープン
  if(td.OpenCom(COM番号)){
    if(td.SetCom()){
      printf("オープン成功\n");
    }else{
      td.CloseCom();
      printf("設定失敗!\n");
    }
  }else{
    printf("オープン失敗!\n");
  }

  // 例えば、このようにしてオープンしてください。
  // この辺は自由に書き換えていいです。
  // SetCom()が失敗した場合は、必ずCloseCom()を実行してください。

 □センサー初期化
  td.AutoStart(0,基準気圧,偏角);

  
// この関数で一発で初期化されます。
  // 完了するまで制御が戻りません。
  // 基準気圧は、高度が0mとなる気圧です。
  // 偏角については、TDS01Vの説明書をご覧ください。

 □測定結果を受信
  td.SendCommand(CMD_START);

  
// まずは上を実行し、TDS01Vに計測を開始させます。
  // 次に、今のコマンドに対する返答を受信しなければなりません。  

  while(1){
    int ret = td.RecvCommand();
    if(ret == RECV_BAD){
      printf("問題発生!\n");
      break;
    }
    if(ret == RECV_GOOD){
      break;
    }
  }

  // コマンド返答受信ですが、例として上のようなプログラムを作ってみました。
  // これでは暴走の危険があるので注意してください。
  
// 実際は別スレッドで毎回チェックするか、エラー処理をしっかりするか、
  // メインループ等の中で毎回チェックするようにしてください。
  // RecvCommand関数は、受信チェックと受信処理を一度にしてくれます。
  // 問題なく受信されれば、RECV_GOODを、
  // TDS01Vがエラーを返すと、RECV_BADを、
  // まだ何も受信していなければ、RECV_NOを、返します。
  // 上の例では、何かを受信するまで無限ループを続けています。

  // SendCommandRecvCommandが成功する(何か帰ってくる)まで、
  // 再び実行してはいけません。
  // なので、上のようなプログラムにして、受信するまで戻れないようにするか、
  // 別スレッドやメインループなどで、毎回チェックし、何か受信した場合、
  // 新たにSendCommandを行う等のようにしてください。

  // 次に受信を行います。

  td.SendCommand(CMD_READ);
  上の様なコマンド返答受信処理;


  // これでTDS01Vが計測結果を返してきます。
  // CMD_STARTとCMD_READは必ずセットで使います。
  // CMD_READの後にも、上と同じ様なコマンド返答受信処理を必ず行ってください。
  // そして、コマンド返答を受信した時点で、
  // 既にデータの受信は完了しています。 ( RECV_GOODの場合 )
  // 受信に関する処理は全てRecvCommandが行っています。
  // 結果は、RecvData構造体にint型で格納されています。
  // 各データはint型として宣言されているため必要に応じて割る必要があります。
  // 次のようにして取り出します。
  // ( 例として気圧とピッチ、方位角を取り出しています )

  float Barometer = td.RecvData.Barometer / 10.0;
  float Pitch = td.RecvData.PitchDeg / 10.0; 
  float Dir = td.RecvData.DirDeg / 10.0;

  // あとは、各データを自由に扱ってください。
  // なお、RecvData構造体については、上の「変数」で書いた通りです。
  // 小文字のrecvdata構造体もありますが、これは内部処理用です。

 □終了
  td.CloseCom();

  // これを呼び出すだけで終了できます。
  // ただし、終了する前に必ず実行してください。
  // 以上で説明は終了です。
  // 何か、ミスや間違い、バグを発見した場合は知らせていただけると助かります。

2007年9月 9日 (日)

TDS01V 制御クラス(C++)

*最新テスト版公開しました
テスト版へ

*もう一つ公開、解説ページを書いてみました。良かったらこちらもご覧ください。
公開、解説ページ2へ

やっとこさ完成しました!

TdcTDS01V制御クラス!
名前をTDControlと言います。

秋月で販売されている [ TDS01V ] と言う、加速度や地磁気、気圧センサーまで入った面白い製品をC++で簡単に制御できるようにしたものです。

とりあえず自分用に作っていたものなので、英語はめちゃくちゃ、ソースは汚い、無駄が多い等、あんまりいいところはないですが、とりあえずはこれで楽に使えるようになったかな、と思います。
そして、せっかく作ったので、ブログで公開してみようかなと思い、公開することにしました。

プロの方から見れば、本当に汚いソースかもしれませんが、それでも使ってみたい方がいれば、ぜひぜひ使ってみてください。
簡単な機能しかないので、少し使ってあとは改造しちゃったり自由にしてもらってオッケーです(笑)

動作確認はBorland C++ Compilerで行っています。

「TDControl.lzh」をダウンロード

簡単な関数紹介、使用条件などをtdcontrol.hに書いたので、必ず最初にご覧ください。tdcontrol.hと言うのがクラス本体です。
自分のプログラムにインクルードして使ってください。

サンプルに、sample.cppを一緒に入れています。
それと、この記事の下に簡単な使い方を書いてみました。

よかったら参考にして下さい。

質問、バグ報告、その他何でもありましたら、コメントかメールにてご連絡ください。
可能な限りお答えしようと思います。

さてさて、何でこのようなものを作ったかといいますと、directX等とくっ付けて、ゲームコントローラーとして遊んじゃおうかなぁ~なんてたくらんでるからです(笑)
頭の上に乗っけて、HMDをかぶれば、かなり面白いものが出来そうです。

さらにmitakaとくっつけようともたくらんで色々プログラム中です。
そちらも完成したら公開しようと思います。

//簡単な使い方//

以下が簡単な使い方です。
まずは、インクルードし、

TDControl td;

等のように自分のソースに宣言してやります。
そして

td.OpenCom(5);

と言う感じにしてCOMを開いてやります。
このときの引数は、COM番号で、int型です。
成功すればtrueが帰ります。

次に成功した場合、

td.SetCom();

をします。
これでCOMの設定を行います。

成功すればtrue、失敗すればfalseが帰るので、falseの場合は、

td.CloseCom();

を行い、すぐにCOMを閉じてください。
また、COMを開いた場合、終了する前にも必ずCloseComは必要です
忘れると次に開けなる可能性があるので注意してください。
そして、開けたら、今度はいよいよ通信開始です。
ただ、その前に計測条件を設定しなければなりません。

SetSensorParam(int cycle,float alt,float henkaku);

で行います。
引数のcycleは通常0です。
altは高度0になる気圧を入力してください。
henkakuは偏角設定です。
なお、AutoStartを使用する場合は、この関数は不要です(詳しくは下にあります)

以上で設定完了です。
さて、通信ですが、使う関数は

SendCommand(WORD Command)
RecvCommand(void) 

の二つのみです。

SendCommand は TDセンサにコマンドを送ります。
コマンドはソースにenum型として書いてあるのでそちらをご覧ください。
そして、そのコマンドをTDセンサの通信ルールに従って送信します。

td.SendCommand(CMD_START);

の様に呼び出すだけで、送信は完了します。
そして、受信には

RecvCommand(void)

を使用します。
引数は不要です。

この関数は、三種類の値を返してきます。
RECV_NOはまだ何も受信していないことを示します。
そのまま次の処理に移ってください。
ただし、まだ次のコマンドは送らないでください。

RECV_BADと、RECV_GOODは何か受信したときに帰ってきます。
BADの場合は、コマンド失敗、を意味します。
また送りなおす、もしくは終了してください。

GOODの方は成功を意味します。
コマンドはTDセンサが正確に受信し、ちゃんと処理された、と言う意味です。
CMD_READを送った場合には、すでに受信処理も完了しています。
RecvData構造体から、必要なデータを読み出してください。

ただし、この時int型で生のまま保存されているので、必要に応じて割ってください。
それと、TDセンサは使う前に初期化が必要です。
自分でコマンドを送信して初期化してもいいのですが、少し長くなるので、一応関数を用意しておきました。

AutoStart(int cycle,float alt,float henkaku)です。

ただし、完了するまで制御が帰ってきません。
成功すればtrue,失敗知ればfalseが帰ります。
cycle引数は通常0で、altは高度が0となる気圧を入れます。
henkakuは「計測条件設定」の「偏角設定」のことです。
以上が簡単な使い方です。