[[2016a/Member]] *今回の課題について [#n517a873] ロボティクス入門ゼミ3つ目の課題は、紙コップを運び、重ねるロボットを作ることでした。細かいルールは省略します。 *作成したロボットについて [#x30c4f9f] #ref(s_IMG_1390.JPG) #ref(s_IMG_1395.JPG) これが今回作成したロボットです。光センサー、超音波センサー、左右のタイヤはマスター側、アームを動かす2つのモーターはスレーブ側が操作します。 紙コップの運び方について説明します。 #ref(s_IMG_1391.JPG) まず、超音波センサーで紙コップとの距離を測りながら近づき、紙コップがアームの下に来たら止まります。 #ref(s_IMG_1392.JPG) 次に、アームを下げ、 #ref(s_IMG_1394.JPG) アームについているタイヤを回して紙コップを引き上げます。 #ref(s_IMG_1393.JPG) アームを上げます。 持ち上げた紙コップを他の紙コップの上に下ろし、重ねたものをまた同じように持ち上げて運ぶというように考えました。 *結果 [#q17b6016] ここで今回の課題の結果を書き、なぜその結果に至ったのか説明したいと思います。結果は基本得点0点、技術点2点でした。この班のロボットは紙コップを運ぶことができませんでした。紙コップの付近で止まり、持ち上げたり、下ろしたりする動作はできていたのですが、ライントレースができないというロボットの欠点により、この結果になりました。ライントレースができない理由は2つ考えられます。 **1、ロボットの幅が大きいこと [#f21553e9] この班ではマスター側とスレーブ側の2つを使って1つのロボットを作りました。それにより、ロボットが巨大になり、タイヤとタイヤの間が広くなったことでカーブで内側のタイヤを後ろに回してもカーブを曲がり切れませんでした。課題1,2で使ったロボットのような幅のロボットでないと課題2のコースをライントレースできないことがロボットを作る段階で分かっていれば結果は変わっていました。 **2、車体が重いこと [#m313671f] 課題1,2のロボットに比べて、今回のロボットは圧倒的に重いものになりました。そのため、ロボットを正面から見ると、タイヤが八の字に曲がっていました。モーターの出力を最低でも50以上にしないとすぐ動かなくなってしまうため、出力を上げた結果、カーブで光センサーが線の外に出てしまい、ライントレースができませんでした。 *プログラムについて [#y73b21c3] ライントレースができないと気付いた時には、ロボットを作り直すほどの時間は残っていませんでした。課題2でやったライントレースならすぐに終わるだろうと思っていました。そこで、最後の手段として考えたのはスタート地点からまっすぐ紙コップまで行き、1個だけ運んで、紙コップの運搬技術だけでも見てもらうということでした。結局紙コップを運ぶことはできなかったのですが。 **マスター側 [#w759db9b] #define SPEED 50 //スピード50 #define go_forward OnFwd(OUT_BC,SPEED); //前進 #define CONN 1 //スレーブを表している #define SIGNALON 21 //腕を動かすためにマスターがスレーブに送る信号 #define SIGNALOFF 22 //腕を動かし終わったことをスレーブがマスターに送る信号 #define SIGNALON2 31 #define SIGNALOFF2 32 #define turn_leftC OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); //左旋回 #define turn_rightC OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); //右折 task main() { int msg //MAILBOXに来る信号をmsgと定義する SetSensorLowspeed(S1); //端子1に超音波センサ go_forward; //前進 until(SensorUS(S1) <= 9); //センサの半径9cmに紙コップが入ったら停止 Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON ); //信号を送る while (true){ ReceiveRemoteNumber(MAILBOX2,true,msg); //msgを受け取っている間 if (msg == SIGNALOFF ){ //信号を受け取ったら左旋回する turn_leftC; Wait(1600); Off(OUT_BC); go_forward; //前進 Wait(1000); Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 ); //腕を動かすために信号を送る if (msg == SIGNALOFF2 ){ //信号を受け取ったら左旋回し、停止 turn_leftC; Wait(1000); Off(OUT_BC); }else { //それ以外では停止したまま Off(OUT_BC); } } } }