※このページは,ダイスケによる個人製作ページです.
目次
#contents
*前輪操舵とは [#e5e871d2]
一般に,車は前輪の向きを変えることで曲がっています.このように,前輪の向きを変えて曲がる方法を「前輪操舵」といいます.この方法を取り入れたのが今回制作した前輪操舵ロボットです.前輪操舵を行う車には,曲がるときに必ず外側の車輪と内側の車輪の回転数に差が生じます.この問題は動力を伝えない車輪では左右の車軸を独立にすることで解消できますが,動力を伝える車輪では左右両方の車輪に動力を伝えなければならないため,ディファレンシャル・ギヤという特別なギヤを用いてスムーズに曲がれるようにしています.
*なぜ前輪操舵か [#ra8f921a]
ライントレースロボットを制作していて,より速く,正確にトレースするためには本体の構造をどうすれば良いか?を考えていたところ,ロボコンの「マイコンカーラリー」という競技を見つけました.これは,黒地に白線の書かれたコースを光センサーを積んだロボットが高速で走り,そのタイムを競うという競技です.つまり,「高速ライントレースロボット」と考えてよいと思います.その競技では,全てのロボットが前輪で舵をとること,つまり前輪操舵によって曲がっていました.そこで,この課題でも前輪操舵を取り入れることで速く正確にライントレースできるのではないか?と考え,前輪操舵ロボットを制作しました.
*ロボット紹介 [#x1d1af69]
**全体 [#z91b848e]
今回制作したロボットは,小型ながら操舵機構とディファレンシャル・ギヤの機構を備えています.
#ref(DVC00039.JPG)
ロボットの外観.ギヤやタイヤ周辺の前輪操舵の機構が見えます.
#ref(DVC00041.JPG)
左斜め後ろから見たロボット.車体中央上にあるのは操舵用のモーターで,その下には走行用のモーターがあります.後輪の間にはディファレンシャル・ギヤがあります.
**特徴 [#df558096]
***操舵部分 [#qf6d78cf]
今回制作したロボットは,青色のパーツを用いて前輪が軽く回るだけでなく水平方向に左右に回るようにしました.さらに,棒状のパーツで左右のタイヤをつなぎ,左右のタイヤが連動して方向を変えられるようにしています.また,片方の前輪に白いギヤを取り付け,モーターの動力がギヤで向きを変えられ,らせん状のギヤに伝わり,さらに白いギヤに伝わることでタイヤの向きを変えています.白いギヤを用いることで,モーターが回り続けても前輪が一定以上曲がらないようにしました.
#ref(DVC00036.JPG)
ロボット本体を上から見たところ.操舵の機構がよく分かります.
#ref(DVC00040.JPG)
ロボット本体を前から見たところ.左右のタイヤをつなぐ棒のパーツがあります.
#ref(DVC00023.JPG)
改良前の操舵機構.らせん状のギヤの代わりに傘状の小さいギヤを2つ使って動力を伝達しています.しかし,この方法だと前輪のぶれが大きく,モーターを動かしていないのにロボットが曲がってしまうという問題がありました.
#ref(DVC00024.JPG)
同じく改良前の操舵機構です.らせん状のギヤを内側に配置したため,その分動力部分が大きくなってしまっています.また,場所がなく白色のギヤが配置できないため,前輪が限界まで曲がっても軸が空転せず,機構に無理がかかってしまいました.
***動力部分 [#m9f4e23b]
前述したように,今回制作したロボットの動力伝達にはディファレンシャル・ギヤを使っています.また,もともとより速くライントレースすることを目標として制作していたロボットでしたが,実験的な意味合いもありギヤを何段も用いてゆっくり走るようにしました.
#ref(DVC00035.JPG)
ロボット本体を後ろから見たところ.モーターから後輪までの機構が見えます.後輪の間に見える大きく色の違うギヤがディファレンシャル・ギヤです.
*プログラム [#y4b12430]
#define THRESHOLD 40 //閾値
#define RUD_TIME 50 //操舵時間
sub linetreace() //ライントレースのプログラム
{
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1、センサ3は光センサ
SetSensor(SENSOR_3,SENSOR_LIGHT);
OnFwd(OUT_A);
until((SENSOR_1<THRESHOLD)||(SENSOR_3<THRESHOLD))
if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))
{
Off(OUT_A);
Wait(30);
OnFwd(OUT_A);
}
if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))
{
Off(OUT_A);
OnFwd(OUT_C);
Wait(RUD_TIME);
Off(OUT_C);
OnFwd(OUT_A);
until((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD));
if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
{
OnRev(OUT_C);
Wait(RUD_TIME);
Off(OUT_C);
OnFwd(OUT_A);
}
}
if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))
{
Off(OUT_A);
OnRev(OUT_C);
Wait(RUD_TIME);
Off(OUT_C);
OnFwd(OUT_A);
until((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD));
if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
{
OnFwd(OUT_C);
Wait(RUD_TIME);
Off(OUT_C);
OnFwd(OUT_A);
}
}
}
task main ()
{
SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2はタッチセンサ
while(true)
{
if (SENSOR_2 == 0) //センサ2がOFFのとき
{
linetreace(); //ライントレース
} else {
OnRev(OUT_A+OUT_C);
Wait(50);
Off(OUT_A+OUT_C);
Wait(300);
linetreace();
}
}
}
ロボットの制作は興味本位から順調に進みましたが,プログラムをどうして良いか全く解らず,他チームに手伝ってもらうこととなってしまいました.そのため,プログラムの詳しい説明は書けません.
*結果 [#ibe36ae4]
なんとか黒線を追うような動作を見せるものの,少し黒線から外れると逆に舵を取り,直線でも蛇行してしまう.また,速度が遅いにもかかわらずカーブではすぐにコースアウトしてしまう.
*全体を通して [#y940295d]
実際のロボコン競技での前輪操舵ライントレースロボットは,前輪の前方にたくさんの光センサが付いていて,どの光センサが反応しているかでそれに合った舵角を前輪に伝達し曲がっているためよりスムーズな旋回ができます.しかし,今回制作したロボットは光センサが2つしかなく,それに応じた舵角の変更ができないためスムーズに曲がることができなかったのだと思います.また,このロボットは構造上前輪の向きを変えただけでは曲がらず,前輪の向きを変えて,さらに後輪で進むことで曲がることができるため,小回りがきかないことも難しい点でした.結果は失敗でしたが,発想自体は面白いと思うので実際に試してみてよかったと思います.
コメントをどうぞ
#comment