2: 2011-07-14 (木) 15:57:58 yoshida | 3: 2011-07-15 (金) 12:01:08 yoshida | ||
---|---|---|---|
Line 22: | Line 22: | ||
**計算します [#wd05ab8a] | **計算します [#wd05ab8a] | ||
グラフを式にしてみます。~ | グラフを式にしてみます。~ | ||
+ | ***右車輪 [#m1d1d081] | ||
右車輪のスピードが最小値(0)から最大値(1000)へ変化する部分を考えます。~ | 右車輪のスピードが最小値(0)から最大値(1000)へ変化する部分を考えます。~ | ||
スピードをY、センサ値をXとした場合、 | スピードをY、センサ値をXとした場合、 | ||
Line 31: | Line 32: | ||
となります。 | となります。 | ||
ここでのaはグラフの傾きです。 | ここでのaはグラフの傾きです。 | ||
+ | aを大きくすると、センサ値に合わせて右車輪のスピードが大きく下がるため、急激な右旋回となります。aを小さくすれば、スピードは余り下がらなくなるため、ゆっくりとした右旋回となります。 | ||
+ | |||
+ | aをどのような値にすれば良いかは、実際にライントレースをしながら決めます。 | ||
+ | |||
+ | センサ値が20の時、スピードが0になるよう、aの値を20とします。 | ||
+ | Y = 20X - 400 | ||
+ | |||
+ | ***左車輪 [#s2cab8e6] | ||
+ | 次に左車輪ですが、右車輪と異なりスピードが最大値(1000)から最小値(0)へ変化する部分を考えます。基本的に傾き以外右車輪と同じになります。但し、センサ値が120の時、スピードが0になりますので、aの値は-20となります。 | ||
+ | Y = -20X + 2400 | ||
+ | これでひとまずの計算は終了です。 | ||
+ | |||
+ | **スピードを設定する [#v3af612b] | ||
+ | グラフはセンサ値が70を境に反転していますので、70で処理を分割します。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | DX_ReadByteData (100, 28, &GroundData, 10, NULL); | ||
+ | if (GroundData < 70) { | ||
+ | Direction (1000, GroundData * 20 - 400); | ||
+ | } else { | ||
+ | Direction (GroundData * -20 +2400, 1000); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | 計算式をそのまま当てはめていますが、センサ値によってマイナスのスピードが作成されてしまいます。ロボット相撲と異なり、ライントレースはその場で旋回することはありませんので、スピードの最小値は0にする必要があります。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | DX_ReadByteData (100, 28, &GroundData, 10, NULL); | ||
+ | if (GroundData < 70) { | ||
+ | if ((GroundData * 20 - 400) < 0) | ||
+ | Direction (1000, 0); | ||
+ | else | ||
+ | Direction (1000, GroundData * 20 - 400); | ||
+ | } else { | ||
+ | if ((GroundData * -20 +2400) < 0) | ||
+ | Direction (0, 1000); | ||
+ | else | ||
+ | Direction (GroundData * -20 +2400, 1000); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | **プログラム完成 [#y8b96e69] | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | #include <fd.h> | ||
+ | // アクチュエータ操作 | ||
+ | void Direction (short left, short right) { | ||
+ | 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); | ||
+ | if (GroundData < 70) { // 黒検知 | ||
+ | if ((GroundData * 20 - 400) < 0) Direction (1000, 0); | ||
+ | else Direction (1000, GroundData * 20 - 400); | ||
+ | } else { | ||
+ | if ((GroundData * -20 +2400) < 0) Direction (0, 1000); | ||
+ | else Direction (GroundData * -20 +2400, 1000); | ||
+ | } | ||
+ | fd_Wait (10); | ||
+ | } | ||
+ | Direction (0, 0); // 停止 | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | 完成したプログラムを実行してみましょう。 | ||
+ | 前章のプログラムと比べ、上手にライントレースができているでしょうか。 | ||
+ | |||
+ | 中心となるセンサ値やグラフの傾きを変えながら、適合する値を調整してみましょう。 | ||
+ | |||
+ | [[次のチャプターへ>FDIIICHAPTER9.4]] | ||
+ | |||
+ | [[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]に戻る |