2019a/Member

課題1

内容

「これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ。」という課題だった。

選んだ文字

実家のある岐阜県から「岐阜」という文字を選んだ。

ロボット

作成したロボット

robot1.png robot2.png

ロボットの説明

作成したロボットはEV3の組み立て説明書に書いてあるものとほぼ同じだが、以下の二点を変更した。

.撻鵑了ち手

arm.png
ペンの持ち手は上の写真のようにして、文字を書いているときでもペンが安定するようにした。

▲ア

EV3のモーターはとても精度が悪く、そのまま使うことが出来なかった。そこで今回はギアをかませることでモーターの精度を上げた。
gear1.png gear2.png
この写真のように
モーター歯数8の歯車歯車40の歯車
と歯車を組み合わせることによってモーターの精度を5倍にした。 また、この時にタイヤを組み立て説明書に書いてあるより少し前方に配置し、文字を書いているときにロボットの後部が浮くといった問題が起こらないように対策した。

プログラムの準備

モジュールのインポート

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep

インスタンスの作成

mL = LargeMotor("outA")
mR = LargeMotor("outB")
mP = MediumMotor("outC")
  • mLはロボットを後ろから見たとき、左側(Left)にあるモーター(motor)
  • mRはロボットを後ろから見たとき、右側(Right))にあるモーター(motor)
  • mPはペン(Pen)の上げ下げをするモーター(motor)

関数の定義

以下の関数を定義する。

  • ロボットを前進/後進させる関数
  • ロボットを2つのタイヤの真ん中を中心として時計回り/反時計回りに回転させる関数
  • ロボットをペンを中心として時計回り/反時計回りに回転させる関数
  • ペンを上げる/下げる関数

また、これらの関数では以下の点を統一した。

  • speed_spは±360にした。
  • stop_actionは"hold"にした。
  • スリープさせる秒数は余裕をもって理論上の動作にかかる秒数の1.5倍にした。

ロボットを前進させる関数

def forward(distance):
    mL.run_timed(time_sp=distance / 35 * 1000, speed_sp=-360, stop_action="hold")
    mR.run_timed(time_sp=distance / 35 * 1000, speed_sp=-360, stop_action="hold")
    sleep(distance / 35 * 1.5)

引数:

  • distance:前進させる距離をmmで指定する。

この関数の解説:

  • time_spはロボットを1秒前進させると約35mm進むので、そこから逆算した。
  • 前進させるときのspeed_spはギアの関係でになる。
    function forward.png

ロボットを後進させる関数

def backward(distance):
    mL.run_timed(time_sp=distance / 35 * 1000, speed_sp=360, stop_action="hold")
    mR.run_timed(time_sp=distance / 35 * 1000, speed_sp=360, stop_action="hold")
    sleep(distance / 35 * 1.5)

引数:

  • distance:後進させる距離をmmで指定する。

この関数の解説:

  • time_spはロボットを1秒後進させると約35mm後進するので、そこから逆算した。
  • 後進させるときのspeed_spは前進させるときの逆でになる。
    function backward.png

ロボットを2つのタイヤの真ん中を中心として時計回りに回転させる関数

function clockwise.png

def clockwise(angle):
    mL.run_timed(time_sp=angle * (3550 / 90), speed_sp=-360, stop_action="hold")
    mR.run_timed(time_sp=angle * (3550 / 90), speed_sp=360, stop_action="hold")
    sleep(angle * (3550 / 90) / 1000 * 1.5)

引数:

  • angle:時計回りに回転させる角度を度数法で指定する。

この関数の解説:

  • 図のように、2つのタイヤの真ん中(★)を中心としてangleだけ時計回りに回転させる。
  • time_spはtime_sp=3550でロボットが90度時計回りに回転するので、そこから逆算した。

ロボットを2つのタイヤの真ん中を中心として反時計回りに回転させる関数

function counter_clockwise.png

def counter_clockwise(angle):
    mL.run_timed(time_sp=angle * (3550 / 90), speed_sp=360, stop_action="hold")
    mR.run_timed(time_sp=angle * (3550 / 90), speed_sp=-360, stop_action="hold")
    sleep(angle * (3550 / 90) / 1000 * 1.5)

引数:

  • angle:反時計回りに回転させる角度を度数法で指定する。

この関数の解説:

  • 図のように、2つのタイヤの真ん中(★)を中心としてangleだけ反時計回りに回転させる。
  • time_spはtime_sp=3550でロボットが90度時計回りに回転するので、そこから逆算した。

ロボットをペンを中心として時計回りに回転させる関数

function right.png

def right(angle):
    forward(75)
    clockwise(angle)
    backward(75)

引数:

  • angle:時計回りに回転させる角度を度数法で指定する。

この関数の解説:

  • ペンを中心にangleだけ時計回りに回転させるには、図のように
    .蹈椒奪箸鯀或覆気擦董▲撻鵑里△辰唇銘屬2つのタイヤの真ん中を合わせる。
    angleだけ時計回りに回転させる。
    ロボットを後進させて、ペンをもとの位置に合わせる。
    という手順でロボットを動かせばいい。
  • 2つのタイヤの真ん中とペンとの距離は測定したところ約75mmだったので、forwardとbackwardの引数は75にした。

ロボットをペンを中心として反時計回りに回転させる関数

function left.png

def left(angle):
    forward(75)
    counter_clockwise(angle)
    backward(75)

引数:

  • angle:反時計回りに回転させる角度を度数法で指定する。

この関数の解説:

  • 時計回りの時と同様に、ペンを中心にangleだけ反時計回りに回転させるには、図のように
    .蹈椒奪箸鯀或覆気擦董▲撻鵑里△辰唇銘屬2つのタイヤの真ん中を合わせる。
    angleだけ反時計回りに回転させる。
    ロボットを後進させて、ペンをもとの位置に合わせる。
    という手順でロボットを動かせばいい。
  • 2つのタイヤの真ん中とペンとの距離は測定したところ約75mmだったので、forwardとbackwardの引数は75にした。

ペンを上げる関数

def penup():
    mP.run_to_abs_pos(position_sp=30, speed_sp=360, stop_action="hold")
    sleep(1)

この関数の解説:

  • 具体的にはこの関数はロボットのペンを30度上にあげた状態にする。
  • スリープさせる時間が1秒なのは、この関数が実行される前のペンの位置がわからないため。1秒あればペンを動かすには問題ないと判断した。

ペンを下げる関数

def pendown():
    mP.run_to_abs_pos(position_sp=-30, speed_sp=360, stop_action="hold")
    sleep(1)

この関数の説明:

  • この関数を実行した後にロボットを動かすと線が引ける。
  • 具体的にはこの関数はロボットのペンを30度下げた状態にしようとする。しかしロボットのペンは下にはせいぜい10度ぐらいしか下ろせないので、実際にはロボットのペンを10度ぐらい下げた状態にする。
  • なぜposition_spの値を-10にしないで-30にするかというと、-10にするとペンがかなりフワフワして安定して線が描けないからである。
  • スリープさせる時間が1秒なのはpenupの時と同じ理由である。

プログラム

書く順番

書く順番は次のとおりにした。
stroke order.png

書き始めの位置

書き始めの位置は次のようにした。
start position.png

字を書く条件

  • 清書するときは筆ペンを使った。
  • 筆ペンのインクが裏抜けして紙の下の床を汚さないようにA4のプリント用紙の下にクリアファイルを敷いて文字を書いた。

字を書く

「岐阜」の「岐」を書く

「岐」の「山」を書く

pendown() #ここから「岐」の1画目
forward(70)
penup()
backward(40)
right(90)
forward(20)
left(90)
pendown() #ここから「岐」の2画目
forward(40)
penup()
left(90)
pendown()
forward(40)
penup()
left(90)
pendown() #ここから「岐」の3画目
forward(40)
penup()

「岐」の「支」を書く

forward(30) #「岐」の3画目から4画目の位置に移動する
right(90)
forward(20) 
pendown() 
forward(60)
penup()
backward(30)
left(90)
forward(20)
pendown() #ここから「岐」の4画目
backward(40)
penup()
left(90)
forward(30)
pendown() #ここから「岐」の5画目
backward(60)
penup()
left(45)
pendown() #ここから「岐」の6画目
forward(90)
penup()
backward(90)
right(45)
forward(60)
right(45)
pendown() #ここから「岐」の7画目
backward(90)
penup()

「岐」の7画目から「阜」の1画目の位置に移動する

left(45)
forward(70)
left(45)
forward(30)

「岐阜」の「阜」を書く

pendown() #ここから「阜」の1画目
forward(20)
penup()
left(45)
pendown() #ここから「阜」の2画目
forward(60)
penup()
backward(60)
left(90)
pendown() #ここから「阜」の3画目
forward(80)
penup()
right(90)
pendown()
forward(20)
penup()
right(90)
forward(80)
pendown() #ここから「阜」の4画目
backward(80)
penup()
forward(80)
left(90)
forward(20)
right(90)
pendown() #ここから「阜」の5画目
backward(80)
penup()
left(90)
pendown()
forward(20)
penup()
right(90)
forward(80)
pendown() #ここから「阜」の6画目
backward(80)
penup()
forward(90)
left(90)
forward(20)
right(90)
pendown() #ここから「阜」の7画目
backward(100)
penup()
forward(50)
right(90)
forward(20)
pendown() #ここから「阜」の8画目
backward(50)
penup()

結果

結果は以下のようになった。
result.png

課題1のまとめ

反省と考察

比較的うまく書けたと思う。ギアを付ける前は文字を書いても読めるような文字は書けなかったが、ギアを付けることで読めるような文字を書くことが出来た。しかし、ギアを付けても特に「阜」の文字が崩れてしまった。
ideal result.png
(左がロボットが理想通りに動いたとき書けるはずの文字 右が今回の結果)
今回の結果では、くっついているべき線と線がくっついていなかったり、本来止まるべき場所で線が止まっていなかったりする。おそらく原因として考えられるのは

  1. right関数やleft関数で2つのタイヤの真ん中とペンとの距離を75mmとしたが、ここでずれが生じた
  2. clockwise関数やcounter_clockwise関数でロボットを回転させたが、この時の回転でずれが生じた

等が考えられる。ここをもう少しいじればもう少し良い結果が出たかもしれない。またこのプログラムでは基本的には漢字の書き順を守ろうとしたため、ロボットが同じところを何度も行ったり来たりして効率が悪く、それも字が崩れた一因になったと思う。

次回に向けて

字を書くプログラムがここまで難しいとは思っていなかった。今回はギアを付けることを思いつく前に時間を使いすぎて、ギアを付けた後に試行錯誤する時間が少なくなってしまった。しかしギアを付けるとモーターの精度がある程度改善できるというのは大きな発見だった。今回の経験を活かし、課題2も頑張りたい。




昨日の訪問者数: 0人
今日の訪問者数: 1人
合計訪問者数: &counter([total|today|yesterday]);人


添付ファイル: filearm.png 18件 [詳細] filestroke order.png 15件 [詳細] fileideal result.png 16件 [詳細] fileresult.png 8件 [詳細] filestart position.png 16件 [詳細] filefunction backward.png 9件 [詳細] filefunction forward.png 12件 [詳細] filefunction left.png 11件 [詳細] filefunction right.png 12件 [詳細] filegear2.png 14件 [詳細] filerobot2.png 15件 [詳細] filerobot1.png 18件 [詳細] filegear1.png 16件 [詳細] filefunction clockwise.png 12件 [詳細] filefunction counter_clockwise.png 12件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-06-05 (水) 20:26:04