[[2018a/Member]] #contents *課題1:文字を書くロボット [#u393defa] A4の紙に自分にゆかりのある地名(2文字)をロボットを作成した。 *選んだ文字 [#j3b638ad] 今回は自分の苗字でもある地名の小諸市の地である"森山"を選んだ。 *車体構造 [#h082e831] 構造は基本的なものを用いx,y,z型とした紙の長編をX軸、短編をY軸、高さ(ペン)をZ軸とした。 **x軸について [#k2f13bbf] x軸はタイヤを用いて移動するようにした。ギアが余らずギア比をうまく調節できなかったため少し速度が出すぎてしまった。 **y軸について [#jb47a7bb] y軸はベルトコンベア型にした。上に乗っけたペンを下げる機構が滑ってしまうためラバーを裏返しにして使い本来ならタイヤに引っかかる凹凸のある裏面を表にして使った(画像参照)。しかしコンベアが伸びていたためうまく平らにならなく、引っかかりやすくやすくなってしまった。そのため下にテンションをかけるためのタイヤをつけてコンベアが張るようにした。&ref(2018a/Member/kan777/Mission1/xy.png,50%,y軸は画像右側の部分); **z軸について [#z403b48e] z軸はrisの特徴である平らなギアを用いた。y軸制御のコンベアに乗っける機構のため小型化が求められたがパーツの関係上少し大きくなりすぎた。縦に伸ばすことによって可能な限り可動域を確保し小型化した。 &ref(2018a/Member/kan777/Mission1/z.png,50%,ペンを上下させる機構); **車体考察 [#p1c29c1d] -車体構造の考察として最初はギアが噛み合わないところにゴムを用いたが負荷がかかるため伸びてしまいうまく使えなかった。少し無理矢理でうまく噛み合っていないところもあったが全てにおいてギアを用いた。 -ギア比を大きくしてゆっくり動かしたかったがパーツが限られていてうまく取り回しできなかった。もっとパーツのことを最初から考えて組むべきだった。 -時間がなく一から考えるのは大変だった。ネットの情報をもっと活用すべきだった。 ***全部組み合わせて動作可能な状態にした車体画像。 [#fe4537ec] &ref(2018a/Member/kan777/Mission1/全体.PNG,50%,全体像); *プログラム [#w3f91a05] #define A 8 //X軸 Aのモータ係数 #define B 8 //Y軸 Bのモータ係数 #define C 3 //Z軸 Cのモータ係数 #define DPD 2//ペンを下ろす距離(時間)はDPD*Cで決まる //初期位置は下記順通りから始まるyを真ん中 xは任意 zは上がった状態で task main(){ SetPower(OUT_A,3); SetPower(OUT_B,3); SetPower(OUT_C,2); tree(); //森 Ym(7); Xm(1); tree(); Yp(1); Xp(3); tree(); Ym(6); Xm(4); //山 Zp(DPD); Xm(8); Zm(DPD); Ym(5); Xp(3); Zp(DPD); Xm(3);Yp(10); Zm(DPD); Xp(3); Zp(DPD); Xm(4); Zm(DPD); } void tree(){ //木 Zp(DPD); Yp(6); Zm(DPD); Ym(3); Xp(1); Zp(DPD); Xm(6); Zm(DPD); Xp(5); Zp(DPD); naname1(30); Zm(DPD); Yp(3); Xp(3); Zp(DPD); naname2(30); Zm(DPD); } void naname1(int time){ OnRev(OUT_AB); Wait(time); Off(OUT_AB); Wait(1); //動作安定のためのWait } void naname2(int time){ OnRev(OUT_A); OnFwd(OUT_B); Wait(time); Off(OUT_AB); Wait(1); } void Xp(int time){ OnFwd(OUT_A); Wait(time*A); Off(OUT_A); Wait(1); } void Xm(int time){ OnRev(OUT_A); Wait(time*A); Off(OUT_A); Wait(1); } void Yp(int time){ OnFwd(OUT_B); Wait(time*B); Off(OUT_B); Wait(1); } void Ym(int time){ OnRev(OUT_B); Wait(time*B); Off(OUT_B); Wait(1); } void Zp(int time){ OnFwd(OUT_C); Wait(time*C); Off(OUT_C); Wait(1); } void Zm(int time){ OnRev(OUT_C); Wait(time*C); Off(OUT_C); Wait(1); } **プログラム説明 [#q45311d4] -ギアをうまく取り回せなく早くなりすぎてしまったので強引ではあるがsetpowerで出力を下げた。しかしxとyは出力を下げてしまうと力が足りずに動かなくなってしまったため3に戻した。 -プログラムは書き順に従ってかけることを目標に制作した。 -まず"森"という感じは"木"を3回繰り返すことでかけるので木を書くサブルーチンtree()を用いた。山はそのまま書き順通りに書き右側の最後の画がしっかり下に伸びるようにした。 -斜めの線を書くのはサブルーチンにしなくても良かったがどうせならきれいにしたいと思いサブルーチンを用いた。 -x,y,z軸はそれぞれXplus Xminus Yplus Yminus Zplus Zminus のサブルーチンを作成しそこに動かしたい秒数を渡すことでその秒数×モーター係数(文頭で宣言した#defineの値)の秒間回るようにした。モーター係数は車体の特性(ギア比など)やバッテリーの残量、モーターによって変えるようにした。 ***サブルーチンについて [#k4b9038d] ****あ [#s4f06d43] -naname 1, 2 木の斜めの線を引くためだけのサブルーチン。木を書くのを3回繰り返すため見やすくなるかと思い用意した。 -Xplus Xminus Yplus Yminus Zplus Zminus それぞれX,Y,Z軸をプラスマイナスで動かすためのサブルーチン。 与えられた値の秒数だけ移動する。 -tree 木を書くためのサブルーチンnanameと同じ理由で用意した。 -サブルーチンについての考察defineでは長くなりすぎて見づらくなるので使ったがプログラムがかなり重くなってしまった。X,Y,Zについても-の値を渡したりXは1000、Yは2000、Zは3000の値を足したものを渡しif分で分けて書けば1つにまとめられたと考えられる *全体を通して [#fd8763b4] -ギア比を考えずに作ってしまったがためにきれいにかけなかった。その時その時でうまく行ったり行かなかったりしてしまい動作が安定しなかった。 -どうしても駆動域が小さく動きづらくなってしまった。駆動域が小さいために文字も小さくなってしまい文字が判別しづらくなってしまった。 -引っかかったりとトラブルも多く大変だった。 -いわれてみれば見えないこともない程度までしか書けなかった。ギアやギア比の大切さが分かった。 -プログラムは編集しやすさを重視して書いたがRISには少し高負荷だったらしく書き込みに時間がかかるプログラムになってしまった。 -サブルーチンの説明はプログラム説明にあります。複雑な動作はしていないので細かい動作説明は省きました。