目次

Mission1

今回の課題はこれまで住んだことのある様々な地名の中から2文字以上のものを選び、それをA4の紙に書くロボットを作ること。注意点はいくつかあり、

  • ひとりにつき一つ以上のプログラムを作成すること。
  • ペン以外はキットに含まれる部品を使うこと。
  • キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。
  • 改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。                                 (2018a/Mission1から引用)

ロボ名と各機構の説明

ロボット名

今回私たちの班ではこのロボットのことを

”STRIDE ”

と命名した。strideは’闊歩する’という意味で紙の上を縦横無尽に動いてほしいという意味で名付けた....と建前上なっているが本当の命名理由は南雲君が委員会で先輩に押しつけられた、「stride」というガムの名前から勝手に私が命名した。

ロボット全体と各機構の仕組み

stride

今回は仕組みを作るのが比較的難しいがきれいな文字が書けるXY型を採用した

。拏瓦LargeMotorで車輪一つを動かす単純な作りになっている。

X軸は歯車と格子状のアームを用いて伸び縮みで横に伸ばせるようにした。揺れが少なくなるように支柱を車輪付きの柱で支えたり、まっすぐのびる様格子の付け根に突起をつけた。

ペンを上げ下げする部分を私たちは”あかべこヘッド”と名付けた。それはこの部分があの伝統工芸品赤べこと似ているためであるということにした。 EV3元々にあった機構をそのまま流用した。

今回書いた漢字と書き順

今回書いた文字は我が地元 山梨の別名 

甲州

とした。斜め線がないのでとてもやりやすかった。

「甲州」の書き順

ここで重要になってくるのは甲州の書き順である。私は結果として2通りの書き順を試した。

  • 1回目(失敗例) 失敗例 は実際の線の軌道 は空中での軌道

極力斜めの線をなくしたいという私の強い願望(=惰性)により考案された通称ジグザグ型である。

斜めの移動が少なくなることで誤差が小さくなる(という勝手な思い込み)メリットがある。さらに移動距離をかなり短くすることができる。(意味はない)

デメリットとしてはy軸負方向から正方向へと動かす際に赤べこヘッドのペン先が紙に引っかかりそこを軸に回ってしまうという事故が起こるということだ。(重大な事故)


  • 2回目(成功例) 成功例は実際の線の軌道 は空中での軌道

1回目が実現が難しいと解り急遽組んだが、やはり書き順とは偉大なものできちんと書き順通りに書くことできれいな字ができる。と改めて理解した。

問題の斜めだったがよく考えたら、紙面上で斜めに動かさないということ気づいた(遅い)ので多用したが整合性を持たせるためインターバルが長くなってしまった。

  • 完成品 甲州

定義とプログラム

pythonを用いるため以下のように組む

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

各機構を以下のように省略

mX = LargeMotor('outA') # x軸(マジックハンド)
mY = LargeMotor('outB')# y軸 車輪
mP = MediumMotor('outD')#  あかべこヘッド(ペン)

成功例【2回目】

縦線横線を多用するので以下のような定義づけ

move_migi():
右向きの線を描く関数
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mX.run_to_rel_pos(position_sp=-90, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_hidari():
左向きの線を描く関数
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mX.run_to_rel_pos(position_sp=90, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_usirolong():
縦の長い線を引く関数
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mY.run_to_rel_pos(position_sp=240, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_usiroshort():
縦の短い線を引く関数
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mY.run_to_rel_pos(position_sp=120, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
point_dot():
点を書く関数
   sleep(1)
   mX.run_to_rel_pos(position_sp=30,  speed_sp=170, stop_action='hold')
   sleep(1)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(1)
   mY.run_to_rel_pos(position_sp=15, speed_sp=170, stop_action='brake')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(1)
   mY.run_to_rel_pos(position_sp=-15, speed_sp=170, stop_action='hold')
   sleep(3)

実際のプログラムは以下の通り まず、定番のリセット関数

mX.reset()
mY.reset()
mP.reset()

次に「甲」の字を描くプログラム

move_usiroshort()
mY.run_to_rel_pos(position_sp=-120, speed_sp=170, stop_action='hold')
sleep(3)
mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
sleep(3)
mX.run_to_rel_pos(position_sp=-83, speed_sp=170, stop_action='hold')
sleep(3)
mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
sleep(5)
move_usiroshort()
mX.run_to_rel_pos(position_sp=90, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=-60, speed_sp=170, stop_action='hold')
sleep(3)
move_migi()
mX.run_to_rel_pos(position_sp=90, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=60, speed_sp=170, stop_action='hold')
move_migi()
mX.run_to_rel_pos(position_sp=45, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=-120, speed_sp=170, stop_action='hold')
move_usirolong()

「州」の字を描くプログラム

mX.run_to_rel_pos(position_sp=30, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=20, speed_sp=170, stop_action='hold')
sleep(3)
move_usirolong()
mX.run_to_rel_pos(position_sp=-30, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=-240, speed_sp=170, stop_action='hold')
sleep(5)
move_usirolong()
mX.run_to_rel_pos(position_sp=-30, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=-240, speed_sp=170, stop_action='hold')
sleep(5)
move_usirolong()
mX.run_to_rel_pos(position_sp=-10, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=-120, speed_sp=170, stop_action='hold')
sleep(3)
point_dot()
point_dot() 
point_dot()

あれ? move_hidari() って使ってない...?

失敗例(1回目)

上記に加えて上向き関数2つ追加

move_migi():
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mX.run_to_rel_pos(position_sp=-90, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_hidari():
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mX.run_to_rel_pos(position_sp=90, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_maelong():
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mY.run_to_rel_pos(position_sp=-180, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_usirolong():
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mY.run_to_rel_pos(position_sp=180, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_maeshort():
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mY.run_to_rel_pos(position_sp=-120, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
move_usiroshort():
   sleep(3)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(3)
   mY.run_to_rel_pos(position_sp=120, speed_sp=170, stop_action='hold')
   sleep(3)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')
   sleep(5)
point_dot():
   sleep(1)
   mX.run_to_rel_pos(position_sp=45, speed_sp=170, stop_action='brake')
   sleep(1)
   mP.run_to_rel_pos(position_sp=40, speed_sp=170, stop_action='brake')
   sleep(1)
   mP.run_to_rel_pos(position_sp=-40, speed_sp=170, stop_action='brake')

リセット関数

mX.reset()
mY.reset()
mP.reset()

これは失敗例なのでざっくりとプログラムを載せる。

move_maelong()//失敗箇所
mX.run_to_rel_pos(position_sp=45, speed_sp=170, stop_action='hold')
move_migi()
mY.run_to_rel_pos(position_sp=60, speed_sp=170, stop_action='hold')
move_hidari()
mY.run_to_rel_pos(position_sp=60, speed_sp=170, stop_action='hold')
move_migi()
move_maeshort()//失敗箇所
mX.run_to_rel_pos(position_sp=90, speed_sp=170, stop_action='hold')
move_usiroshort()
mY.run_to_rel_pos(position_sp=120, speed_sp=170, stop_action='hold')
move_usirolong()
mX.run_to_rel_pos(position_sp=-45, speed_sp=170, stop_action='hold')
move_maelong()//失敗箇所
mX.run_to_rel_pos(position_sp=-45, speed_sp=170, stop_action='hold')
move_usirolong()
mX.run_to_rel_pos(position_sp=20, speed_sp=170, stop_action='hold')
mY.run_to_rel_pos(position_sp=60, speed_sp=170, stop_action='hold')
sleep(3)
point_dot()
point_dot()
point_dot()

反省と感想

  • 1回目(失敗例)の時、y軸を負方向から正方向に動かそうとした点
  • 2回目にmove_hidari()を定義したのにもかかわらず使わなかった点
  • 直前になるまでプログラムを組もうとしていなかった点
  • インターバルが長すぎるせいで一回に3分近くかかる点

268 アクセスカウンター [#adac46d4]


添付ファイル: filekousyuu.jpg 23件 [詳細] fileSTRIDE.jpg 29件 [詳細] file甲州(1回目).png 28件 [詳細] file甲州(2回目).png 26件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-08 (金) 13:08:26 (439d)