目次
私たちの制作したロボットは、最初に制作した型のロボットに、ペンを上げ下げするためのパーツとミディアムモーターを取り付けた形となっています。ペンの上げ下げには歯車を使用しました。ロボットの構造の中でも、ペンが文字を書いている途中でずれないよう固定する方法には特にこだわりました。レゴのパーツにペンを固定できるのは、ペンの太さが一定でないので輪ゴムを使いました。しかし、輪ゴムのみでは完全に固定することが出来なかったので回転できるパーツを取り付け、前後左右からペンを押し、上下のみ動くようにしました。このパーツにより太さの違う他のペンでも取り付けることが出来ます。EV3の充電差込口正面にパーツがありますが、解体することなく充電することが出来ます。
縦:26.5cm 横:14.5cm 高さ:18.5cm
この黒いマッキーの上部を支えている穴の二つ空いた黒いパーツは正面から見て前後にスライドさせることが可能で、ペンの太さに合わせ、ペンの軌道を制御することが出来る。 この部品を取り付けることにより、ペンの前後の衝撃に強くなり、描いている途中のずれを大幅に軽減することに成功した。 さらに、このパーツを本体と接続している灰色の棒の両端に赤い部品を取りつけたパーツにも機能があります。 ペンを支えている、ロボットを正面から見たときに最も正面にある機構はロボット本体とは離れており、強度に問題があります。それを補っているのがこのパーツです。 赤い部品は二段階で奥行きを調整することが出来るので部品と部品の距離が一定でなくても接続でき、衝撃を吸収することが出来ます。 その観点から赤いパーツを採用しました。ペンの上部を支えている部品はペンを支える役割だけでなく、ロボット本体の強度も上げる役割も同時に担う、私のこだわったポイントの1つです。 赤いパーツを採用した理由はこれだけではありません。その理由はペンの下部を支えている灰色の棒のついたパーツにあります。 このパーツは上記のパーツのように前後に動かしてもあまり効果はありません。 このパーツはペンを正面から見て左右方向からの衝撃に耐えるために取り付けました。 ここで、先ほど採用した赤いパーツの特徴が生きてきます。この赤いパーツは灰色の棒のような十字型の接続部分を持ち、二段階で奥行きを調節できます。 しかしそれだけではなく、この部品は円形の穴にも接続することが可能で、これにより黒色の棒に接続されているパーツを回転させることが可能になります。 この回転によってより細かな設定をすることができ、ペンの形状に合わせた最適な補強が可能になります。 そしてまたこのパーツもロボット正面の最も正面にある機構を支える役割を果たしていて、ここもこだわったポイントです。 そして上記の二つのパーツの間のEV3側に取り付けられている、穴が逆T字に空いている灰色の部品、この部品はこのロボットの強度面で最も重要な役割を持っています。この部品がないとその後ろの平行に並んだ二本の灰色の穴の開いた棒状の部品が傾いてしまうのです。結果それに接続されているペンも傾いてしまい文字が書けなってしまう程です。 この部品はこの難題を一個の部品だけで解決できる唯一の部品でした。
この写真を見てわかるように、私たちはペンを地面に垂直方向に稼働させ、ペンの上げ下げを行うようにしています。 この正面に映っている部品でこだわっている点は2つあります。 1つ目は長方形の灰色の部品です。この部品は唯一、ほかの部品を使うことなく、常に並行を保つことが可能で、3マスの一定の間隔をあけることができます。これによりペンの軌道を補正する二つのレールを完全に固定することができ、ロボットの安定に繋がります。 2つ目は上記の部品の内部に位置している、灰色の凸型の部品です。この部品は唯一ペンと直接ゴムでつながっており、とても重要な役割を果たしています。 ペンに直接繋げる部品には条件がありました。1つは横幅が3マス以下であること、2つ目は丸い穴が2つ以上空いていること、3つ目は左右対称であること、最後にゴムを固定できるような形状であること、これらを満たしていないとペンの接続に支障をきたし、正常に稼働しません。 これらを満たす唯一の部品がこの写真に映っている部品です。 この部品の凸の先端の両側に出っ張りがあり、ゴムを固定するのに最適でした。 このようにレゴのパーツの特性を瞬時に見抜き、最大限に活用してハードの面からプログラムを支えることも重要だと考えます。
書く漢字は『香川』です。
#!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep ml = LargeMotor('outA') mr = LargeMotor('outB') mm = MediumMotor('outD')
def re(): ml.reset() mr.reset()
def s(t): sleep(t)#動作が完了するまでにかかる時間がそれぞれ違うので、ここで数値を定義せず、時間を代入できるようにした def arg(kakudo): ml.run_to_rel_pos(position_sp=-kakudo, speed_sp=100, stop_action='hold') mr.run_to_rel_pos(position_sp=kakudo, speed_sp=100, stop_action='hold')#その場で機体の向きを変えるためのルールを作成 def go(left,right): ml.run_to_rel_pos(position_sp=left, speed_sp=100, stop_action='hold') mr.run_to_rel_pos(position_sp=right, speed_sp=100, stop_action='hold')#直進する命令を作成 def pd(): mm.run_to_rel_pos(position_sp=-30, speed_sp=400, stop_action='hold')#ミディアムモーターでペンを下げる命令を作成 def pu(): mm.run_to_rel_pos(position_sp=30, speed_sp=400, stop_action='hold')#ペンを上げる命令を作成
この漢字の中で最も難しいのは回転を多く利用する『日』なので、ズレの少ない最初に書くことにした。
if __name__ == '__main__': re() pd() s(3) re() go(120,120)#香川の『日』の左の縦棒 s(3) pu() s(3) re() arg(195) s(4) re() go(-70,-70) s(3) re() arg(-195) s(4) re() go(-120,-120) s(3) pd() s(3) re() go(120,120)#香川の『日』の右の縦棒 s(3) pu() s(3) re() go(-370,-370) s(5) re() arg(195) s(5) re() go(220,220) s(5) pd() s(2) re() go(80,80)#香川の『日』の上の横棒 s(3) pu() s(2) re() arg(-195) s(5) re() go(-60,-60) s(3) re() arg(195) s(5) re() go(-80,-80) s(3) re() pd() s(2) go(80,80)#香川の『日』の真ん中の横棒 s(3) re() pu() s(2) re() arg(-195) s(5) re() go(-60,-60) s(3) arg(195) s(5) re() go(-80,-80) s(3) pd() s(2) re() go(80,80)#香川の『日』の下の横棒 s(3) pu() s(2)#ここまでが香川の『日』を書く命令
書き終わりを中心線にすることで次の『川』を書き始めやすいようにしている。
go(60,60) s(2) re() arg(195) s(5) re() go(-60,-60) s(3) re() arg(-195) s(5) re() arg(195/4) s(3) go(-200,-200) s(5) pd() s(2) re() go(120,120)#香川の日の上の『ノ木』の『ノ』 s(4) pu() s(2) re() go(-120,-120) s(4) arg(-195/4) s(3) pd() s(2) re() go(200,200)#香川の日の上の『ノ木』の木の横棒 s(5) pu() s(2) re() go(-380,-380) s(8) re() arg(-195/2) s(3) go(200,200) s(4) pd() s(2) go(100,100)#香川の日の上の『ノ木』の木の右下の斜め払い s(3) pu() s(2) go(-210,-210) s(4) arg(-230) s(5) go(250,250) s(4) pd() s(2) go(100,100)#香川の日の上の『ノ木』の木の左下の斜め払い s(3) pu() s(2) go(-350,-350) s(4) arg(130) s(3) go(210,210) s(5) pd() s(2) go(130,130)#香川の日の上の『ノ木』の木の縦棒 s(4) pu() s(2)#香川の『香』の完成
上記のプログラムの終わりからスムーズに次の書き初めに移れるよう書き順を変更している
re() go(-400,-400) s(6) re() pd() s(2) go(50,50)#『川』の2画目 s(2) re() pu() s(2) arg(195) s(5) re() go(-30,-30) s(2) re() arg(-195) s(5) go(-60,-60) s(2) pd() s(2) re() go(60,60)#『川』の3画目 s(2) pu() s(2) re() arg(-195) s(5) re() go(-60,-60) s(2) re() arg(195) s(5) go(-65,-65) s(2) pd() s(2) re() go(65,65)#『川』の1画目 s(2) pu() s(2)#『川』の完成
キャタピラを使わず、EV3本体を動かして文字を書くのはとても難易度が高い。 同じ数値を代入しても同じ動きをするとは限らず、本体を90度回転させるモーター回転数を何度も実験し、最も正確に回転できる『回数が多かった』数値を今回のプログラムに代入している。 勿論、電池の残量、床の材質、モーター本体の調子も大きく影響してくるので、10回書いて同じものが一つとして生まれなかった。 出来るだけ床の材質に左右されないよう、全ての動作の速度を落としている。
この型のロボットは『曲線』を書くことが出来る。今回は漢字だったのでキャタピラを使ったロボットが有利だったが、絵やひらがなを描く場合はこの型が向いている。 そして小型で強度もあり、持ち運びが楽である。
上記のプログラム以外にも、ペンの筆圧を調整するため、実行し適当な数値を入力することでペンの位置を調整できるプログラムも作成した。
#!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep mm = MediumMotor('outD') mm.reset() a = input("motiagerukakudo(30)to(-30)") mm.run_to_rel_pos(position_sp=a, speed_sp=100, stop_action='hold')