2011年12月アーカイブ

 ジャイロ出力から角度を求めることができましたか? ここではサーボを接続して、ジャイロの角度に合わせてサーボを動かします。サーボはmbedのPWM出力を活用して駆動します。

課題5
 ジャイロ出力に合わせて、接続したサーボを動かしましょう。

mbed回路図
 サーボはmbedのp21に接続し、PWMで駆動します。

21_AS000523.GIF
 

 ゲーム・パッドに装備されているアナログ・スティックは-127~+128までの数値を出力します。一方、左右のモータを回転させるには-127~+128の数値をセットします。この関係をうまく利用して、アナログ・スティックの出力数値をモータ回転制御数値にセットすることにより、アナログ・スティックでビュートローバーの速度制御ができます。

課題1
 ゲームパッドに装備されている右アナログ・スティックを前方に倒した角度に比例してビュートローバーの速度を調整しながら前進するプログラムをビュートビルダー2で作成しましょう。

 課題1の解答はこちらからダウンロードできます。
   2bk0805_k1_sokudo.zip


1_AS000493.GIF
 ジャイロの動作は安定してきましたか? 表示を工夫して見やすくしましょう。

課題4
 ジャイロ1の出力を角度だけではなく、”*”を使って視覚的に表示しましょう。課題3までは角度を数値で表示していましたが、*を左右に動かして、視覚的に表示します。

mbedプログラミング
・目盛りの表示
 lcd.printf("--------+--------"); //角度からLCD桁への変換
  gy1_lc=(gy1_sgm-5)/10+9; //桁(0~19の20桁)のはみ出し処理
  if(gy1_lc >20){
      gy1_lc=19;
  }
  if(gy1_lc <0){
      gy1_lc=0;
  } //”*”の表示 一つ前の場所の*を消して、次を書くことを繰り返します。
 
lcd.locate(gy1_lc_old,3);
  lcd.printf(" ");
  lcd.locate(gy1_lc,3);
  lcd.printf("*");
  gy1_lc_old=gy1_lc;


■■次のURLでPublishしています。
  http://mbed.org/users/takeuchi/programs/2bk0819_Gyro_test04/lxsxaq
課題5
 課題1~課題4を参考にして、右アナログスティックを倒した方向にビュートローバが前進・後進・左右超信地旋回するようにプログラミングしましょう。動作点は半分以上スティックを倒したときとします。

 課題5の解答はこちらよりダウンロードできます。
   2bk0802_k5_all_analog.zip

21_SC000484.GIF  これで右アナログ・スティックでビュートローバーが自由に操縦できるようになりました。

22_P1220292.JPG
長野県飯田工業高校 竹内浩一

========<コラム>=====================

応用・・・右斜め方向にアナログスティックを動かしたときのプログラミングなど、様々な応用発展プログラミングをお楽しみください。

 次は、アナログ・スティックの数値を利用したプログラミングに挑戦します。


 課題3 予備のようにジャイロ出力値を積分すれば角度になりますが、次のような問題点があります。

問題点
・静止していても角度が勝手に増える、または減ってしまう。
  =>温度変化に敏感で、静止時電圧が変化=ドリフトするための現象です。
・0度から手前に回転し、0度に戻しても0度を表示しない。
  =>これもドリフトが原因です。回転中に静止時電圧が変化し続けています。
これらの問題点を少しでも解消できるようなプログラムを考えましょう。

課題3
 問題点を対策したジャイロプログラムを作成しましょう。

mbedプログラミング
■■対策1
 小数点以下3桁目を四捨五入する関数round3()を用意し、微少なジャイロ出力をノイズとしてカットします。
double round3(double x){
  double y;
  y=double(int((x+0.005)*100))/100;
  return(y);
}


■■対策2
 静止時電圧は起動時に大きく変化することが多いです。そこで、静止時電圧:gy1_centerを起動時に0.001秒間隔で10回読み取り、平均値とします。
 gy1_center=0;
  for(i=0;i<10;i++){
    gy1_center=gy1_center+round3(gy1_adc.read()*3.3);
    wait(0.01);
  }
  gy1_center=round3(gy1_center/10);


■■対策3
 ジャイロ出力を0.01秒間隔で読み取り、平均値を積分し、ノイズ対策とします。したがって、読み取り間隔は0.1秒間隔となります。
  for(i=0;i<10;i++){
      gy1_sum=gy1_sum+round3(gy1_adc.read()*3.3);
      wait(0.01);
    }
    gy1_avg=round3(gy1_sum/10);


■■次のURLでPublishしています。
  http://mbed.org/users/takeuchi/programs/2bk0819_Gyro_test03/lxrxi5





カテゴリ


Copyright (C) 2006-2015 CQ Publishing Co.,Ltd. All Rights Reserved.