今回の課題は書道ロボット。
これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作する。ただし、以下の注意点に気を付ける。
・ひとりにつき一つ以上のプログラムを作成すること。
・ペン以外はキットに含まれる部品を使うこと。
・キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。
・ 改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。
今回の課題で僕は「若松」という漢字を選んだ
今回作ったロボットは簡単な自走機能とペンを上げ下げするだけのシンプルな形にした.
ペンが動かないように輪ゴムとパーツで固定できるようにした
今回はpythonを用いてプログラムを作った
#!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep
mL = LargeMotor('outA') mR = LargeMotor('outB') mm = MediumMotor('outC')
関数を定義して
def move_f(t): mL.run_timed(time_sp=t,speed_sp=100,stop_action='coast') mR.run_timed(time_sp=t,speed_sp=100,stop_action='coast') sleep(2) def move_b(t): mL.run_timed(time_sp=t,speed_sp=-100,stop_action='coast') mR.run_timed(time_sp=t,speed_sp=-100,stop_action='coast') sleep(2) def pu(): mm.run_to_rel_pos(position_sp=-45,speed_sp=25,stop_action='coast') sleep(2)
def pd(): mm.run_to_rel_pos(position_sp=-45,speed_sp=25,stop_action='coast') sleep(2)
def turn_l(x): mR.run_to_rel_pos(position_sp=2*x,duty_cycle_sp=50) mL.run_to_rel_pos(position_sp=-2*x,duty_cycle_sp=50)
def turn_r(x): mR.run_to_rel_pos(position_sp=-2*x,duty_cycle_sp=50) mL.run_to_rel_pos(position_sp=2*x,duty_cycle_sp=50)
def sp(): sleep()
(なぜか関数と関数の間にsleepを挟まないとうまく動作しなかったのでsleep用の関数を作成した)
以上を作る際の関数とし以下に文字自体のプログラムを作る
まず文字の各パーツごとのプログラムを作る
草冠
def kusakanmuri() pd() sp() move_f(3000) //草冠1画目 sp() pu() sp() move_b(300) sp() turn_l(88) sp() move_b(1500) sp() pd() sp() move_b(1000) //草冠2画目 sp() pu() sp() turn_r(88) sp() move_f(1500) sp() turn_l(88) sp() pd() sp() move_f(1000) //草冠3画目 sp() pu() sp()
右
def_migi() pd() sp() move_f(2000) //右1画目 sp() pu() sp() move_f(1000) sp() turn_l(45) sp() move_b(1500) sp() pd() sp() move_b(2000) //右2画目 sp() pu() sp() move_f(3000) sp() turn_r(45) sp() move_b(2100) pd() sp() move_f(1000) //右3画目 sp() pu() sp() move_f(2100) sp() turn_l(85) sp() move_b(2100) sp() pd() sp() move_b(700) //右4画目 sp() pu() sp() turn_l(85) sp() move_f(1000) sp() turn_r(85) sp() pd() sp() move_f(700) //右5画目 sp() pu() sp() move_f(1500) sp() turn_r(85) sp() move_b(1050) sp() pd() sp() move_b(1000) //右6画目 sp() pu()
草冠と右の間の移動
def waka_ido(): move_f(800) sp() turn_r(85) sp() move_b(4000)
以上のプログラムを組み合わせた「若」を書くプログラム
def waka(): kusakanmuri() waka_ido() migi()
木偏
kihen(): pd() sp() move_f(1000) //木偏1画目 sp() pu() sp() move_b(1500 sp() turn_l(85) sp() move_b(1500) sp() pd() sp() move_b(2000) //木偏2画目 sp() pu() sp() move_f(2000) sp() move_f(1500) sp() turn_r(30) sp() move_b(2100) sp() pd() sp() move_b(1000) //木偏3画目 sp() pu() sp() move_f(3000) sp() move_f(200) sp() turn_l(60) sp() move_b(2100) sp() pd() sp() move_b(1000) //木偏4画目 sp() pu()
公
def kou(): pd() sp() move_f(1000) //公1画目 sp() pu() sp() move_f(2500) sp() turn_l(60) sp() move_b(2500) sp() pd() sp() move_b(1000) //公2画目 sp() pu() sp() move_f(3000) sp() turn_l(140) sp() move_b(1500) sp() pd() sp() move_f(750) //公3画目 sp() pu() sp() move_f(2100) sp() turn_r(50) sp() move_b(2100) sp() pd() sp() move_b(800) //公4画目 sp() pu() sp() move_f(2100) sp() turn_r(45) sp() move_b(1800) sp() pd() sp() move_b(500) //公5画目 sp() pu()
木偏と公の間の移動
def matu_ido(): move_b(500) sp() turn_l(85) sp() move_b(800) sp() turn_l(65) sp() move_b(2000)
以上のプログラムを組み合わせた「松」を書くプログラム
def matu(): kihen() matu_ido() kou()
若と松の間の移動
def wakamatu_ido() move_b(500) sp() turn_l(85) sp() move_b(800) sp() turn_r(85)
若松を書くプログラム
if __name__=='__main__': waka() wakamatu_ido() matu()
実際にやってみないとわからないことが多くかなり苦労し複雑なプログラムを組むこととなった sleep関数のようなところはもっと工夫すれば省略することができたと思う 今回は関数を多く分けてパーツごとに文字を書いていったのが上手くいき細かく調整をしながらプログラムを組んでいくことができた.調整をするときは必ずプログラムを書き換えながら,プログラムを動かさないといけないので,チャートなどを組んでプログラムと照らし合わせながら動かすとよいと思った。 完成した感想としては思ったよりも文字として読めるようにかけたので満足はしているが,あまり外的な要因で変化しないようにロボットを組み立てたり、そのためのプログラムを組めるようにしたい