これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ。
プログラムの作りやすさを考え、ペンが縦横に垂直に動くロボットを作成した。縦移動には台車の移動を横移動には無限軌道を用いることにした。加えて、ペンを上げ下げするモーターを取り付け合計三つのモーターを使った。
10画以上の地名として私の通っていた小学校の文字を借りて「伏見」と書くことにした。
#!/usr/bin/env python3 from ev3dev.ev3 import * # EV3を扱うモジュールをインポート from time import sleep # timeモジュールからsleep関数をインポート #brmA = LargeMotor('outA') # 装置AのモーターをmAとおく mB = LargeMotor('outB') # 装置BのモーターをmBとおく mC = MediumMotor('outC') # ペン昇降機のモーターをmCとおく
def motor_init(): #モーターの初期化 mR.reset() mW.reset() mL.reset() global cir #cirをグローバル変数として宣言 cir='on' #cirに'on'を代入
def run(degree=120,speed=50): #縦移動の関数の作成 #デフォルト値としてdegreeに120,speedに50を代入 mR.run_to_abs_pos(position_sp=degree,speed_sp=speed,stop_action='hold')
def width(degree=0,speed=100):#横移動の関数の作成 #デフォルト値としてdegreeに0,speedに100を代入 if 0<=degree<=180: #degreeに入れる事が出来る値を0から180までにする mW.run_to_abs_pos(position_sp=degree,speed_sp=speed,stop_action='hold') sleep(2)
def lift_up(): #ペンを持ち上げる関数の作成 #cirが'on'の時だけ動く global cir if cir=='on': mL.run_to_abs_pos(position_sp=-30,speed_sp=100,stop_action='brake') sleep(1.5) cir='off'
def lift_down(): #ペンを置く関数の作成 #cirが'off'の時だけ動く global cir if cir=='off': mL.run_to_abs_pos(position_sp=0,speed_sp=100,stop_action='brake') sleep(1.5) cir='on'
def slash(degree_run,degree_width,speed_run,speed_width=100): #斜め移動の関数を作成 #デフォルト値としてspeed_widthに100を代入 mR.run_to_abs_pos(position_sp=degree_run,speed_sp=speed_run,stop_action='hold') mW.run_to_abs_pos(position_sp=degree_width,speed_sp=speed_width,stop_action='hold') sleep(2) #妥協した
無限軌道の端から端までがちょうどモーターの回転180度分だったので設計がしやすかった。無限軌道の0度から180度までの幅が5cm強だった。土台部分の約5cmの移動はタイヤの何回転分かはかったところ、大体120度ほど回転させたところで5cmくらいになったので、その数値に合うように縦横の座標の値を設定した。 右上を原点とした
#一回目の初期設定
#一回目の初期設定
motor_init() lift_up() #一文字目(伏) #一画目 width(90) lift_down() slash(60,180,200/3) lift_up() #二画目 width(135) run(30) sleep(1.5) lift_down() run(120) sleep(2) lift_up() #三画目 run(30) sleep(2) width(90) lift_down() width(0) lift_up() #四画目 run(0) width(45) lift_down() run(30) sleep(2) slash(120,90,150,75) lift_up() #五画目 run(30) sleep(2) width(45) lift_down() slash(120,0,150,75) lift_up() #六画目 run(0) sleep(2) width(30) lift_down() slash(20,0,100/3,50) lift_up()
続いて見の部分。二文字目の右上に座標の原点を再設定する。
#二回目の初期設定 run(140) sleep(3) lift_down() motor_init() sleep(1) lift_up() #二文字目(見) #一画目 width(135) lift_down() run(80) sleep(2) lift_up() #二画目 run(0) sleep(2) lift_down() width(45) run(80) sleep(2) lift_up() #三画目 width(135) run(80/3) sleep(1.5) lift_down() width(45) lift_up() #四画目 width(135) run(160/3) sleep(1) lift_down() width(45) lift_up() #五画目 width(135) run(80) sleep(1) lift_down() width(45) lift_up() #六画目 width(105) lift_down() slash(120,165,200/3) lift_up() #七画目 width(75) run(80) sleep(1.5) lift_down() run(120) sleep(2) width(0) run(90) sleep(1) lift_up() #モーターの初期化 motor_init()
最後の初期化はモーターがholdの状態になったままだと嫌なので付け加えた
機械本体が紙の上を二次元に移動するロボットはプログラムがべらぼうに大変だと思ったので、縦横に垂直に動くロボットを作成した。 横移動にはいくつか案があったが、アームを直接無限軌道の上にのっける事で実現させた。 一からロボットを作ったので機械本体の作成には時間がかかったが、プログラム自体はすんなりかけ、また文字も結構はっきりしたモノを完成させる事が出来た。