[ev3dev×Python]   複数モーターの制御

この記事はPythonでev3を操作してみたい人のための記事です。
今回は複数のモーターを制御してタンク(クルマ)を走らせていきたいと思います。


#目次
0 . 用意するもの
1 . タンク
2 . ステアリング
3 . プログラム例
4 . プログラムの実行について


#0.用意するもの
◯ ev3(タンク)
◯ パソコン(VSCode)
◯ bluetooth
◯ microSD
◯ [資料](https://buildmedia.readthedocs.org/media/pdf/python-ev3dev/latest/python-ev3dev.pdf)(これをみながら進めていくのがオススメです。)



#1.タンク

####1-0 . タンクの基礎プログラム(資料p.26)
```tank00.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_B, OUTPUT_C, MoveTank

tank_drive = MoveTank(OUTPUT_B,OUTPUT_C)

tank_drive.on_for_rotations(80,-30,6)
```

**Point** : class ev3dev2.motor.MoveTank(left_motor_port, right_motor_port, desc=None, motor_class=<class ’ev3dev2.motor.LargeMotor’>)

**Point** : それぞれのモーターのスピードを入力して進行方向を決定する。
※スピードの範囲は-100から100まで。


**Point** : MINDSTORMSでプログラムすると下のようになります。
![スクリーンショット 2020-06-16 10.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/f67b72d4-15b7-2f7c-93de-53b5a2cf6e0e.png)

#2.ステアリング

####2-0 . ステアリングの基礎プログラム(資料p.29)
```steering00.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A, OUTPUT_B, MoveSteering, SpeedPercent

steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)

steering_drive.on_for_rotations(-10,SpeedPercent(75),5)
```

**Point** : class ev3dev2.motor.MoveSteering(left_motor_port, right_motor_port, desc=None, motor_class=<class ’ev3dev2.motor.LargeMotor’>)

**Point** : タンク(クルマ)専用。ハンドル操作に近いイメージ。

**Point** : 曲がる度合いを直接1つの数値で決定できる。

**Point** : **ステアリング数値**

0 < ステアリング数値 <= 100 : 右側にターン。100でスピン(その場で右回転)。
ステアリング数値 = 0 : 直進
-100 <= ステアリング数値 < 0: 左側にターン。-100でスピン(その場で左回転)

**Point** : MINDSTORMSでプログラムすると下のようになります。
![スクリーンショット 2020-06-16 9.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/b438c176-d956-fd4d-4a6e-1f5279fbdcf0.png)







#3.プログラム例

####3-0 . ステアリング数値を10ずつ上昇させていくプログラム
```example00.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveSteering,SpeedPercent

steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)

for i in range(0,101,10):
    steering_drive.on_for_seconds(i,SpeedPercent(75),1)
steering_drive.stop()
```

**Point** : 0 <= i < 101 の範囲内で i を 10ずつ増加させる
つまり、
1回目のループ( i = 0 ) : クルマは直進
2回目のループ( i = 10 ) : クルマは少し右に曲がる
　:
11回目のループ( i = 100 ) : クルマはその場で右回転する。

**Point** : forループについては[こちらの記事](https://udemy.benesse.co.jp/development/web/python-for.html)がわかりやすいです。


####3-1 . 進行方向をランダムに決めるプログラム
```example01.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveSteering,SpeedPercent
import random

steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)

for i in range(10):
    num = random.randint(-100,100)
    print(num)
    steering_drive.on_for_seconds(num,SpeedPercent(75),2)
steering_drive.stop()
```

**Point** : 進行方向を2秒おきにランダムに決める

**Point** : random.randint(min,max)
指定した範囲(min ~ max)の中から、ランダムにint値(整数値)を取り出す。

**Point** : ランダム関数については[こちらの記事](https://techacademy.jp/magazine/15821)がわかりやすいです。







####3-2 . リストを使ってモーターの回転スピードを変えていくプログラム
```example02.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from time import sleep

tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
speed_list = [-90,30,-10,80,10]

for i in speed_list:
    sleep(1)
    tank_drive.on_for_rotations(i,i,2)
tank_drive.stop()
```

**Point** : リストの先頭から順番に数字を取り出して、それを各々のモーターのスピードにする

**Point** : sleep()
引数で指定した秒数待機するための関数


**Point** : リストについては[こちらの記事](https://www.atmarkit.co.jp/ait/articles/1906/11/news007.html)がわかりやすいです。





####3-3 . リストとランダム関数を組み合わせてモーターの回転スピードを変えていくプログラム
```example03.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from time import sleep
import random

tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
speed_list = [-90,30,-10,80,0]

for i in speed_list:
    sleep(1)
    num = random.choice(speed_list)
    tank_drive.on_for_rotations(num,0,2)
tank_drive.stop()
```

**Point** : リストからランダムに数字を取り出して、それを片方のモーター(ポートA)のスピードにすることを8回繰り返す

**Point** : random.choice()
リストや文字列などの複数の要素を持つオブジェクトを引数にもち、その中からランダムに1つの要素を返す(出力する)


**Point** : ランダムについては[こちらの記事](https://www.sejuku.net/blog/20915)もわかりやすいです。







#4.プログラムの実行について

もしやり方を忘れてしまったら、[以前書いた記事](https://qiita.com/masterkeaton12/items/938457911b0f3f25e161#4%E6%96%B0%E8%A6%8F%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E4%BD%9C%E6%88%90)を参照してください！




#最後に

読んで頂きありがとうございました！！
次回は表示、音、ライトについて書いていきたいと思います！

より良い記事にしていきたいので
　◯こうした方がわかりやすい
　◯ここがわかりにくい
　◯ここが間違っている
　◯ここをもっと説明して欲しい
などの御意見、御指摘のほどよろしくお願い致します。