*目次 [#e1e7976c]
#contents
*課題�機Ы馥札蹈椒奪� [#p7281f93]
今回の課題はこれまで住んだことのある様々な地名の中から2文字以上のものを選び、それをA4の紙に書くロボットを作ることでした。注意点はいくつかあり、
- ひとりにつき一つ以上のプログラムを作成すること。
- ペン以外はキットに含まれる部品を使うこと。
- キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。
- 改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。
(2018a/Mission1から引用)
でした。そこで僕は大学に来るまで住んでいた「東京」を書くことにしました。この漢字を選んだ理由は後述します。
書道ロボットには大きくいくつ種類がありましたが、プログラムは初挑戦だったので、製作は難しいがプログラムが比較的簡単できれいな文字が書きやすいといわれる「xy軸型」のロボットを製作することにしました。
(課題について詳しくはhttp://yakushi.shinshu-u.ac.jp/robotics/?2018a%2FMission1を参照下さい)
*躯体本体 [#t79b7a78]
**各部名称 [#n6fffa66]
***ロボット本体 [#r3b62f5a]
僕たちはこのロボットに
&size(22){”STRIDE ”};
と名付けました。strideは'闊歩する'を意味する言葉で用紙の上を縦横無尽に動いて欲しいという思いを込めました。
相方(Maedak)に書いてあるのはウソですよ、頑張って心込めて名付けましたよ、決してそんなテキトウじゃないですよ、ホントデスヨ.......
***駆動部 [#u9e64a1b]
このロボットには主に3つの駆動系に分けられます。
ー赤べこヘッドー
ペンの上げ下げをする機構です。動きが赤べこ(会津若松の郷土玩具)に似ているためこう名付けました。
ー��軸系統ー
A4の用紙を縦に置いたときの横向きに赤べこヘッドを動かすための機構です。
ーY軸系統ー
A4の用紙を縦に置いたときの縦向きに躯体本体を動かすための機構です。
**赤べこヘッド [#t8decd30]
&ref(2018a/Member/montbell/Mission1/赤べこヘッド 図1.jpg,50%,赤べこヘッド1);
&ref(2018a/Member/montbell/Mission1/赤べこヘッド 写真2.jpg,70%,赤べこヘッド2);
赤べこヘッドの機構は信頼性を重視しマニュアルにある既存の機構を流用しています。(写真 あ-1参照)まずミディアムモーターに接続された十字状の部品(オレンジ色の矢印)が回転します。すると直角に接続された同じ十字状の部品が回転し(緑色の矢印)それによってアームが上下します。(写真あ-2)
また赤べこヘッドを作る際はEV3に輪ゴムが附属していなかったためペンを固定するのに苦労しました。そこでゴムのついたタイヤを滑り止めとすることでペンを固定できるようにしました。副産物としてこのタイヤ部分を回転させることでペンを微調整することができ以外に役立ちました。
**��軸系統 [#b073fda3]
&ref(2018a/Member/montbell/Mission1/��軸系統 写真1.jpg,50%,��軸系統 写真1);
&ref(2018a/Member/montbell/Mission1/��軸系統 写真2.jpg,50%,��軸系統 写真2);
&ref(2018a/Member/montbell/Mission1/��軸系統 歯車.jpg,50%,��軸系統 歯車);
STRIDEの��軸系統はマジックアームとそれを支えるレールから成り立っています。
まずマジックアームについてです。��軸系統はY軸系統の上に乗っておりY軸系統側にモーターがあります。このモーターには4つの歯車が接続しており、モーターが回転すると両端のモーターが互いに逆向きに回転します。この両端の歯車にマジックアームの端を固定することでモーターの回転運動を平行運動に変換しています。(写真 X-1,2)写真を見ていただけるとわかりやすいのですが、この��軸系統はジャバラ状に組んだ骨組みが伸縮することで赤べこヘッドを動かしています。しかしこのアームはできるだけ一つの骨組みを大きくしてあります。これは試作した際使う部品の数が増えるほどモーターの動きに対して誤差が大きくなってしまったためです。
&ref(2018a/Member/montbell/Mission1/��軸系統 アーム裏.jpg,60%,��軸系統 アーム裏);
&ref(2018a/Member/montbell/Mission1/��軸系統 レール2.jpg,50%,��軸系統 レール2);
&ref(2018a/Member/montbell/Mission1/��軸系統 レール1.jpg,60%,��軸系統 レール1);
次にレールに関してです。レールはアームとは別になっておりY軸系統に接続しています。このレールにはアームがY軸に対しきちんと直角に移動するためのガイドとしての役割のがあります。赤べこヘッドの下には長細い部品が飛び出ており(写真X-3 オレンジの丸)、これがレールに組み合わさることで赤べこヘッドの移動方向とペンの向きが固定されます。また最初は2本のレールの接続はレールの1段下で行っていましたが(赤色部)赤べこの突起が引っかかってしまったためレールの2段下(黄色部)で接続させています(写真 X-R1)
また、レールにはタイヤがついており重たい赤べこヘッドを支える役割もあります。(写真 X-R2)最初はレールがなく、タイヤは自由に向きを変えれるようにしたうえで赤べこヘッドに直接接続していましたがタイヤの向きがうまく変わらなかったため赤べこヘッドを移動させることができず今の形に修正しました。
**Y軸系統 [#id710a3e]
Y軸系統は一つラージモーターで同軸の2つのタイヤを回転させ縦方向に行き来するだけのいたってシンプルな機構です。ちなみに��軸系統のレールについているタイヤもY軸系統のタイヤと同じ向きに固定されており、レールを支えています。
*プログラム [#ta377af2]
**前準備 [#s78ea4c9]
プログラムを組むにあたってまず初めにロボットで書く文字を検討しました。最初は画数か少なく比較的シンプルであった「刈谷」を書こうとしました。しかし��軸をマジックアームで動かすSTRIDEの特性上、��軸移動のスピードを均等にすることがうまくいかず斜めの線が曲がってしまいうまく書けませんでした(下写真 オレンジで囲んだ部分)。そこで最終的に、画数は多いが斜めの線が少ない「東京」をかくことにしました。
#ref(2018a/Member/montbell/Mission1/ひねくれ斜線.jpg,50%,ひねくれ斜線)
次に書き順を検討しました。「刈谷」を書こうとした際、下から上へ書こうとするとペン先が紙に引っかかりそこを軸に回ってしまうことが解りました。それを踏まえて考えると人間が書く書き順はロボットにとっても書きやすいものであることに気が付いたので、書き順通りに書くことに決めました。
参考
#ref(2018a/Member/montbell/Mission1/東京 書き順.JPG,50%,東京 書き順)
**関数...の前に [#ad1b2a62]
まず次の文章をプログラムしました。説明は省略します。
#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
それぞれの端子に接続しているモーターのインスタンスを作成します。mXは��軸系統、mYはY軸系統、mMは赤べこヘッドに接続したモーターを表しています。
mX = LargeMotor('outA')
mY = LargeMotor('outB')
mM = MediumMotor('outD')
mX.reset()
mY.reset()
**関数 [#t09afa87]
関数を作成します。
:赤べこヘッドがペンを下げる関数|
mMを40度回転させペンを下げると同時に次の動作を行うまで3秒待機します。
def pen_down():
mM.run_to_rel_pos(position_sp=40, speed_sp=100, stop_action='brake')
sleep(3)
:Y軸系統を動作させる関数|
mYを指定した値(t)の角度だけ回転させます。縦に置いたA4用紙に対して上下に移動します。
tに正の値を代入すると下に動き、負の値を導入すると上に動きます。およそt=630でA4用紙の縦の長さになります。
def move_vertical(t):
sleep(0.2)
mY.run_to_rel_pos(position_sp=t, speed_sp=170, stop_action='hold')
:��軸系統を動作させる関数|
mXを指定した値(t)の角度だけ回転させます。縦に置いたA4用紙に対して左右に移動します。
tに正の値を代入すると左に動き、負の値を導入すると右に動きます。およそt=100ほどでA4用紙の横の長さになります。
def move_slide(t):
mX.run_to_rel_pos(position_sp=t, speed_sp=110, stop_action='hold')
:赤べこヘッドがペンを上げる関数|
mMを-40度回転させペンを下げると同時に次の動作を行うまで3秒待機します。
def pen_up():
mM.run_to_rel_pos(position_sp=-40, speed_sp=100, stop_action='coast')
sleep(3)
**「東京」を書くプログラム [#ya38410c]
ここからは上で定義した関数を使用し実際に文字を書くプログラムを作っていきます。~
書き始めの位置まで移動したのちペンを下げ、1つの画を書きペンを上げるまでの動作で1つの段落になっています。
:一文字目「東」|
pen_down() //一画目
move_slide(-90) ・・・��
sleep(3)
pen_up()
move_slide(90) //二画目
sleep(3)
move_vertical(50)
sleep(3)
pen_down()
move_vertical(60)
sleep(3)
pen_up()
move_vertical(-65) //三画目
sleep(3)
pen_down()
move_slide(-80) ・・・��
sleep(3)
move_vertical(60)
sleep(3)
pen_up()
move_slide(80) //四画目
sleep(3)
move_vertical(-25)
sleep(3)
pen_down()
move_slide(-80)
sleep(3)
pen_up()
move_slide(80) //五画目
move_vertical(30)
sleep(3)
pen_down()
move_slide(-80)
sleep(3)
pen_up()
move_slide(55) //六画目
sleep(2)
move_vertical(-140)
sleep(3)
pen_down()
move_vertical(220)
sleep(3)
pen_up()
move_vertical(-70) //七画目
sleep(2)
move_slide(9)
sleep(3)
pen_down()
move_vertical(30)
move_slide(30)
sleep(2)
pen_up()
move_vertical(-45) //八画目
sleep(2)
move_slide(-58)
sleep(3)
pen_down()
move_vertical(30)
move_slide(-30)
sleep(2)
pen_up()
:二文字目「京」|
move_slide(45) //一画目
sleep(2)
move_vertical(60)
sleep(3)
pen_down()
move_vertical(30)
sleep(2)
pen_up()
move_slide(30) // 二画目
sleep(3)
pen_down()
move_slide(-80)
sleep(3)
pen_up()
move_slide(80) //三画目
sleep(2)
move_vertical(40)
sleep(3)
pen_down()
move_vertical(50)
sleep(3)
pen_up()
move_vertical(-50) //四画目
sleep(3)
pen_down()
move_slide(-60)
sleep(3)
move_vertical(50)
sleep(3)
pen_up()
move_slide(60) //五画目
sleep(2)
pen_down()
move_slide(-60)
sleep(2)
pen_up()
move_slide(35) //六画目
sleep(3)
pen_down()
move_vertical(95)
sleep(3)
pen_up()
move_vertical(-75) //七画目
sleep(2)
move_slide(15)
sleep(2)
pen_down()
move_vertical(30)
move_slide(20)
sleep(2)
pen_up()
move_vertical(-40) //八画目
sleep(2)
move_slide(-60)
sleep(3)
pen_down()
move_vertical(30)
move_slide(-20)
sleep(2)
pen_up()
必要なプログラムはここまでですが��軸系統とY軸系統のブレーキが'hold'になっているため動作終了後に本体を初期位置に戻すのが大変なため'coast'に直しておきます。
sleep(3)
mX.stop_action = 'coast'
mY.stop_action = 'coast'
**試行錯誤 [#r91ec592]
:元に戻らない|
#ref(2018a/Member/montbell/Mission1/東京2.jpg,50%,東京2)
まず苦しんだのは��軸がしっかり固定できないことでした。上の写真にある空白(オレンジ色の矢印)は理論上生まれないはずでしたが��軸系統のマジックアームはモーターが回らなくても少し動いてしまうため空白が生まれてしまいました。これにはマジックアームの一つ一つの部品を大きくし部品数を減らすことで誤差を減らし対応しました。
:��軸の誤差|
上記と同じ理由で��軸の線の長さにも誤差ができてしまいました。これには関数の引数を調整することで対応しました。上のプログラムにある�,鉢△砲△襦�move_slide(x)」のXの値を比べてもらえるとわかりやすいと思います。そこ以外にもいくつか調整を行いました。
*最後に [#ga1854f9]
いろいろ頑張ってできたのがこれです。
#ref(2018a/Member/montbell/Mission1/東京 清書.jpg,30%,東京 清書)
かなり四苦八苦しましたが読めるものができてよかったです。