2016b/Member/being/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*はじめに [#j9c2c091]
今回は前回よりは早く始めることができ、かなりの余裕を持っ...
結局、最新のev3dev(2016-10-17版)にアップデートし、python...
また、下書き用にPyCharmのCommunity Editionを利用した。&si...
*課題2(主にライントース)について [#pb1a32ef]
今回の課題は簡単に言えばライントレース+ピンポン玉の確保...
自分はAスタートであるため、" Aスタート → P直進 → Q直進 → ...
今回も機体製作は私、プログラムの雛形はペアのbickyである。
*コースについて [#q45eaa78]
#ref(2016b/Member/being/Mission2/course.png,75%,コース概観)
交差点に番号を振り、各交差点での制御を定義した。自分はAス...
できるだけ反射率が均一であって欲しかったため&size(7){あと...
*今回の機体について [#bd46a54a]
**本体 [#a427fead]
今回の機体で重視したのはコンパクトさである。なぜならあま...
モーターの配置は前回同様、駆動にラージモーター、アームに...
#ref(2016b/Member/being/Mission2/底面.JPG,75%,機体底面)
(写真は見やすさのためにケーブルを取り外してある)~
この機体の特徴としてまず挙げられるのが、センサーと駆動輪...
#ref(2016b/Member/being/Mission2/kitai1.png,75%,本体概観)
この機体は最終的には超音波センサー側に進むようになったの...
ライントレース中の機体の左右の揺れが大きくなってしまうた...
&size(15){そのため、後ろ側のほうがいろいろつけられる構造...
**センサーについて [#q663c934]
使用しているセンサーは超音波センサー、カラーセンサー(赤...
ジャイロセンサー(積算モード?)である。
***この課題においての各センサーの特徴 [#i56f3286]
超音波センサーは、超音波を発してその超音波が帰ってくるま...
今回は機体に地面と水平に取り付け、また値を三回取得し平均...
地面と水平に設置することで地面に向けて設置した場合と比べ...
今回の課題の場合対象物が球形であるため反射波が&size(7){ス...
われわれの機体は取り付け位置のおかげか特にそのような現象...
その差の絶対値が一定以上であればピンポン玉があると判断す...
カラーセンサーは、もともと光の三原色を発して色を判定し、...
~
ジャイロセンサーは本来角速度を検知するものであるため、自...
処理速度が一定とはいいがたいEV3で角度を知るのは困難であろ...
しかし、実際に使ってみるとセンサーの内部で積分しているら...
**ピンポン玉関連の機構について [#xc3cbf14]
今回の機体を製作するにあたっていろいろな機構を考えたもの...
***ピンポン玉の確保について [#h4dacc8d]
今回の機体はアーム部を上げたまま移動し、Qを通過後に超音波...
#ref(2016b/Member/being/Mission2/KITAI2.png,75%,ピンポン...
機体は反時計回りに進んでいるため、ピンポン玉は超音波セン...
このときアームを下ろし過ぎないように物理的にリミッターを...
***ピンポン玉の打ち出しについて [#sdea9034]
ピンポン玉の打ち出し手順はシンプルであり、ゴールに到着す...
前進しながら全力でアームを上げることで打ち出す、という特...
この方式の課題は、機体がピンポン玉を離しているあいだに何...
少し離れた状態でアームがピンポン玉に当たると意図しない方...
これは地面の微妙な傾きなどの外的要因によるものであるため...
この問題に対応するため、たとえピンポン玉が動いてもシュー...
簡単に言えばガイドレールの設置とピンポン玉を機体に押し付...
#ref(2016b/Member/being/Mission2/5358228612682.jpg,75%,打...
その間にアームを下げ、その状態で前進することで超音波セン...
アームを上げ、打ち出すことで安定した打ち出しができるよう...
**機体の分解について [#ndf053b9]
今回の機体は前回の機体のフレームを立てて、ev3を取り付けた...
箱にしまえる大きさまで分解するとモーター2個とジャイロセン...
今回は左右対称には作れなかったが、走行中に歪まず、部品が...
*ライントレースについて [#w32a74b1]
**ライントレース全般について [#fc967a44]
ライントレースとは、ロボットにセンサーからの情報を基に状...
ライントレースをすることは難しいことではないが、速さや正...
ライントレースのやり方は多々あるが今回挑戦したものについ...
今回使用したセンサーは自ら光を発し、その光の反射によって...
このようなセンサーにもいくつか種類があるが、今回使用した...
ほかにも、センサーには現在の反射率を返し、線があるかない...
ライントレース自体のやり方も数種類あるが今回は白→黒→白・...
この場合、センサーの値は往々にして外的要因に影響されるも...
そして、白、黒、グレーのそれぞれの範囲についての行動をプ...
原因は動作のパターンが3つしかないためである。黒を検知して...
&size(7){そもそも今回の課題用のプログラムではグレーの判断...
これをスムーズにするためには値の範囲の数を増やせばよい。...
これを繰り返して、範囲の数を増やせば増やすほど滑らかにな...
今回の課題は直角なカーブがあるためセンサーの値に制限をつ...
**ライントレース中の交差点検知について [#o07ffe95]
今回の課題では、ライトセンサーは1つしか使えない。~
これは、ライントレースをしながらそのセンサーで交差点を検...
そのために今回は、交差点が必ず直角であり、他の場所に直角...
つまり、交差点に侵入するとそこは直角であるため交差点でな...
しかしながら、ev3の反応が遅いためか他と比べてどうしても動...
また、判断に時間がががるということはその間機体は旋回し続...
交差点を右に曲がるときはなんともならないが、直進しなくて...
線を踏み越えるための動作は確実性の観点から大きく旋回し、...
この動きをしたあとに、そのままライントレースに復帰すると...
そのため、もう一度交差点であると誤検知してしまうことが多...
*プログラムについて [#n0984797]
以下のプログラムは''CC BY-SA 4.0''とします。ライセンスは[...
**自作関数について [#fb3fe95a]
学校の環境でev3をプログラミングすることの障害は大きく分け...
もう一つはWifiを経由することとev3の性能によるラグである。...
そのために用いたのが自作関数である。同一ディレクトリに存...
本来、別のimportの方法でなら、関数名を記述するだけでよい...
当然のことだがユーザー関数を使用することでひとつのファイ...
**li-S.py[#af5a8604]
&size(7){雛形となったペアのプログラム名がlt.pyであったた...
#!/usr/bin/env python3
from ev3dev.ev3 import * #パッケージのインポート
&size(7){lcdと音声ファイルを扱う時はなぜか*でなくてはな...
import ev3dev.ev3 as ev3
import time
import linetrace as move
import ball as catch
#A to D #ペアのプログラムと間違えないようにするためのメ...
arm = ev3.MediumMotor('outA') #アームの定義
mr = ev3.LargeMotor('outB') #motor right
ml = ev3.LargeMotor('outC') #motor left
us = ev3.UltrasonicSensor('in1') #超音波センサーの定義
cs = ev3.ColorSensor('in3') #5~80 #カラーセンサーの定義
x = 0 #検知した交差点のカウンタ
Itime = 1.6 #この時間以上カラーセンサーが黒であったら...
# A -> P(go_straight) x=1 -> Q(go_straight) x=2 -> ball_...
# -> Q(go_straight) x=3 -> R(turn_R) -> P(go_straight) -...
Sound.play('start.wav') #...
time.sleep(1)
move.start()
while True:
t0 = time.time() #...
move.line_follow() #...
elapsed_time = time.time() - t0 #...
print(elapsed_time, cs.value(),us.value() ) #...
if elapsed_time > Itime: #...
x += 1 #count of intersection #...
print('count = ', x) #...
mr.stop()
ml.stop() #...
ev3.Sound.play('kousatendesu.wav') #...
time.sleep(1.2) #...
if x == 1 or x == 2 or x == 3 or x == 5: #...
move.go_straight() #...
if x == 2: #...
while True:
us1 = us.value()
us2 = us.value()
us3 = us.value() #...
print(us1,us2,us3) #...
move.line_follow() #...
if (us1 + us2 + us3) / 3 < 70: #...
mr.stop()
ml.stop() #...
break #...
catch.ball_catch() #...
elif x == 6: #...
move.turn_left() #...
elif x == 7:
ev3.Sound.play('neraimasu.wav') #...
catch.shoot() #...
break #...
**ball.py [#cddcab06]
#!/usr/bin/env python3
import ev3dev.ev3 as ev3
import time
arm = ev3.MediumMotor('outA')
mr = ev3.LargeMotor('outB')
ml = ev3.LargeMotor('outC')
&size(7){各パッケージで自身が使うもののみを定義すればよ...
def ball_catch(): #ピンポン玉を捕まえる関数
arm.run_forever(speed_sp=-60)
time.sleep(4)
arm.stop()
def shoot(): #ピンポン玉をシュ...
cs = ev3.ColorSensor('in3') #カラーセンサーを...
gy = ev3.GyroSensor('in2') #ここでジャイロセ...
gy_old = gy.value() #使用したモードで...
while abs(gy.value() - gy_old) < 90: #値を確認するのが...
mr.run_forever(speed_sp=100)
ml.run_forever(speed_sp=-100)
mr.run_forever(speed_sp=-100) #機体を後退させ距...
ml.run_forever(speed_sp=-100)
time.sleep(1)
while cs.value() >= 40: #white
mr.run_forever(speed_sp=100)
ml.run_forever(speed_sp=100) #黒線を検知するま...
while cs.value() < 40:
mr.run_forever(speed_sp=0)
ml.run_forever(speed_sp=-60) #白になるまで左モ...
mr.stop()
ml.stop() #ここまでの一連の...
arm.run_forever(speed_sp=60) #アームを上げる
time.sleep(1)
arm.stop()
time.sleep(1)
mr.run_forever(speed_sp=-200) #機体を後退させア...
ml.run_forever(speed_sp=-200)
time.sleep(2)
mr.stop()
ml.stop()
arm.run_forever(speed_sp=-500) #時間がないので一...
time.sleep(0.5)
arm.stop()
mr.run_forever(speed_sp=150) #機体を前進するさ...
ml.run_forever(speed_sp=150)
time.sleep(3.2)
arm.run_forever(speed_sp=1050) #前進したままで全...
mr.stop()
ml.stop()
time.sleep(0.5)
arm.stop() #アームを止める
**linetrace.py [#fa484292]
#!/usr/bin/env python3
import ev3dev.ev3 as ev3
import time
mr = ev3.LargeMotor('outB')
ml = ev3.LargeMotor('outC')
cs = ev3.ColorSensor('in3') #5~80 #上に同じく
GoPw = -120 #GoPowerの略 本来は前進用の定数だった...
linepowerS = -150 #ライントレースのStrongの方のパワー
linepowerL= -60 #ライントレースのLowの方のパワー
target = 40
power = 100
KP = 4.0 #P制御用の定数郡 ジャイロセンサーを読...
#def line_follow():#with P #P制御と...
# while cs.value() >= 70: #今回カ...
# mr.run_forever(speed_sp=-GoPw)
# ml.run_forever(speed_sp=GoPw)
# t0 = time.time()
# while cs.value() >= 20 and cs.value() < 70: #20以上7...
# turn = KP*(cs.value() - target) #目標値...
# pwl = power - turn #左モー...
# pwr = power + turn #右モー...
# mr.run_forever(speed_sp=pwr)
# ml.run_forever(speed_sp=pwl) #それぞ...
# while cs.value() < 20: #70以上...
# mr.run_forever(speed_sp=Gopw)
# ml.run_forever(speed_sp=-GoPw*2)
def line_follow(): #採用版のライントレース ライン...
while cs.value() >= 50: #黒と判断した時
mr.run_forever(speed_sp=-linepowerS)
ml.run_forever(speed_sp=linepowerL)
t0 = time.time()
while cs.value() < 50: #白と判断した時
mr.run_forever(speed_sp=linepowerL)
ml.run_forever(speed_sp=-linepowerS)
#behave at intersection(normal:turn_right) #交差点での...
def go_straight(): #交差点直進...
mr.run_forever(speed_sp=-GoPw)
ml.run_forever(speed_sp=GoPw/3*2) #右モーター...
time.sleep(2.5)
ml.stop()
mr.stop()
while cs.value() >= 50: #右モーター...
mr.run_forever(speed_sp=200)
while cs.value() < 70: #Adjust direction #このままラ...
mr.run_forever(speed_sp=-100)
ml.run_forever(speed_sp=200)
while cs.value() >= 40: #向きを整え...
mr.run_forever(speed_sp=200)
ml.run_forever(speed_sp=-100)
#for last intersection
def turn_left(): #最後の交差点のみ左折する
mr.run_forever(speed_sp=200) #一定時間旋し、検知したく...
ml.run_forever(speed_sp=-150)
time.sleep(2)
while cs.value() >= 30: #黒いラインを見つけるまで...
mr.run_forever(speed_sp=200)
def start(): #スタートゾ...
mr.run_forever(speed_sp=220)#Get out of Zone A
ml.run_forever(speed_sp=220)
time.sleep(1)
mr.stop()
ml.stop() #停止する
time.sleep(1)
if cs.value() >= 50: #センサーの...
while cs.value() >= 50: #find line
mr.run_forever(speed_sp=200)
else:
while cs.value() < 50: #Adjust direction #黒であった...
mr.run_forever(speed_sp=-200)
ml.run_forever(speed_sp=200)
*結果 [#y948682f]
電圧によって調整する必要はあるが、ほぼ毎回成功させること...
しかしながら、ライントレースの方法の影響でタイムを短縮す...
~
~
~
~
~
~
~
~
*雑記 [#ud993dea]
課題に直接の関係はないものの、ev3を扱っている間にわかった...
**PID制御について [#m22273ff]
課題2がライントレースの課題だと知り、PID制御を実装しよう...
**LCDの使用とev3devのアップデートについて [#f1ba2178]
今回の課題から本格的にセンサーを使用するのでセンサーの値...
なかなか成功しなかったが、結局ev3devのバージョンが低いこ...
#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
import ev3dev.ev3 as ev3 #ここまでテンプレ
lcd = Screen() #Screen関数に名前を...
us = ev3.UltrasonicSensor('in1') #ポート1に超音波セ...
gy = ev3.GyroSensor('in2') #ポート2にジャイロ...
cs = ev3.ColorSensor('in3') #ポート3にカラーセ...
while True:
l = str(us.value()) #lに超音波センサーの値を...
m = str(gy.value()) #mにジャイロセンサーの値を代入
n = str(cs.value()) #nにカラーセンサーの値を...
x1 = str('Ulrta=',l) #lの値を前に`Ulrta=`をつ...
x2 = str('Gyro=',m) #上と同じような動作
x3 = str('Color=',n) #上と同じような動作
x = x1+x2+x3 #3つの文字列を統合する
print(x) #xの内容をPCに出力する
lcd.clear() #LCDをリセットする
lcd.draw.text((36,80),x) #lcdの座標の(36.80)に文字...
lcd.update()
sleep(1) #一秒待つ
**マルチスレッドについて [#sab79ba6]
特に使用する予定はなかったが使えると便利であるかと思った...
確かめてみると、ある程度は可能であるがstrコマンドのバグが...
#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
#import ev3dev.font as fonts
import ev3dev.ev3 as ev3
import threading #threadingのパッケージを...
import time
lcd = Screen()
mr = ev3.LargeMotor('outB')
ml = ev3.LargeMotor('outC')
us = ev3.UltrasonicSensor('in1')
gy = ev3.GyroSensor('in2')
cs = ev3.ColorSensor('in3') #ここまでは今までとほぼ...
def sensors():
while True:
l = str(us.value())
m = str(gy.value())
n = str(cs.value())
print('Ulrta=',str(us.value()),' ','Gyro=',str(gy.va...
lcd.clear()
lcd.draw.text((10,80),l)
lcd.draw.text((50,80),m)
lcd.draw.text((100,80),n) #各値を多少ずらして横に...
lcd.update()
sleep(0.5)
def motor(): #単純なライントレースプログラム
while True:
if cs.value() => 40:
mr.run_forever(speed_sp=-500)
ml.run_forever(speed_sp=-800)
elif cs.value() < 40:
mr.run_forever(speed_sp=500)
ml.run_forever(speed_sp=-500)
x = threading.Thread(target=sensors) #関数sensorsをthrea...
y = threading.Thread(target=motor) #関数motorをthreadi...
x.start()
y.start() #それぞれを実行する
***結果 [#n27c3d25]
threading自体は成功するようだが、strコマンドについてのOS...
**ev3devアップデートにかかわる変更点について [#i8ba4c49]
実は私はev3devをアップデートした結果、モーターを特定角度...
発表の後の時間で確かめてみると、[[ここ:http://yakushi.shi...
その後、ev3dev内の使用可能な命令を調べると"duty_cycle_sp"...
**Wifiについて [#eabe08fb]
ev3にPCからアクセスする方法はUSB経由とBluetooth経由とWifi...
結構快適であるので、自分で持ち込むかもしくは借りたほうが...
**処理速度について [#m19bc65b]
ev3は高機能である代わりに処理速度がどうしても遅いようであ...
**センサーのモード変更や制御に使えるコマンドの調べ方につ...
ec3devはlinuxであるのでコマンドがそのまま使える。/sys/cla...
終了行:
目次
#contents
*はじめに [#j9c2c091]
今回は前回よりは早く始めることができ、かなりの余裕を持っ...
結局、最新のev3dev(2016-10-17版)にアップデートし、python...
また、下書き用にPyCharmのCommunity Editionを利用した。&si...
*課題2(主にライントース)について [#pb1a32ef]
今回の課題は簡単に言えばライントレース+ピンポン玉の確保...
自分はAスタートであるため、" Aスタート → P直進 → Q直進 → ...
今回も機体製作は私、プログラムの雛形はペアのbickyである。
*コースについて [#q45eaa78]
#ref(2016b/Member/being/Mission2/course.png,75%,コース概観)
交差点に番号を振り、各交差点での制御を定義した。自分はAス...
できるだけ反射率が均一であって欲しかったため&size(7){あと...
*今回の機体について [#bd46a54a]
**本体 [#a427fead]
今回の機体で重視したのはコンパクトさである。なぜならあま...
モーターの配置は前回同様、駆動にラージモーター、アームに...
#ref(2016b/Member/being/Mission2/底面.JPG,75%,機体底面)
(写真は見やすさのためにケーブルを取り外してある)~
この機体の特徴としてまず挙げられるのが、センサーと駆動輪...
#ref(2016b/Member/being/Mission2/kitai1.png,75%,本体概観)
この機体は最終的には超音波センサー側に進むようになったの...
ライントレース中の機体の左右の揺れが大きくなってしまうた...
&size(15){そのため、後ろ側のほうがいろいろつけられる構造...
**センサーについて [#q663c934]
使用しているセンサーは超音波センサー、カラーセンサー(赤...
ジャイロセンサー(積算モード?)である。
***この課題においての各センサーの特徴 [#i56f3286]
超音波センサーは、超音波を発してその超音波が帰ってくるま...
今回は機体に地面と水平に取り付け、また値を三回取得し平均...
地面と水平に設置することで地面に向けて設置した場合と比べ...
今回の課題の場合対象物が球形であるため反射波が&size(7){ス...
われわれの機体は取り付け位置のおかげか特にそのような現象...
その差の絶対値が一定以上であればピンポン玉があると判断す...
カラーセンサーは、もともと光の三原色を発して色を判定し、...
~
ジャイロセンサーは本来角速度を検知するものであるため、自...
処理速度が一定とはいいがたいEV3で角度を知るのは困難であろ...
しかし、実際に使ってみるとセンサーの内部で積分しているら...
**ピンポン玉関連の機構について [#xc3cbf14]
今回の機体を製作するにあたっていろいろな機構を考えたもの...
***ピンポン玉の確保について [#h4dacc8d]
今回の機体はアーム部を上げたまま移動し、Qを通過後に超音波...
#ref(2016b/Member/being/Mission2/KITAI2.png,75%,ピンポン...
機体は反時計回りに進んでいるため、ピンポン玉は超音波セン...
このときアームを下ろし過ぎないように物理的にリミッターを...
***ピンポン玉の打ち出しについて [#sdea9034]
ピンポン玉の打ち出し手順はシンプルであり、ゴールに到着す...
前進しながら全力でアームを上げることで打ち出す、という特...
この方式の課題は、機体がピンポン玉を離しているあいだに何...
少し離れた状態でアームがピンポン玉に当たると意図しない方...
これは地面の微妙な傾きなどの外的要因によるものであるため...
この問題に対応するため、たとえピンポン玉が動いてもシュー...
簡単に言えばガイドレールの設置とピンポン玉を機体に押し付...
#ref(2016b/Member/being/Mission2/5358228612682.jpg,75%,打...
その間にアームを下げ、その状態で前進することで超音波セン...
アームを上げ、打ち出すことで安定した打ち出しができるよう...
**機体の分解について [#ndf053b9]
今回の機体は前回の機体のフレームを立てて、ev3を取り付けた...
箱にしまえる大きさまで分解するとモーター2個とジャイロセン...
今回は左右対称には作れなかったが、走行中に歪まず、部品が...
*ライントレースについて [#w32a74b1]
**ライントレース全般について [#fc967a44]
ライントレースとは、ロボットにセンサーからの情報を基に状...
ライントレースをすることは難しいことではないが、速さや正...
ライントレースのやり方は多々あるが今回挑戦したものについ...
今回使用したセンサーは自ら光を発し、その光の反射によって...
このようなセンサーにもいくつか種類があるが、今回使用した...
ほかにも、センサーには現在の反射率を返し、線があるかない...
ライントレース自体のやり方も数種類あるが今回は白→黒→白・...
この場合、センサーの値は往々にして外的要因に影響されるも...
そして、白、黒、グレーのそれぞれの範囲についての行動をプ...
原因は動作のパターンが3つしかないためである。黒を検知して...
&size(7){そもそも今回の課題用のプログラムではグレーの判断...
これをスムーズにするためには値の範囲の数を増やせばよい。...
これを繰り返して、範囲の数を増やせば増やすほど滑らかにな...
今回の課題は直角なカーブがあるためセンサーの値に制限をつ...
**ライントレース中の交差点検知について [#o07ffe95]
今回の課題では、ライトセンサーは1つしか使えない。~
これは、ライントレースをしながらそのセンサーで交差点を検...
そのために今回は、交差点が必ず直角であり、他の場所に直角...
つまり、交差点に侵入するとそこは直角であるため交差点でな...
しかしながら、ev3の反応が遅いためか他と比べてどうしても動...
また、判断に時間がががるということはその間機体は旋回し続...
交差点を右に曲がるときはなんともならないが、直進しなくて...
線を踏み越えるための動作は確実性の観点から大きく旋回し、...
この動きをしたあとに、そのままライントレースに復帰すると...
そのため、もう一度交差点であると誤検知してしまうことが多...
*プログラムについて [#n0984797]
以下のプログラムは''CC BY-SA 4.0''とします。ライセンスは[...
**自作関数について [#fb3fe95a]
学校の環境でev3をプログラミングすることの障害は大きく分け...
もう一つはWifiを経由することとev3の性能によるラグである。...
そのために用いたのが自作関数である。同一ディレクトリに存...
本来、別のimportの方法でなら、関数名を記述するだけでよい...
当然のことだがユーザー関数を使用することでひとつのファイ...
**li-S.py[#af5a8604]
&size(7){雛形となったペアのプログラム名がlt.pyであったた...
#!/usr/bin/env python3
from ev3dev.ev3 import * #パッケージのインポート
&size(7){lcdと音声ファイルを扱う時はなぜか*でなくてはな...
import ev3dev.ev3 as ev3
import time
import linetrace as move
import ball as catch
#A to D #ペアのプログラムと間違えないようにするためのメ...
arm = ev3.MediumMotor('outA') #アームの定義
mr = ev3.LargeMotor('outB') #motor right
ml = ev3.LargeMotor('outC') #motor left
us = ev3.UltrasonicSensor('in1') #超音波センサーの定義
cs = ev3.ColorSensor('in3') #5~80 #カラーセンサーの定義
x = 0 #検知した交差点のカウンタ
Itime = 1.6 #この時間以上カラーセンサーが黒であったら...
# A -> P(go_straight) x=1 -> Q(go_straight) x=2 -> ball_...
# -> Q(go_straight) x=3 -> R(turn_R) -> P(go_straight) -...
Sound.play('start.wav') #...
time.sleep(1)
move.start()
while True:
t0 = time.time() #...
move.line_follow() #...
elapsed_time = time.time() - t0 #...
print(elapsed_time, cs.value(),us.value() ) #...
if elapsed_time > Itime: #...
x += 1 #count of intersection #...
print('count = ', x) #...
mr.stop()
ml.stop() #...
ev3.Sound.play('kousatendesu.wav') #...
time.sleep(1.2) #...
if x == 1 or x == 2 or x == 3 or x == 5: #...
move.go_straight() #...
if x == 2: #...
while True:
us1 = us.value()
us2 = us.value()
us3 = us.value() #...
print(us1,us2,us3) #...
move.line_follow() #...
if (us1 + us2 + us3) / 3 < 70: #...
mr.stop()
ml.stop() #...
break #...
catch.ball_catch() #...
elif x == 6: #...
move.turn_left() #...
elif x == 7:
ev3.Sound.play('neraimasu.wav') #...
catch.shoot() #...
break #...
**ball.py [#cddcab06]
#!/usr/bin/env python3
import ev3dev.ev3 as ev3
import time
arm = ev3.MediumMotor('outA')
mr = ev3.LargeMotor('outB')
ml = ev3.LargeMotor('outC')
&size(7){各パッケージで自身が使うもののみを定義すればよ...
def ball_catch(): #ピンポン玉を捕まえる関数
arm.run_forever(speed_sp=-60)
time.sleep(4)
arm.stop()
def shoot(): #ピンポン玉をシュ...
cs = ev3.ColorSensor('in3') #カラーセンサーを...
gy = ev3.GyroSensor('in2') #ここでジャイロセ...
gy_old = gy.value() #使用したモードで...
while abs(gy.value() - gy_old) < 90: #値を確認するのが...
mr.run_forever(speed_sp=100)
ml.run_forever(speed_sp=-100)
mr.run_forever(speed_sp=-100) #機体を後退させ距...
ml.run_forever(speed_sp=-100)
time.sleep(1)
while cs.value() >= 40: #white
mr.run_forever(speed_sp=100)
ml.run_forever(speed_sp=100) #黒線を検知するま...
while cs.value() < 40:
mr.run_forever(speed_sp=0)
ml.run_forever(speed_sp=-60) #白になるまで左モ...
mr.stop()
ml.stop() #ここまでの一連の...
arm.run_forever(speed_sp=60) #アームを上げる
time.sleep(1)
arm.stop()
time.sleep(1)
mr.run_forever(speed_sp=-200) #機体を後退させア...
ml.run_forever(speed_sp=-200)
time.sleep(2)
mr.stop()
ml.stop()
arm.run_forever(speed_sp=-500) #時間がないので一...
time.sleep(0.5)
arm.stop()
mr.run_forever(speed_sp=150) #機体を前進するさ...
ml.run_forever(speed_sp=150)
time.sleep(3.2)
arm.run_forever(speed_sp=1050) #前進したままで全...
mr.stop()
ml.stop()
time.sleep(0.5)
arm.stop() #アームを止める
**linetrace.py [#fa484292]
#!/usr/bin/env python3
import ev3dev.ev3 as ev3
import time
mr = ev3.LargeMotor('outB')
ml = ev3.LargeMotor('outC')
cs = ev3.ColorSensor('in3') #5~80 #上に同じく
GoPw = -120 #GoPowerの略 本来は前進用の定数だった...
linepowerS = -150 #ライントレースのStrongの方のパワー
linepowerL= -60 #ライントレースのLowの方のパワー
target = 40
power = 100
KP = 4.0 #P制御用の定数郡 ジャイロセンサーを読...
#def line_follow():#with P #P制御と...
# while cs.value() >= 70: #今回カ...
# mr.run_forever(speed_sp=-GoPw)
# ml.run_forever(speed_sp=GoPw)
# t0 = time.time()
# while cs.value() >= 20 and cs.value() < 70: #20以上7...
# turn = KP*(cs.value() - target) #目標値...
# pwl = power - turn #左モー...
# pwr = power + turn #右モー...
# mr.run_forever(speed_sp=pwr)
# ml.run_forever(speed_sp=pwl) #それぞ...
# while cs.value() < 20: #70以上...
# mr.run_forever(speed_sp=Gopw)
# ml.run_forever(speed_sp=-GoPw*2)
def line_follow(): #採用版のライントレース ライン...
while cs.value() >= 50: #黒と判断した時
mr.run_forever(speed_sp=-linepowerS)
ml.run_forever(speed_sp=linepowerL)
t0 = time.time()
while cs.value() < 50: #白と判断した時
mr.run_forever(speed_sp=linepowerL)
ml.run_forever(speed_sp=-linepowerS)
#behave at intersection(normal:turn_right) #交差点での...
def go_straight(): #交差点直進...
mr.run_forever(speed_sp=-GoPw)
ml.run_forever(speed_sp=GoPw/3*2) #右モーター...
time.sleep(2.5)
ml.stop()
mr.stop()
while cs.value() >= 50: #右モーター...
mr.run_forever(speed_sp=200)
while cs.value() < 70: #Adjust direction #このままラ...
mr.run_forever(speed_sp=-100)
ml.run_forever(speed_sp=200)
while cs.value() >= 40: #向きを整え...
mr.run_forever(speed_sp=200)
ml.run_forever(speed_sp=-100)
#for last intersection
def turn_left(): #最後の交差点のみ左折する
mr.run_forever(speed_sp=200) #一定時間旋し、検知したく...
ml.run_forever(speed_sp=-150)
time.sleep(2)
while cs.value() >= 30: #黒いラインを見つけるまで...
mr.run_forever(speed_sp=200)
def start(): #スタートゾ...
mr.run_forever(speed_sp=220)#Get out of Zone A
ml.run_forever(speed_sp=220)
time.sleep(1)
mr.stop()
ml.stop() #停止する
time.sleep(1)
if cs.value() >= 50: #センサーの...
while cs.value() >= 50: #find line
mr.run_forever(speed_sp=200)
else:
while cs.value() < 50: #Adjust direction #黒であった...
mr.run_forever(speed_sp=-200)
ml.run_forever(speed_sp=200)
*結果 [#y948682f]
電圧によって調整する必要はあるが、ほぼ毎回成功させること...
しかしながら、ライントレースの方法の影響でタイムを短縮す...
~
~
~
~
~
~
~
~
*雑記 [#ud993dea]
課題に直接の関係はないものの、ev3を扱っている間にわかった...
**PID制御について [#m22273ff]
課題2がライントレースの課題だと知り、PID制御を実装しよう...
**LCDの使用とev3devのアップデートについて [#f1ba2178]
今回の課題から本格的にセンサーを使用するのでセンサーの値...
なかなか成功しなかったが、結局ev3devのバージョンが低いこ...
#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
import ev3dev.ev3 as ev3 #ここまでテンプレ
lcd = Screen() #Screen関数に名前を...
us = ev3.UltrasonicSensor('in1') #ポート1に超音波セ...
gy = ev3.GyroSensor('in2') #ポート2にジャイロ...
cs = ev3.ColorSensor('in3') #ポート3にカラーセ...
while True:
l = str(us.value()) #lに超音波センサーの値を...
m = str(gy.value()) #mにジャイロセンサーの値を代入
n = str(cs.value()) #nにカラーセンサーの値を...
x1 = str('Ulrta=',l) #lの値を前に`Ulrta=`をつ...
x2 = str('Gyro=',m) #上と同じような動作
x3 = str('Color=',n) #上と同じような動作
x = x1+x2+x3 #3つの文字列を統合する
print(x) #xの内容をPCに出力する
lcd.clear() #LCDをリセットする
lcd.draw.text((36,80),x) #lcdの座標の(36.80)に文字...
lcd.update()
sleep(1) #一秒待つ
**マルチスレッドについて [#sab79ba6]
特に使用する予定はなかったが使えると便利であるかと思った...
確かめてみると、ある程度は可能であるがstrコマンドのバグが...
#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep
#import ev3dev.font as fonts
import ev3dev.ev3 as ev3
import threading #threadingのパッケージを...
import time
lcd = Screen()
mr = ev3.LargeMotor('outB')
ml = ev3.LargeMotor('outC')
us = ev3.UltrasonicSensor('in1')
gy = ev3.GyroSensor('in2')
cs = ev3.ColorSensor('in3') #ここまでは今までとほぼ...
def sensors():
while True:
l = str(us.value())
m = str(gy.value())
n = str(cs.value())
print('Ulrta=',str(us.value()),' ','Gyro=',str(gy.va...
lcd.clear()
lcd.draw.text((10,80),l)
lcd.draw.text((50,80),m)
lcd.draw.text((100,80),n) #各値を多少ずらして横に...
lcd.update()
sleep(0.5)
def motor(): #単純なライントレースプログラム
while True:
if cs.value() => 40:
mr.run_forever(speed_sp=-500)
ml.run_forever(speed_sp=-800)
elif cs.value() < 40:
mr.run_forever(speed_sp=500)
ml.run_forever(speed_sp=-500)
x = threading.Thread(target=sensors) #関数sensorsをthrea...
y = threading.Thread(target=motor) #関数motorをthreadi...
x.start()
y.start() #それぞれを実行する
***結果 [#n27c3d25]
threading自体は成功するようだが、strコマンドについてのOS...
**ev3devアップデートにかかわる変更点について [#i8ba4c49]
実は私はev3devをアップデートした結果、モーターを特定角度...
発表の後の時間で確かめてみると、[[ここ:http://yakushi.shi...
その後、ev3dev内の使用可能な命令を調べると"duty_cycle_sp"...
**Wifiについて [#eabe08fb]
ev3にPCからアクセスする方法はUSB経由とBluetooth経由とWifi...
結構快適であるので、自分で持ち込むかもしくは借りたほうが...
**処理速度について [#m19bc65b]
ev3は高機能である代わりに処理速度がどうしても遅いようであ...
**センサーのモード変更や制御に使えるコマンドの調べ方につ...
ec3devはlinuxであるのでコマンドがそのまま使える。/sys/cla...
ページ名: