目次

課題

課題説明ページ:2017b/Mission1

今回の課題は、"これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上のものを選び、それをA4の紙を書くロボットを製作せよ。"とのことである。
生まれ育った観光地「斑尾*1」を描きたいところだが、さすがに難易度が高い。比較的簡単そうな、長野県側の市名である「飯山*2」を描くことにする。

「EV3 Printer」設計について

使用機:LEGO MINDSTORMS EV3

設計思想

デフォルトの車輌にペンと昇降機を付けるだけでは、コーディングが複雑になる。そのため、縦軸と横軸にそれぞれ独立して動き、筆を昇降させることができるロボットが必要とされた。
印字するための機械と言えば何を思い浮かべるだろうか?代表的なのはもちろんプリンターであろう。
我々は、プリンターの概形をモチーフに設計を行った。
また各部の改良等や持ち運びしやすくするため、役割ごとモジュール化した形を目指した。

迷走した試作機

試作機

これが苦しみ悶えながら、なんとか生み出した試作機1号である。
ラージモーター1つで左右に振り分けられたタイヤを回し、間を通る紙を動かしてY軸を調整する。
ミディアムモーターでX軸を制御し、ここにペンを装着。
残りのラージモーター1つでX軸の制御機構全体を持ち上げ、ペンの上げ下げを行った。
かっこいい見た目に仕上がったが、色々と問題を抱えている。

各モジュールの詳細については後述。

問題点

  • 何かしらのパーツに引っかかって紙の進行が妨げられることがある。
  • 紙の進行方向がずれることがある。タイヤの下の接地面に使用しているパーツが原因?
  • X軸制御機構を上下させるモーターの負担が大きい。昇降モーターをholdしておかなければX軸モーターの水平を維持できず、起動時以外は支えるパーツを別途つける必要があった。精度にも難があり、筆圧が変わりやすく正確な文字が書けなかった。

完成機

完成機

こちらが改良を重ね、試作機の問題点をすべて克服した完成品である。

試作機に比べシンプルな見た目になった。やはりかっこいい。

Y軸制御機構

Y機構

ラージモーターを1つ用い、軸1つにタイヤ2つを振り分けて紙の推進力を担っている。

まず、タイヤが下で接する部品を変更した。黒パネルの湾曲が紙の進行を歪ませていると考え、角型ビームを並べて平面を作った。
配線を考え、モーターの位置は反対側に移動。するとX軸制御モジュールが邪魔になりケーブルが挿せなくなったため、X軸モジュールが改良ついでにまた反対側に移動することになる。
紙を正面から真っすぐ入れると他のパーツの角で詰まることが多々あったため、小タイヤと大タイヤで挟み上側から紙を挟み込む機構に変更。
両端でタイヤの軸を支えているビームはあえて固定せず、可動式にした。これによりタイヤを上げられて紙をセットし易くなった。
他、無駄をなるべく削ぎ落して紙の進行をスムーズにできるようにビームの配置を変更した。

これらの工夫により紙は安定して進行し、Y軸の誤差も少なくなった。

色彩センサー

写真左側で下を向いているのは色彩センサーである。直下には黄色のビームを配置し、ペンの位置に紙が入っているかどうか確認することができる。
試行錯誤段階の誤作動でペン直下のビームが汚れてしまったため、このセンサーを追加することにした。
これで紙の位置も把握することができ、どの位置から紙をセットしても狙った位置にペンを降ろすことが可能。

X軸制御機構

x機構

可動域は約8センチ。

ギアと小タイヤでペンを取り付けたビームを挟み、そのビームを動かすことでX軸の移動を行う。
動力は小タイヤに繋がるミディアムモーター。
この機構は当初から安定して動いてくれた。

昇降機構

x機構

ここがおそらく最も苦労した点である。
当初はラージモーター1つにビームで接続してX軸制御機構全体を支え、ペンの上げ下げを行っていた。
前述の通り問題を多く抱えていたため、思い切って新設計を決断。

昇降させるのではなく、X軸制御機構に回転運動を伝えてペンの上げ下げを行う機構に変更した。
これにより安定してペンの上げ下げが可能となった。
ただし最初にペンをぶら下げる位置には非常に繊細な調整が必要である。この調整を間違うと筆圧が強くなりすぎて、X軸制御機構が歪んでいってしまう。

プログラム

オリジナルEV3ドロー用ソフトウェア「Printhon」

プリンターとしての機能を果たすための、大部分を関数にしている。

後の座標記述段階を極力楽にするため、随所までこだわった堅実な設計となっている。

試作段階の他のバージョンも存在。相方のページに載っているのでそちらを参照。 2017b/Member/Koyo/Mission1

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
print("Printhon ver 0.4\n"
      "Please connect\n"
      "\tmy\tto\toutA\n"
      "\tarm\tto\toutC\n"
      "\tmx\tto\toutD\n"
      "\tcs\tto\tin1")
input("Please press the enter key after connecting.")
my = LargeMotor('outA') 
arm = LargeMotor('outC')
mx = MediumMotor('outD')
cs = ColorSensor('in1')
# constants
mxcm = 38.095238 #x軸移動距離をcmに変換するための定数
mycm = 20.050125313 #Y軸移動距離をcmに変換するための定数
n = 56.25 #sleep時間用定数
vxy_ratio = 5/3  # x:y=5:3 XとYを同時に等距離動く際の速度比
#   *position_sp
mxcm_print = mxcm
mycm_print = mycm*-1
mycm_paper = mycm
#   *distance(cm)/speed
#距離にこれを掛け、速さで割ることで丁度よいsleepに与える引数になる
sleep_x = n 
sleep_y = vxy_ratio*n #
# speed
#   common
my_speed = 100
arm_speed = 30
#   x only
mx_speed = 500
# paper
paper_set_d = 4 #用紙をセットする際のセンサーからの移動距離
paper_out_d = 4 #用紙を排出する際のセンサーからの移動距離
def pu(): #ペン上げ
    arm.run_to_abs_pos(position_sp=-40)
    sleep(1)
def pd(): #ペン下げ
    if cs.color != 6:  # nonwhite
        input("The paper could not be detected. Press Enter to continue.")
    arm.run_to_abs_pos(position_sp=0)
    sleep(2)
def x(x): #X軸移動、移動相対座標を引数に入れる
    mx.run_to_rel_pos(position_sp=x*mxcm_print, speed_sp=mx_speed)
    sleep(abs(x)*sleep_x/mx_speed)
def y(y): #Y軸移動、移動相対座標を引数に入れる
    my.run_to_rel_pos(position_sp=y*mycm_print)
    sleep(abs(y)*sleep_y/my_speed)
def xy(x, y): #斜め移動用、X軸とY軸の移動相対座標を引数に入れる
    if y == 0:
        x(x)
    else:
        a = (vxy_ratio)*(x/y)
        mx.run_to_rel_pos(position_sp=x*mxcm_print, speed_sp=abs(my_speed*a))
        my.run_to_rel_pos(position_sp=y*mycm_print)
        sleep(abs(y)*sleep_y/my_speed)
def paper_set(): #紙をセットする
    pu()
    input("I move the paper, is it OK?\n"
          "\tPress Enter to continue.")
    if cs.color == 4:  # yellow
        my.run_forever(speed_sp=my_speed)
        color = 6  # white
    else:
        my.run_forever(speed_sp=-my_speed)
        color = 4  # yellow
    while 1:
        if cs.color == color:
            my.stop()
            my.run_to_rel_pos(position_sp=paper_set_d*mycm_paper,
                              speed_sp=my_speed,
                              stop_action='hold')
            sleep(paper_set_d*sleep_y/my_speed)
            print("Paper loaded.")
            break
def paper_out(): #紙を排出する
    pu()
    if cs.color == 6:  # white
        my.run_forever(speed_sp=-my_speed)
    while 1:
        if cs.color == 4: # yellow
            my.stop()
            my.run_to_rel_pos(position_sp=-paper_out_d*mycm_paper)
            sleep(paper_out_d*sleep_y/my_speed)
            break
def mx_init(): #X軸機構の起動時セット用
    mx.reset()
    mx.run_to_rel_pos(speed_sp=mx_speed,
                      position_sp=-8.8*mxcm_print,
                      stop_action='brake')
    sleep(8.8*sleep_x/mx_speed)
    mx.reset()
    mx.run_to_abs_pos(speed_sp=mx_speed, stop_action='hold', position_sp=0)
    mx.run_to_rel_pos(speed_sp=mx_speed, stop_action='hold', position_sp=0)
def my_init(): #Y軸機構の起動時セット用
    my.reset()
    my.run_to_abs_pos(speed_sp=my_speed, stop_action='hold', position_sp=0)
    my.run_to_rel_pos(speed_sp=my_speed, stop_action='hold', position_sp=0)
def arm_init(): #昇降機構の起動時セット用
    arm.reset()
    input("Please press the enter key after setting the arm")
    arm.reset()
    arm.run_to_abs_pos(speed_sp=arm_speed, stop_action='hold')
def init_all(): #全モーターをリセット
    arm_init()
    paper_set()
    mx_init()
    my_init()
    print("Initialization of all motors has been completed.")

文字を4文字書くためだけなら正直無駄な努力のような

課題プログラム

この飯山プログラムはPrinthon 0.4をインポートして動作する。

ここで記述しているのは、”飯山”をプリントするための相対座標のみである。

#!/usr/bin/env python3
from printhon_ver0_4 import *
init_all()
print("I`ll print \"iiyama\"")
#ii
x(3)
pd() # 1
xy(-1,-1)
pu()
xy(1,1)
pd() # 2
xy(0.8,-0.8)
pu()
xy(-0.8,-0.2)
pd() # 3
xy(0.3,-0.3)
pu()
x(-0.8)
y(0.2)
pd() # 4
x(1)
y(-1)
pu()
xy(-1,0.7)
pd() # 5
x(1)
pu()
xy(-1,-0.5)
pd() # 6
x(1)
pu()
xy(-1,1)
pd()# 7
y(-2.5)
xy(0.6,0.6)
pu()
y(0.5)
pd() # 8
xy(1,-1)
pu()
# ii migi
xy(0.5,3)
pd() # 9
x(1.5)
pu()
x(-1.5)
pd() # 10
xy(-0.5,-3)
pu()
x(0.5)
y(2)
pd() # 11
x(1.5)
xy(-1.5,-2)
pu()
y(2)
pd() # 12
xy(1.5,-2.2)
pu()
xy(-2,-1)
#yama
pd() #1
y(-3)
pu()
xy(-1.5,1.5)
pd() #2
y(-1.5)
x(3)
pu()
y(1.5)
pd() #3
y(-1.5)
paper_out()

プリント結果

達筆飯山

動作時の映像:https://youtu.be/GwFpGWd1D14

おいしそうな飯だ。


来客数カウンター 949


意見や感想などあればどうぞ。



*1 長野県北部と新潟県に跨る山。山麓はリゾート地になっており、良質で豊富な雪を利用したスキー場ではワールドカップも開催された。
*2 長野県北部にある市。田舎に似合わず新幹線まで通っている。

添付ファイル: filecomp_machine_ver2.jpg 150件 [詳細] filey_module.jpg 131件 [詳細] filex_module.jpg 80件 [詳細] fileproto.jpg 71件 [詳細] filex_control.jpg 121件 [詳細] filereS__24272898.jpg 65件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-01-02 (火) 21:25:59 (600d)