- 追加された行はこの色です。
- 削除された行はこの色です。
[[動画はこちら:https://www.youtube.com/watch?v=vz3ReqVNWz8]]
目次
#contents
*はじめに [#u50d6f67]
今回の課題は書道ロボットで、名前の中の一文字をA4用紙の中に書くロボットを作るというものでした。僕は「谷」という漢字を書きました。&br;
はじめは左右に旋回できる基本形の車体のロボットに上下できるだけのペンを付けたもので書くつもりで作りましたが、いざ動かすと旋回したときにペンの位置がずれてしまい、綺麗な角を書くことができませんでした。その改善策として、前後に進む車体にアームを付けたものに一から作り直すことで目的の文字をかけました。
*ロボット本体 [#i6276637]
**全体 [#r6254f2a]
#ref(./S__9723911.jpg,around,全体)
画像の様に前後に進む車体に横方向に動くアームを付けた形になっています。前後の動きがギア比を変えてもちょうどいい距離にならなかったので、車輪を大きいものから小さいものにすることで調整しました。アームにはモーターが一つ載っているため、車体が浮かないようにアームの逆側に重り用のタイヤを付けています。&br;
#clear
**アーム [#r7cabf87]
モーター1つが載るので、なるべく頑丈な土台の上を動くようにしました。軽量化のためになるべく少ない部品でできるようにしました。&br;
ギザギザのついたパーツによって動くようにしています。
#ref(./S__9723908.jpg,around,ペン)
#clear
**ペン [#w1846cc4]
ペンの上下のモジュールには苦労しました。&br;
まず、ペンの固定ですが、ちょうどアームのようなものがあったのでそれとゴムを使ってはさんで固定しました。上下の動作には図書館で借りた本に書いてあったものを少し応用して形にすることができました。
*プログラム [#k56a7f58]
#define XbackYforward(t) OnRev(OUT_B);OnFwd(OUT_A);Wait(t);Off(OUT_AB); //左上
#define XbackYback(t) OnRev(OUT_AB);Wait(t);Off(OUT_AB); //左下
#define XforwardYforward(t) OnFwd(OUT_AB);Wait(t);Off(OUT_AB); //右上
#define XforwardYback(t) OnRev(OUT_A);OnFwd(OUT_B);Wait(t);Off(OUT_AC); //右下
//C地点からA地点へ (Q交差点では直進、P三叉路では右折)
#define turnleft OnFwd(OUT_C);OnRev(OUT_A); //左旋回
#define left OnFwd(OUT_C);Off(OUT_A); //左に曲がる
#define right OnFwd(OUT_A);Off(OUT_C); //右に曲がる
#define turnright OnFwd(OUT_A);OnRev(OUT_C); //右旋回
#define stop2sec Off(OUT_AC);Wait(200); //2秒止まる
#define Yforward(t) OnFwd(OUT_A);Wait(t);Off(OUT_A); //上
#define Yback(t) OnRev(OUT_A);Wait(t);Off(OUT_A); //下
#define Xforward(t) OnFwd(OUT_B);Wait(t);Off(OUT_B); //右
#define Xback(t) OnRev(OUT_B);Wait(t);Off(OUT_B); //左
//ライントレース用の関数
void linetrase(int t){
ClearTimer(0);
while(FastTimer(0)<t){
if(SENSOR_3<36){
turnright;
}else if(SENSOR_3<39){
right;
Wait(2);
}else{
if(SENSOR_3<47){
OnFwd(OUT_AC);
Wait(3);
}else if(SENSOR_3<50){
left;
Wait(2);
}else{
turnleft;
}
ClearTimer(0);
}
}
}
#define writeon OnFwd(OUT_C);Wait(5);Off(OUT_C); //書き始め
#define writeoff OnRev(OUT_C);Wait(5);Off(OUT_C); //書き終わり
task main ()
{
SetSensor(SENSOR_3,SENSOR_LIGHT);
int count=0;
ClearTimer(1);
#define movetime 20 //一辺の長さ
while(count <= 1){
linetrase(28);
if(FastTimer(1)>500||count==0){
count++;
}
ClearTimer(1);
}
task main ()
{
writeon;
XbackYforward(movetime);
writeoff;
Xback(movetime*2);
writeon;
XbackYback(movetime);
writeoff;
Yback(movetime*2);
writeon;
XforwardYforward(movetime*2);
XforwardYback(movetime*2);
writeoff;
Xback(movetime);
writeon;
Xback(movetime*2);
Yback(movetime*2);
Xforward(movetime*2);
Yforward(movetime*2);
writeoff;
stop2sec;
left;
OnFwd(OUT_B);
Wait(20);
Off(OUT_C);
Wait(100);
Off(OUT_B);
linetrase(21);
stop2sec;
linetrase(28);
Off(OUT_AC);
OnRev(OUT_A);
Wait(30);
Off(OUT_A);
OnRev(OUT_B);
Wait(50);
Off(OUT_B);
OnFwd(OUT_AC);
Wait(60);
OnRev(OUT_AC);
Wait(60);
Off(OUT_AC);
}
*説明 [#kdc3ad86]
**定義 [#uf43dbf6]
まずは以下の通り全方向に動くための定義をしました。
#define XbackYforward(t) OnRev(OUT_B);OnFwd(OUT_A);Wait(t);Off(OUT_AB); //左上
#define XbackYback(t) OnRev(OUT_AB);Wait(t);Off(OUT_AB); //左下
#define XforwardYforward(t) OnFwd(OUT_AB);Wait(t);Off(OUT_AB); //右上
#define XforwardYback(t) OnRev(OUT_A);OnFwd(OUT_B);Wait(t);Off(OUT_AC); //右下
#define Yforward(t) OnFwd(OUT_A);Wait(t);Off(OUT_A); //上
#define Yback(t) OnRev(OUT_A);Wait(t);Off(OUT_A); //下
#define Xforward(t) OnFwd(OUT_B);Wait(t);Off(OUT_B); //右
#define Xback(t) OnRev(OUT_B);Wait(t);Off(OUT_B); //左
それからペンの上下の定義をしました。
#define writeon OnFwd(OUT_C);Wait(5);Off(OUT_C); //書き始め
#define writeoff OnRev(OUT_C);Wait(5);Off(OUT_C); //書き終わり
そして、この形のロボットでは横、斜め、縦の動きをすることしかできないので、マス目を意識してプログラムをするために、一辺の長さ(一辺分動く時間)を定義しました。
#define movetime 20 //一辺の長さ
**動作 [#e1234c3b]
#ref(./谷.png,around,right,書き順)
右の図の様な書き順で書きました。オレンジの部分でペンが降り、水色の部分でペンが上がります。&br;
+スタート位置から左上に1マス書き進みます。
writeon;
XbackYforward(movetime);
writeoff;
+次の書き初めの位置まで2マス移動した後、左下に1マス書き進みます。
Xback(movetime*2);
writeon;
XbackYback(movetime);
writeoff;
+2マス下に移動した後「へ」の字をかきます。
writeon;
XforwardYforward(movetime*2);
XforwardYback(movetime*2);
writeoff;
+最後に、1マス左に移動した後、「口」を書きます。
writeon;
Xback(movetime*2);
Yback(movetime*2);
Xforward(movetime*2);
Yforward(movetime*2);
writeoff;
#clear
*結果・感想 [#rf1c4458]
#ref(./S__32784393.jpg,around,結果)
少し歪みはありますが、目的の字を書くことはできました。マス目を意識することによってだいぶ簡単にプログラムをすることができたのがとてもよかったと思いました。&br;
グループで製作ということで、3人で相談しあいながらなんとか形にできたのは大きな達成感を得ることになりました。&br;
今回はアーム式だったので45°の斜め線で統一することになりましたが、SetPower関数というものがあるそうなのでそれを今度使ってみたいと思いました。&br;
おまけで、写真はありませんが、「熊」を書くプログラムも書きました。容量が大きく、defineではコンパイルができなかったので関数を使っています。最後の点3つは繰り返しを使っています。
[[プログラムはこちら>2015a/Member/morinokumasan/Mission1/program]]
#clear