2: 2011-07-14 (木) 15:57:58 yoshida ソース 現: 2013-04-09 (火) 23:54:58 takaboo ソース
Line 1: Line 1:
-*プログラムの再修正 [#k7f8e282]+*プログラムの修正 [#k7f8e282]
もっと効率よく進むことができるようプログラムを修正します。 もっと効率よく進むことができるようプログラムを修正します。
Line 10: Line 10:
**グラフを作る [#g558d264] **グラフを作る [#g558d264]
赤外線反射センサの値と左右の車輪の動きをグラフにしてみます。 赤外線反射センサの値と左右の車輪の動きをグラフにしてみます。
-白と黒の地面の中心を70としていますので、ここを中心に左右が最大出力になるようにします。 +白と黒の地面の閾値を70としていますので、ここを中心に左右が最大出力になるようにします。 
-#ref(line8.png)+#ref(graph.png)
グラフの横軸は赤外線反射センサの値、縦軸は車輪のスピードです。 グラフの横軸は赤外線反射センサの値、縦軸は車輪のスピードです。
赤いラインが右車輪、青いラインが左車輪です。 赤いラインが右車輪、青いラインが左車輪です。
-黒と白の真ん中(センサ値70)の時、両車輪とも最大速度1000となります(最大値は1023ですが簡略化のため1000としました)。+センサの値が70の時、両車輪とも最大速度1023となります。 
 +センサ値が20で黒い地面となりますので、右へ曲がるため右車輪の速度は0になります。反対にセンサ値が120で白い地面となりますので、左へ曲がるため左車輪の速度は0になります。
-センサ値が70より小さい時は黒い方へずれているということなので、右車輪のスピードを下げて右へ曲がります。センサ値が小さくなるに従ってスピードを下げ右に曲がる量を増やします。+つまり、右車輪は(20,0)と(70,1023)の2点を通る直線で表すことができます。左車輪は(120,0)と(70,1023)の2点を通る直線で表すことができます。
-同様にセンサ値が70より大きい時は白い方へずれているということなので、左車輪のスピードを下げて左へ曲がります。センサ値が大きくなるに従ってスピードを下げ、左に曲がる量を増やします。 
**計算します [#wd05ab8a] **計算します [#wd05ab8a]
-グラフを式にしてみます。~ +2点を通る直線は1次関数ですので、グラフを式にすると以下のようになります。 
-右車輪のスピードが最小値(0)から最大値(1000)へ変化する部分を考えます。~ + 
-スピードをY、センサ値をXとした場合、 +***右車輪 [#m1d1d081] 
- Y = aX + b + y = (1023 / 50) * x - (2046 / 5
-となります。これはXが70であればYは1000となるので、 +小数点数は扱いませんので、整数化します。 
- 1000 = 70a + b + y = 20 * x - 409 
-と置き換えます。これを最初の式に当てはめると + 
- Y = aX + 1000 - 70a +***左車輪 [#s2cab8e6] 
-となります。 + y = -(1023 / 50) * x + (12276 / 5) 
-ここでのaはグラフの傾きです。+左車輪も同様に整数化します。 
 + y = -20 * x + 2455 
 + 
 +**スピードの補正 [#v3af612b] 
 +右車輪と左車輪の動きは数式で求められましたが、実際にはアクチュエータ側の制限がありますので、速度設定時に範囲外の値を補正します。 
 +#html{{ 
 +<pre class="brush:c"> 
 +// アクチュエータ操作 
 +void Direction (short left, short right) { 
 +  if (left < 0) left = 0; 
 +  else if (left > 1023) left = 1023; 
 +  if (right < 0) right = 0; 
 +  else if (right > 1023) right = 1023; 
 +  fd_DXSetSpeed (1, -right); 
 +  fd_DXSetSpeed (2, left); 
 +
 +</pre> 
 +}} 
 +AX-12Aを逆転させるには-(マイナス)値を指定すれば問題ありませんが、後退もその場での旋回も行いませんので、有効範囲を0~1023とします。 
 +範囲外の値については、0以下の場合は0、1023以上は1023に補正します。 
 + 
 +**プログラム完成 [#y8b96e69] 
 +#html{{ 
 +<pre class="brush:c"> 
 +#include <fd.h> 
 +// アクチュエータ操作 
 +void Direction (short left, short right) { 
 +  if (left < 0) left = 0; 
 +  else if (left > 1023) left = 1023; 
 +  if (right < 0) right = 0; 
 +  else if (right > 1023) right = 1023; 
 +  fd_DXSetSpeed (1, -right); 
 +  fd_DXSetSpeed (2, left); 
 +
 +// メイン関数 
 +void main (void) { 
 +  uint8_t GroundData; 
 + 
 +  fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); 
 +  fd_SetUVThreshold (7.4); 
 +  DX_ChangeBaudrate (1000000); 
 + 
 +  fd_DXSetEndlessTurn (1, true); 
 +  fd_DXSetEndlessTurn (2, true); 
 + 
 +  while (!fd_GetPB () && !fd_rx_buff ()) { 
 +   DX_ReadByteData (100, 28, &GroundData, 10, NULL); 
 +   fd_printf ("ground: %3d\r", GroundData); 
 +   Direction (-20 * GroundData + 2455, 20 * GroundData - 409); 
 +   fd_Wait (10); 
 +  } 
 +  Direction (0, 0); // 停止 
 +
 +</pre> 
 +}} 
 +完成したプログラムを実行してみましょう。 
 +前章のプログラムと比べ、上手にライントレースができているでしょうか。 
 + 
 +中心となるセンサ値やグラフの傾きを変えながら、適合する値を調整してみましょう。 
 + 
 +[[次のチャプターへ>FDIIICHAPTER9.4]] 
 + 
 +[[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]に戻る


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom