2018b/Member 目次
プリンタ型ロボット。装置の幅がA4の短い方の長さと合致していて、そこに紙を入れタイヤを動かすことにより紙を動かしながら文字を描くことができる。
ベルトコンベアのモーターの写真。
文字の縦線を成すタイヤのモーターの写真。モータをタイヤの中点に置くことでタイヤにかかる重さを増やす。
最小のギアと螺旋を描いたギアを組み合わせてなるべく小さく作った。他についているパーツはペンがずれないようにするもの。
一週間しか課題に取り組む時間が無かったことから自動車にペンを取り付けたロボットはプログラミングが間に合わないと思いxy座標が簡単に分かるロボットを作ろうと思った。
まず最初に思い付いたのは写真のような装置である。A4の紙の中心に設置し軸の回転を字の横方向に、ペンの進退を字の縦方向にして丸みを帯びた字を描くように作った。しかし完成したこの装置にLANケーブルを繋いでみたところLANケーブルが思っていたよりも固く、装置に思ってもいない力が働いてしまったため断念した。
一つ目の装置で分かったことは一番長いLANケーブルは一つしか無いためモーター自体が移動する場合、移動するモーターは1つだけの方がいいということである。EV3を装置に乗せることができるのならば今言ったことはあまり考えなくてもいいことだが、EV3は他のパーツに比べて大分重たいため重心を取りづらいというデメリットがあった。これらを考慮した結果、動かすのは装置ではなく紙にすればいいのではないかと思い、プリンタを真似したものを作った。
プリンタ型を製作するにあたって紙自体を動かすためには紙を動かすタイヤにある程度の重さが乗っかっていないといけない。写真は試作機のものだがこの位置にタイヤのモータを取り付けるとモーターの重さが右の方の支えに乗っかていて、尚且つ左のタイヤに若干上方向の力が掛かってしまい紙を動かしたときに紙が傾いてしまった。
→タイヤを動かすモーターをタイヤの間の中点に設置することでかかる重さを均等に増やした。
ペンの傾きが悪いと写真のようなところどころ詰まったような線になってしまう。
→ペンの尻を線がよく進む縦線の下方向に傾けることで滑らかになった。
ベルトコンベアが長いため強く張らないと中心部が弛んでしまう。しかしフレームの強度の問題で強くは張れなかった
→ベルトコンベアの中心部にさらにギアを足した。+字の棒を利用してギアの高さを変えることのできるようにしている。
この型の装置はモータの角度を変数tとしてtの値をいじることでtの値を入力したとき縦と横のながさを揃えることができる。よってあらかじめ方眼紙に文字を書いておいて方眼紙のマス目の一片の長さをtとして考えればプログラムが簡単になる。 実際の画像だがよく見たら「横」を誤字している。
lift = MediumMotor('outA'):ペンの上げ下げ belt = LargeMotor('outB'):字の横方向を成す部分 tire = LargeMotor('outC'):字の縦方向を成す部分
def motor_init(): for m in [lift,belt,tire]: m.reset() m.speed_sp=100 m.stop_action='hold':for関数を使ってモーターの情報を入力
def liftup(): lift.run_to_rel_pos(position_sp=-110):ペンを上げる動作 sleep(2)
def liftdown(): lift.run_to_rel_pos(position_sp=110):ペンを下げる動作 sleep(2)
def beltmove(t): belt.run_to_rel_pos(position_sp=t):ベルトコンベアの動作。tの値によって長さが変化
def tiremove(t): tire.run_to_rel_pos(position_sp=-t*0.8):タイヤの動作。
モーターのスピードが100なのはタイヤの動きが速いと2つのタイヤを繋げる棒にねじれが生じるから。
tiremoveの変数に「-」が掛かっているのは装置の開いている部分から見て下方向の動きをプラスとして考えたいから。
tiremoveの変数に「0.8」が掛かっているのは横と縦の角度tでの線の長さを揃えたいから。
よって右方向か下方向に行く場合、tの値を正にする。
右に2マス上に3マス進む場合、beltmove(t*2),tiremove(-t*3)とすればよい。
書き順は以下の通り
def kihen(t): beltmove(t) sleep(2) liftdown() beltmove(t*3) sleep(3) liftup() beltmove(-t) sleep(2) tiremove(-t*3) sleep(3) liftdown() tiremove(t*11) sleep(4) liftup() tiremove(-t*8) sleep(4) liftdown() beltmove(-t*2) tiremove(t*2) sleep(2) liftup() beltmove(t*4) sleep(3) liftdown() beltmove(-t*2) tiremove(-t*2) sleep(2) liftup() tiremove(-t*2) sleep(2)
3画目までは書き順通りに進め、4画目は省略のために右下から左上に進めた。
def ki_ue(t): beltmove(t*3) sleep(2) liftdown() beltmove(t*6) sleep(3) liftup() beltmove(-t*7) sleep(4) tiremove(t*2) sleep(2) liftdown() beltmove(t*8) sleep(4) liftup() beltmove(-t*5) sleep(3) liftdown() tiremove(-t*3) sleep(2) liftup() beltmove(t*2) sleep(2) liftdown() tiremove(t*3) sleep(2) liftup() beltmove(-t*3) sleep(2)
def ki_naka(t): tiremove(t) sleep(2) liftdown() beltmove(t*4) sleep(3) liftup() tiremove(t*2) sleep(2) liftdown() beltmove(-t*4) sleep(3) liftup() tiremove(t*2) sleep(2) liftdown() beltmove(t*4) sleep(3) tiremove(-t*4) sleep(3) liftup() beltmove(-t*2) sleep(2) liftdown() tiremove(t*4) sleep(3) liftup() beltmove(-t*2) sleep(2) liftdown() tiremove(-t*4) sleep(3) liftup() beltmove(-t) sleep(2)
def ki_shita(t): tiremove(t*7) sleep(4) liftdown() beltmove(t*2) tiremove(-t*2) sleep(2) liftup() beltmove(t*2) sleep(2) liftdown() beltmove(t*2) tiremove(t*2) sleep(2) liftup()
「黄」の1〜4画、5〜9画、10〜11画をそれぞれue,naka,shitaと定義した。
5〜9画目は「由」という字のはずが間違えて「田」になっている。これはプログラミングのミスではなく自分のミス。
def yama(t): beltmove(-t*5) sleep(3) tiremove(t*3) sleep(2) liftdown() tiremove(t*8) sleep(4) liftup() beltmove(-t*4) sleep(3) tiremove(-t*5) sleep(3) liftdown() tiremove(t*5) sleep(3) beltmove(t*8) sleep(4) tiremove(-t*5) sleep(3) liftup()
「山」の部分。2画目と3画目を繋げて書いた。
def move(): motor_init() kihen(20) ki_ue(20) ki_naka(20) ki_shita(20) yama(20)
動きをまとめる所。変数の数字を変えることで字の大きさを変えることができる。しかし小さすぎるとベルトの遊びによってうまく書けない。
本番の字。やはりベルトコンベアの高さが一定ではないので左側が薄いか。
今回反省すべき点はプログラムとベルトコンベアである。せっかくXY座標で簡単に文字を作れる機械を作ったので書き順道理に書けばよかったと思っている。またベルトコンベアの方はもう少し長さを短くして弛みを抑えるべきだと思った。
もう少し頑張ればsleepの時間を駆使してはらいを表現したりできたかもしれない