[ev3dev×Python]   タッチセンサ

この記事はPythonでev3を操作してみたい人のための記事です。
今回はタッチセンサを使っていろいろな操作をしていきたいと思います。


#目次
0 . 用意するもの
1 . タッチセンサのプログラム





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



#1.タッチセンサのプログラム(資料p.33)







####1-0 . タッチセンサを押したら~するプログラム 
```touchsensor00.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1,INPUT_2
from ev3dev2.sound import Sound
from ev3dev2.led import Leds

#インスタンスの生成
#オブジェクトを定義する
ts_1 = TouchSensor(INPUT_1)
ts_2 = TouchSensor(INPUT_2)
snd = Sound()
led = Leds()

#無限ループ
while True:
    #もしタッチセンサ(1)が押されたら
    if ts_1.is_pressed:
        #音を鳴らす
        snd.beep()
    #もしタッチセンサ(2)が押されたら
    if ts_2.is_pressed:
        #ライトを黄色に光らせる
        led.set_color("LEFT","YELLOW")
        led.set_color("RIGHT","YELLOW")
```

**Point** : 
タッチセンサ(ポート1)を押す度に音が鳴り,タッチセンサ(ポート2)を押す度にライトが黄色に光るプログラム

**Point** : 
`if 条件:
　　処理1`
**もし条件が真なら、処理1をする**というプログラム

**Point** : is_pressed
A boolean indicating whether the current touch sensor is being pressed.


**Point** : スクラッチで例えるとこんな仕組み↓
![スクリーンショット 2020-06-19 10.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/b0ee19f4-4abd-7244-abe0-7b34f1db1fee.png)




####1-1 . "もし〜なら、でなければ" というプログラム 
```touchsensor01.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.motor import MediumMotor,OUTPUT_A
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1

#インスタンスの生成
#オブジェクトを定義する
m_A = MediumMotor(OUTPUT_A)
ts_1 = TouchSensor(INPUT_1)

#無限ループ
while True:
    #もしタッチセンサ(1)が押されたら
    if ts_1.is_pressed:
        #Mモータを回転させる
        m_A.on(100)
    #でなければ
    else:
        #Mモータを止める
        m_A.stop()
```

**Point** : 
タッチセンサ(ポート1)を押すとMモータが回転し、離すと止まるプログラム

**Point** : 
`if 条件:
　　処理1
else:
　　処理2`

**もし条件が真なら、処理1をする,
偽なら処理2をする**
というプログラム

**Point** : スクラッチで例えるとこんな仕組み↓
![スクリーンショット 2020-06-19 10.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/2ceb60b2-fdc1-a9d0-408f-a692461e6195.png)









####1-2 . ボタンを押していない間は~するプログラム
```touchsensor02.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveSteering,SpeedPercent
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1
from ev3dev2.sound import Sound

#インスタンスの生成
#オブジェクトを定義する
steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)
ts_1 = TouchSensor(INPUT_1)
snd = Sound()

#無限ループ
while True:
    #タッチセンサ(1)が押されていない間は
    while not ts_1.is_pressed:
        #まっすぐ進む
        steering_drive.on(0,SpeedPercent(40))
    #タッチセンサ(1)が押されたら
    #音を鳴らす
    snd.beep()
    #1秒間まっすぐ後ろに下がる
    steering_drive.on_for_seconds(0,SpeedPercent(-10),1)  
    #2秒間その場でターンして方向転換する
    steering_drive.on_for_seconds(100,SpeedPercent(40),2)  
```

**Point** : 直進して、タッチセンサが押されたら音がなって、少し後ろに下がってから2秒間方向転換することを繰り返すプログラム。

**Point** : 
`while not ~:
　　処理1`

**~でない間は、処理1を継続する**
というプログラム








####1-3 . 往復運動と長押しに関するプログラム

```touchsensor03.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.motor import OUTPUT_A,MediumMotor
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1

#インスタンスの生成
#オブジェクトを定義する
m_A = MediumMotor(OUTPUT_A)
ts_1 = TouchSensor(INPUT_1)

#無限ループ
while True:
    #タッチセンサ(1)がバンプされるまで待機する
    ts_1.wait_for_bump()
    #Mモータを回転させる
    M_A.on(50)
    #タッチセンサ(1)がバンプされるまで待機する
    ts_1.wait_for_bump()
    #Mモータを逆回転させる
    M_A.on(-50)

    #もしタッチセンサ(1)を2秒以上長押ししたら
    if not ts_1.wait_for_bump(2000):
        #プログラムを終了する
        exit()
    
```

**Point** : タッチセンサをバンプしたら回転方向が変わるプログラム。
2秒以上長押ししたらプログラムを終了する。

wait_for_pressed(timeout_ms=None, sleep_ms=10)
→押されるまで待機する。
wait_for_released(timeout_ms=None, sleep_ms=10)
→離されるまで待機する。
wait_for_bump(timeout_ms=None, sleep_ms=10)
→ボタンがバンプ(押して離す)されるまで待機する。
押してから離すまでの時間制限を第1引数で設けることができる


**Point** : if not ts_1.wait_for_bump(2000):　について。
if not タッチセンサを押してから2秒以内に離す:

 = if タッチセンサを押してから2秒以内に離さない

 = if タッチセンサを2秒以上長押ししたら



####1-4 . タッチセンサが同時に押されたら~するプログラム
```touchsensor04.py
#!/usr/bin/env python3


#必要なもの(材料)をそろえる
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1,INPUT_2
from ev3dev2.sound import Sound

#インスタンスの生成
#オブジェクトを定義する
ts_1 = TouchSensor(INPUT_1)
ts_2 = TouchSensor(INPUT_2)
snd = Sound()

while True:
    if ts_1.is_pressed and ts_2.is_pressed:
        snd.beep()
```

**Point** : タッチセンサが両方同時に押されたら音が鳴るプログラム。


**Point** : if文の条件式について

◯条件1が真 **かつ** 条件2が真のとき、処理を行う

`if 条件1 and 条件2:
　　処理1`

◯条件1が真 **または** 条件2が真のとき、処理を行う

`if 条件1 or 条件2:
　　処理1`

◯条件1が真 **ではないとき**、処理を行う

`if not 条件1:
　　処理1`    

**Point** : スクラッチで例えるとこんな仕組み↓
![スクリーンショット 2020-06-19 16.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/3dc01b24-6be9-7060-df08-6b0aee3f3fb3.png)




####1-5 . タッチセンサ2つでラジコン操作するプログラム①
```touchsensor05.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,LargeMotor
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1,INPUT_2

#インスタンスの生成
#オブジェクトを定義する
l_A = LargeMotor(OUTPUT_A)
l_B = LargeMotor(OUTPUT_B)
ts_1 = TouchSensor(INPUT_1)
ts_2 = TouchSensor(INPUT_2)

#無限ループ
while True:
    #もしタッチセンサ(1)が押されたら
    if ts_1.is_pressed:
        #Lモータ(A)を回転させる
        l_A.on(50)
    #でなければ
    else:
        #Lモータ(A)を止める
        l_A.stop()
    #もしタッチセンサ(1)が押されたら
    if ts_2.is_pressed:
        #Lモータ(B)を回転させる
        l_B.on(50)
    #でなければ
    else:
        #Lモータ(B)を止める
        l_B.stop()
```

**Point** : タッチセンサ(1)でLモーター(A)を動かし、タッチセンサ(2)でLモーター(B)を動かすプログラム

**Point** : スクラッチで例えるとこんな仕組み↓
![スクリーンショット 2020-06-19 16.59.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/a82505ec-dc88-32e9-81b5-093bc5bc9ded.png)





####1-6 . タッチセンサ2つでラジコン操作するプログラム②
```touchsensor06.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1,INPUT_2

#インスタンスの生成
#オブジェクトを定義する
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
ts_1 = TouchSensor(INPUT_1)
ts_2 = TouchSensor(INPUT_2)

#無限ループ
while True:
    #もしタッチセンサ(1)が押されたら
    if ts_1.is_pressed:
        #直進する
        tank_drive.on(50,50)
    #でなければ
    else:
        #タッチセンサ(2)のみ押されたら
        if ts_2.is_pressed:
            #後ろに進む
            tank_drive.on(-50,-50)
        #タッチセンサがどちらも押されなかったら
        else:
            #止まる
            tank_drive.stop()
```

**Point** : タッチセンサ(1)で前進、タッチセンサ(2)で後進するプログラム。

**Point** : スクラッチで例えるとこんな仕組み↓
![スクリーンショット 2020-06-19 16.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/759bf688-9fe7-14dc-dc90-d05e30c06429.png)






####1-7 . タッチセンサ2つでラジコン操作するプログラム③
```touchsensor07.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.sensor import INPUT_1,INPUT_2

#インスタンスの生成
#オブジェクトを定義する
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
ts_1 = TouchSensor(INPUT_1)
ts_2 = TouchSensor(INPUT_2)

while True:
    if ts_1.is_pressed:
        if ts_2.is_pressed:
            tank_drive.on(100,100)
        else:
            tank_drive.on(40,100)
    else:
        if ts_2.is_pressed:
            tank_drive.on(100,40)
        else:
            tank_drive.stop()
```

**Point** : 
タッチセンサを両方押す:前進
タッチセンサ1のみ押す:左前方へ進む
タッチセンサ2のみ押す:右前方へ進む
タッチセンサを両方押さない:停止

**Point** : 片方のタッチセンサのみ押したときのタンクの曲がる度合いを調整出来る。

**Point** : スクラッチで例えるとこんな仕組み↓
![スクリーンショット 2020-06-19 16.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/3e1b1d05-9085-a468-65cd-f475ba33d46a.png)




####1-8 . 手動と自動の切り替えプログラム
```touchsensor08.py
#!/usr/bin/env python3

#必要なもの(材料)をそろえる
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.sensor.lego import TouchSensor,UltrasonicSensor
from ev3dev2.sensor import INPUT_1,INPUT_2,INPUT_3

#インスタンスの生成
#オブジェクトを定義する
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
us = UltrasonicSensor(INPUT_3)
ts_1 = TouchSensor(INPUT_1)
ts_2 = TouchSensor(INPUT_2)

#無限ループ
while True:
    #障害物との距離が20cmより大きい間は繰り返す
    while us.distance_centimeters > 20:
        #もしタッチセンサ(1)が押されたら
        if ts_1.is_pressed:
            #もしタッチセンサ(2)が押されたら
            if ts_2.is_pressed:
                tank_drive.on(100,100)
            #もしタッチセンサ(2)が押されなかったら
            else:
                tank_drive.on(40,100)
        #もしタッチセンサ(1)が押されなかったら
        else:
            #もしタッチセンサ(2)が押されたら
            if ts_2.is_pressed:
                tank_drive.on(100,40)
            #もしタッチセンサ(2)が押されなかったら
            else:
                tank_drive.stop()
    #障害物との距離が30cmより小さい間は繰り返す
    while us.distance_centimeters < 30:
        tank_drive.on(-80,-80)
```

**Point** : 
障害物が20cmより近くにない時は、手動でラジコン操作が出来る。
だが、障害物が20cmより近くにある場合は、障害物との距離が30cmより遠くになるまで自動で後ろに逃げて緊急回避するプログラム。

**Point** : スクラッチで例えるとこんな仕組み(内容は同じ)↓
![スクリーンショット 2020-06-19 16.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/83a2c949-9f63-eae1-57c2-b8b382ddc701.png)

**Point** : **〜まで繰り返す**　と　**〜の間繰り返す**

**〜まで繰り返す** : 条件が真でなくなるまで繰り返す
**〜の間繰り返す** : 条件が真の間は繰り返す















#最後に

読んで頂きありがとうございました！！
次回はカラーセンサについて書いていきたいと思います！

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