1. 自由研究に戻る

  1. 1、(STM32F103)の学習
  2. 2、加速度センサー
  3. 3、傾斜計
  4. 4、開発環境、ARM側ソフトウェア

1、ARM Cortex-M (STM32F103)の学習

  DesignWave5,6月号に沿ってトレーニングしていきます。夏休みの自由研究にしたいと思います。
 夏休みにKAST(川崎市のKSPにある)主催の学習講座がありました。対象は小中学生で、ロボットを作り、感動を体験してもらうという企画でしす。そのロボットは触覚センサーを持ち進行方向を変えながら進むというものです。マイコンは使用していなく、左右のモーターとタイヤと触覚センサーで構成されていました。
 ここではこのロボットの動きを加速度センサーで調べてみます。ロボットにマイコンを乗せてみました。実際にはUSBケーブルを接続しての実験で、ケーブルが邪魔になるのですが、触覚が壁に触れると、進路を変更し壁に沿って走るようになります。
 

触覚ロボット (写真1)クリックで動画が見られます。

・2008年5月20日(書き始め)その後遅延しています

2、加速度センサー

付属の加速度センサーと付属ソフトウェアを使って、ロボットの加速度を測定してみます。モーター制御などはしていません。
付録のSTM32に書き込まれているVirtualCOMPortをいったん消してしまうと、再度書き込みに苦労します。DWM5月号は説明不足ということなので、 参考記事があります。書かれているとおりに実行し、動きました。Acc3_V5_gainer\project\RVMDK\VirtualCOMPort.Uv2のプロジェクトには加速度センサー読み込み関数が組み込まれています。 助かりました。 念のため、DWM6月号P52に書かれている(5)割り込みテーブルの移動については、そのままプログラムの中に追記しました。
PCへの加速度データ取り込みはVBプログラムを作成し、データ処理はEXELで行います。Gainerは使っておりません。
(写真1)を動かしたとき(動画)の加速度をPCへ取り込んでみました。


 Fig1 加速度センサーのAD出力値です。動画写真は約10秒撮影しています、測定は約6秒です。ADサンプリングはSTM32の中でループで読み込まれているだけで、タイマーは使ってなく、時間管理ができていません。Z軸は1gの重力が掛かっていますので、X,Y軸に比べ値が大きくなっています。裏返しにすれば、Z軸の値が逆転するのでしょうか。


Fig.2 ロボットを静止させたときのAD出力値です。


Fig.3 オフセットを除去した時の加速値です。オフセットはキャリブレーションしたわけではなく、ADは12bitでx、y軸、z軸ともに2048が加速度0としました。
 加速度を正確に求めるにはキャリブレーションが必要ですが、そのような試験機が必要になりますね。また、加速度センサーの応答速度はADのフィルター回路の影響も受けますので、厳密に測定するのは少し大変そうですが、静的なキャリブレーション方法が参考文献(1)に紹介されています。
 水平に置いた場合、z軸には1Gの加速度が加わり、x、y軸の加速度は0になるという考えです。垂直におけばz軸の加速度が0になるという条件を使うようです。

加速度センサーの応用 参考文献(1)などによれば
・加速度以外に傾斜計、速度計、あるいは携帯端末の裏表判別や傾き検出、ハードディスクにもついていて、落下時のクラッシュ防止、車載のエアーバック用衝撃センサーなどが挙げられています

3、傾斜計

   加速度センサーは傾斜計測ができます。例えば参考文献(2)に考え方が紹介されています。

 Fig.4 は先の写真のように静止した時の傾斜角です。
     ここで求めた値は、z軸を基軸にしてそこからの傾斜角です。z軸が8度くらいの傾きで、x、y軸はz軸を基準に95度くらいの傾きです。言い換えるとx、y軸は水平方向から5度の傾きであることがわかります。

 Fig.5 動作時の傾斜角です。ばたばた暴れています。加速度センサーが振動していますが、ロボット全体が大きく振動している様子はないので、動的な計測には工夫うしないと測れないようです。
   

4、開発環境、ARM側ソフトウェア

 DWM5月号では「Keil u Vision3」と[IAR Embeded Workbench」が紹介されています。JTAGデバッガがなくても書き込みはできましたが、デバックはどうなるのでしょうか。コンパイル時にデバックオプションチック欄があります。
 ARM側ソフトウェア
  サンプルプログラム VirtualCOMPort.Uv2を修正する箇所は main.cでは1箇所、 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); を追加します。
コマンド 'A'を受信すると加速度データを送り続けます。
  
/*******************************************************************************
* Function Name  : main.
* Description    : Main routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void main(void)
{
#ifdef DEBUG
  debug();
#endif
  
  Set_System();
  Set_USBClock();
  USB_Interrupts_Config();
  Led_Config();
  Channel_Config();
  USB_Init();
  Led_RW_ON();
  
  // NVIC init	  ajima
#ifdef  EMB_FLASH
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);        /*   *********   追加 offset記述 */
#endif
 
  sendFlg = 0;
  
  while (1)
  {
    if (count_out != 0)
    {
      checkCommand();
      count_out = 0;
    }

    switch( mode )
    {
      case 'G':
        if(sendFlg > 0)
        {
          delay(CNT_DELAY);
          GAINER_To_USB_Send_Data(); /*8bit A/D value controled */ 
        }
        break;
      case 'A':                                 /*  コマンド 'A'で 加速度データ送信が始まります */
        delay(CNT_DELAY);
        ACC_To_USB_Send_Data(); /* 12bit A/D value */ 
        break;
      default:break;
    }
  }
}


 また  hw_config.cのACC_To_USB_Send_Data()は加速度データX,Y,ZをUSBポートに転送する関数です
/******************************************************************************* * Function Name : ACC_To_USB_Send_Data. * Description : send the data as Accelerator. * Input : None. * Return : none. *******************************************************************************/ void ACC_To_USB_Send_Data(void) { u16 x, y, z; x = ADC_RegularConvertedValueTab[0]; y = ADC_RegularConvertedValueTab[1]; z = ADC_RegularConvertedValueTab[2]; sprintf((char*)buffer_in, "%d,%d,%d,\r", x, y, z); count_in = strlen((char*)buffer_in); UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, count_in); SetEPTxCount(ENDP1, count_in); SetEPTxValid(ENDP1); }  
   

5、VBソフトウェア

   加速度データロギングようにVBで作った232Cソフトウェアです。Visual Baic 2005からシリアルの割り込みを受け付けられるようになりました。受信したデータはファイルにセーブして、そのあとEXCELで処理しています。
    参考文献
(1)Design Wave Magagine 2008,5月号 6月号 CQ出版社 
(2)トランジスタ技術2007年12月号
(3)傾斜センサーへの応用(日立金属)