目次

課題

2017b/Mission1

製作したロボットについて

紙とペンを動かし,文字を書くというプリンターに似た構造になっている

完成機

arm:Z軸制御機構

X軸制御機構(mx)を上げ下げするための機構である

Z機構

開発当初の問題点

  • 安定して上げ下げできない(力のモーメントが大きい)
    • mxが重かったため
    • mxが長かったため

変更点

  • 小型化

変更後の問題点

  • 手動で,リセット位置(pd()した状態)を設定する必要がある

mx:X軸制御機構

ペンをX軸方向に動かすための機構

X機構

問題点

  • Z軸制御機構(arm)との接続が甘いため,書いていくうちにX軸制御機構(mx)全体が斜めに歪んでいってしまう

my:Y軸制御機構

紙を動かすための機構

Y機構

開発当初の問題点

  • 紙を安定して送り出せない
    • 他のパーツとの干渉
    • モータ1つで軸に繋いだタイヤを2つ回し紙を動かしているが,その左右のタイヤの位置の歪み

変更点

  • 後方にもタイヤを3つ設置した
    • 紙にかける力が安定化された

変更後の問題点

  • パーツとの干渉が若干残っている

cs:カラーセンサ

紙が入っているかを確認するための機構

開発当初の問題点

  • 紙との距離が遠く,また斜めになっていてうまく色を測れない場合があった

変更点

  • 紙との距離を近づけた

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

PrinthonはLEGO Mindstorms EV3プリンターのために開発したドロー用プログラムである.

プログラム全体の流れ

Printhonは変数及び関数の定義用プログラム
別途用意する字を書くプログラムにPrinthonをimportさせPrinthonを使用することができる.

Printhon 0.1

問題点

  • 動作が遅い
    • sleep()の引数を固定値にしていたため
  • X軸方向の移動における誤差
    • 移動距離を指定できるようにするために測定した値mxcm(ソースコードを参照)に誤差があった
  • 45度以外の斜線が書けない
    • X方向の移動にかかる時間とY方向の移動にかかる時間が異なっているため

Printhon 0.2

変更点

  • 動作が速くなった
    • sleep()の引数を移動速度と移動距離に応じた値に変更
  • X軸方向の移動における誤差を修正
  • InteractivePrinthonを開発
    • InteractivePrinthon 0.1はPrinthon 0.2と互換性がある.
    • まず、ユーザが入力した動作を実行。その後同様に、ユーザからの入力を受け付け、実行するといったループを取り入れたインタラクティブなプログラムである.
    • 今後のアップデートでログの出力を可能にする.(つもりだった)
  • 相対的座標移動から絶対的座標移動に変更
    • 相対座標の場合,字を書くプログラムの変更が大変ではないかと考えたため
  • Yの移動をモーターの回転時間から回転角度にした
  • ペンの上げ下げをwrite関数内に組み込み
    • 字を書くプログラムを簡素化するため

問題点

  • 45度以外の斜線が書けない

Printhon 0.3

変更点

  • 移動方法は相対的座標に戻した
    • すでに相対的座標で書けるプログラムが存在していたため
  • InteractivePrinthonを廃止
    • Printhon 0.3はPrinthon 0.1をベースにしていたため,Printhon 0.2で使えたInteractivePrinthonが使えなくなった.
    • 不要に感じた
  • write関数を廃止
    • ペンの上げ下げ組み込んでいた関数だったが逆に使いづらくなる可能性があったため

問題点

  • 45度以外の斜線が書けない

Printhon 0.4

変更点

  • 45度以外の斜線が書けるようになった

ソースコード

#!/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
mycm = 20.050125313
n = 56.25
vxy_ratio = 5/3  # x:y=5:3
#   *position_sp
mxcm_print = mxcm
mycm_print = mycm*-1
mycm_paper = mycm
#   *distance(cm)/speed
sleep_x = n
sleep_y = vxy_ratio*n
  • mx.position_spにmxcmまたはmy.position_spにmycmをかけると、指定距離[cm]を移動させることができる
  • 指定距離にsleep_xまたはsleep_yをかけて速さで割った値がsleep()に与えるちょうどよい引数になる
# speed
#   common
my_speed = 100
arm_speed = 30
#   x only
mx_speed = 500
  • my_speed及びarm_speedは全ての関数で共通してspeed_spの引数になる
  • mx_speedはx()関数だけに与えられる引数になる*1
# paper
paper_set_d = 4
paper_out_d = 4
  • paper_set_dは用紙をセットするときのセンサーからの移動距離
  • paper_out_dは用紙を排出するときのセンサーからの移動距離
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):
    mx.run_to_rel_pos(position_sp=x*mxcm_print, speed_sp=mx_speed)
    sleep(abs(x)*sleep_x/mx_speed)
def y(y):
    my.run_to_rel_pos(position_sp=y*mycm_print)
    sleep(abs(y)*sleep_y/my_speed)
def xy(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():
    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():
    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.")

使用例:"小松"

プログラム

#!/usr/bin/env python3
from printhon_ver0_4 import *
init_all()
input("Press enter to print \"komatsu\"")
# ko
pu()
x(4)
# 1
pd()
y(-4)
xy(-0.3, 0.3)
pu()
y(2)
x(-1.5)
# 2
pd()
xy(-1, -1)
pu()
x(4)
y(1)
# 3
pd()
xy(1, -1)
pu()
# matsu
x(-5)
y(-3)
# 1
pd()
x(1.5)
pu()
x(-0.5)
y(1)
# 2
pd()
y(-4)
pu()
y(3.2)
# 3
pd()
xy(-1, -1)
pu()
xy(1, 1)
# 4
pd()
xy(1.5, -1.5)
pu()
x(1)
y(1)
# 5
pd()
xy(-1, -1)
pu()
x(2)
y(1)
# 6
pd()
xy(1, -1)
pu()
x(-1.8)
# 7
pd()
xy(-1.5, -1.5)
x(2.5)
pu()
xy(-0.5, 0.5)
# 8
pd()
xy(1, -1)
paper_out()

結果

プリント小松

https://youtu.be/WdNv92dy-Yc


*1 xy()関数ではmx.speed_spは別の値が与えられる

添付ファイル: filereS__24272899.jpg 47件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-25 (土) 21:16:44 (356d)