« 2012年11月 | トップページ | 2013年5月 »

2012年12月

Scilabによるデータの可視化

ロボットづくりにおいて、ロボットが持つデータを人間にとってわかりやすい形で表示できることは大切だと私は考えています。
なぜなら、ロボットのソフトウェア修正やパラメータ調整を素早く済ませられるからです。
さて今回は、ロボットが持つデータをScilabでグラフ化するコードを公開します。
シリアル通信経由でロボットからScilabにデータを送り、グラフを表示します。
まず環境を整えるために、Windowsマシンに、Scilab 32bit版をインストールした後、以下のサイトを参考にして"Serial Communication Toolbox"をインストールしてください。
2ca9dd5aacada6363a2643f8df1bd38b_2図1 ATOMSでSerial Communication Toolboxをインストール

ロボットとPCは、以下のようにRS232-Cによるシリアル通信で接続してください。

_15_011
図2 PCとロボットの接続
ロボット側のソフトは省略しますが、以下の設定でロボットがPCへ向けてテキストを送信できるようにしておいてください。
--------
ボーレート:19200bps
パリティ:none
データビット:8bit
ストップビット:1bit
フロー制御:none
--------
ポート番号は仮にCOM4としていますが、環境にあわせてOpenSerial.sce(後述)の1行目の数字を変更してください。

今回公開するソフトは次の流れで動作します。
 1.Scilab側でデータ受信待ちを開始
 2.ロボット側からデータを送信
 3.タイムアウト設定の5秒経過後、受信したデータを画面にグラフで表示
Scilab側からの制御は一切なしで、ロボット側から一方通行でデータ送信します。
データの形式は、以下のカンマで区切った数値(CSV)形式とします。データの個数は仮に100個とします。
"x1,x2,x3 … x99,x100"
ここでx[n] (n=1,2,…100)はテキストで表された100個の数値です。
例:"10,51,344,543,423,533,62,45,345 … 24,898,32"
Scilabのコードを以下に示します。
コートは3つにわかれています。右クリックして"対象をファイルに保存"を選びコードをダウンロードしてください。
     シリアルシリアルポートを開きます。タイムアウトは5秒に設定してあります。
     シリアルポートを閉じます。
GetGraph.sce
     シリアルポートからデータを受信してグラフを表示します。
3つのファイルをダウンロードしたら、Scilabを起動し
アプリケーション(A)→SciNotes
からSciNotesを起動します。そしてSciNotesから上記3つのファイルを開きます。
0922b1e38fa26e7428cc3c74ca8b8b2a図3 ScilabのSciNotesでSCEファイルを開く

シリアルポートを開くために、OpenSerial.sceのタブを選択してから
D6108260df637b3a162aa9db5e7976f3 を押して、コードを実行してください。

その後、GetGraph.sceも同様に実行し、マイコン側からデータの受信を開始します。
GetGraph.sceを実行したら、手動で5秒以内にマイコン側からPC側へ、データを送信してください。
受信タイムアウト後に、自動的に新しいウィンドウを開き、受信したデータのグラフが表示されます。
下記の例はモータの電流制御のステップ応答を見ています。縦軸は電流[mA]、横軸は時間[0.1ms]を示しています。
1c1a6fa26f13e386461da6f46941dd5f
図4 グラフの表示


最後にCloseSerial.sceを実行して、ポートを閉じるのを忘れないでください。
以上。

-----以下、詳細説明-----
■実験環境は以下です。
Windows7 Ultimate 64bit
Scilab 5.4.0 32bit
Scilabは64bit版よりも32bitの方が、私の用途では安定しているので、32bitを利用します。
■一歩進んだプログラム
今回のプログラムでは、ロボット側とPC側は同期が取れていませんが、METEORAでは
Scilabとロボット側のソフトを工夫することで
・任意長のデータ受信
・タイムアウトなし+バッファ装備の高速通信
・エラー検出
・グラフのリアルタイム更新
・Scilab側からロボット側へのコマンド送信
をサポートしています。
コードが複雑すぎるので、今回は掲載を見送りました。
■Scilabのグラフ
縦軸・横軸に名前をつけたり、表示する値の範囲を変えたり、線の種類を変えたりと、多彩な設定をScilabはサポートしています。
また3Dグラフのプロットも可能です。
日本語の資料も多いですし、Scilab本体のヘルプも充実しているので、ぜひ挑戦されてはいかがでしょうか。

| | コメント (0) | トラックバック (0)

Bluetoothによるシリアル通信のワイヤレス化

前回書いた内容の詳細です。

ロボットに載せたマイコンのプログラムをデバッグするときは、RS232-Cによるシリアル通信で、PC上のハイパーターミナルに文字を表示させる事が多いと思います。

ロボトレース(ライントレーサー)におけるこの方式の問題点は、ケーブルがつながっていて邪魔だということです。そのため基本的に走行中はPC側へ情報を送ることができません。

しかしBluetoothシリアルモジュールのRBT-001を使うと簡単に、シリアル通信をワイヤレス化できます。METEORAにもこのBluetoothシリアルモジュールを載せています。
ワイヤレス化のメリットは
  • ロボットの走行状態をリアルタイムに可視化可能
  • ログ保存用のRAM領域が不要
  • 液晶画面不要
です。逆にデメリットは
  • Bluetootu通信モジュール分だけ重量が増加
  • PCとロボットが10m以上離れると通信不可
  • (無線特有なのか)ポートの開閉に時間が掛かる
という点では無いでしょうか。
さて、参考までにMETEORAのBluetooth部分の回路図を載せます。

0cf5a7e0221da88c288375c0bb0bbf7c

上部のIC1PORTA_Hは、STM32F103のポートAの上位8bitの端子を表しています。
右下のIC8と書かれたコネクタは、RBT-001につながるピンソケットです。ピンソケットは特殊な2mm間隔の品で、私はサトー電気で購入しました。

電源は5Vから、RBT-001に供給する3.0VをリニアレギュレータTC1185で生成しています。
RBT-001の仕様上の絶対最大定格は3.3Vらしいですが、3.3Vや5V系回路に直結するとモジュールが破損すると説明書に明記されています。そのため3.3V動作のSTM32F103では、配慮が必要です。

STM32F103側とRBT-001側の接続は以下のようになっています。

■STM32F103側                 - ■RBT-001側
USART_TX(68番ピン、PA9)   - RX
USART_RX(69番ピン、PA10) - TX

回路図にR27のプルアップ抵抗が追加されていることに注意してください。
STM32F103側では、USART_TXピンの出力モードをデフォルトのプッシュプル出力ではなく、オープンコレクタ出力に設定し、RBT-001に加わる信号電圧が0V~3.0Vの範囲に収まるようにしています。

USART_RXピンに関しては、マイコン内蔵のプルアップ抵抗を接続有りの入力として設定します。
これはRBT-001モジュールを取り外した時に、USART_RXピンがハイインピーダンス状態になって誘導ノイズを拾うのを防ぐためです。
これら上記の設定を実現する出力モード設定のソースコードを以下に示します。


/**
* @brief  Configure the USART1.
* @param  None
* @retval : None
*/
void USART1_Configuration(void)
{
  RCC_APB2PeriphClockCmd(USART1_GPIO_RCC, ENABLE);

  /* Supply APB2 clock */
  RCC_APB2PeriphClockCmd(USART1_RCC , ENABLE);

  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure USART1 Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//オープンドレイン出力に設定
  GPIO_Init(USART1_PORT, &GPIO_InitStructure);

  /* Configure USART1 Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = USART1_RX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//プルアップ抵抗を追加
  GPIO_Init(USART1_PORT, &GPIO_InitStructure);

  /* USART1 configuration ---------------------*/
  /* USART1 configured as follow:
          - BaudRate = 9600 baud
          - Word Length = 8 Bits
          - One Stop Bit
          - No parity
          - Hardware flow control disables
          - Receive and transmit enabled
   */
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No ;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStructure);
  //Enable USART1 RX empty interrupt
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  /* Enable the USART1 */
  USART_Cmd(USART1, ENABLE);
}

※ほとんどを"STM32マイコン徹底入門"のソースコードから引用させていただきました。赤字のところに注目してください。

以上の構成により、RBT-001が利用可能です。

ちなみにRBT-001のデフォルトボーレートは9600bpsですが、設定で921.6kbpsまで利用できるようです。私は115.2kbpsとしています。

| | コメント (2) | トラックバック (0)

« 2012年11月 | トップページ | 2013年5月 »