[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.42)







####1-0 . 特定のボタンを押したら~するプログラム 
```button00.py
#!/usr/bin/env python3
from ev3dev2.button import Button
from ev3dev2.sound import Sound

btn = Button()
snd = Sound()

while True:
    if btn.left:
        snd.beep()
```

**Point** : 左のボタンを押す度に音がなるプログラム

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

**Point** : ボタンの種類
・up : 上のボタン
・down : 下のボタン
・right : 右のボタン
・left : 左のボタン
・enter : 中央のボタン
・backspace : 左上のボタン












####1-1 . どれかのボタンを押したら~するプログラム 
```button01.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveSteering,SpeedPercent
from ev3dev2.button import Button
from ev3dev2.sound import Sound

steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)
btn = Button()
snd = Sound()

snd.beep()
while True:
    steering_drive.on(0,SpeedPercent(50))
    
    if btn.any():
        steering_drive.stop()
        exit()
```

**Point** : どれかのボタンを押したら走行を停止して、プログラムを停止するプログラム

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















####1-2 . ボタンを押すか否かで処理内容が異なるプログラム①
```button02.py
#!/usr/bin/env python3
from ev3dev2.button import Button
from ev3dev2.sound import Sound
from ev3dev2.display import Display

btn = Button()
snd = Sound()
dsp = Display()

while True:
    dsp.update()
    
    if btn.any():
        dsp.clear()
        snd.beep()
    else:
        dsp.text_pixels('push the button!',True,0,52,font = 'charB' + '18')
```

**Point** : どれかのボタンを押したら音がなり、押さなければボタンを押してくださいという文が画面に表示される。

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

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

**Point** : 
clear()
画面表示をリセットする
update()
未出力の表示を画面に反映する。
この関数がないと、画面への表示は一切できない。


**Point** : text_pixels(text, clear_screen=True, x=0, y=0, text_color=’black’, font=None)
pixel単位の座標(x, y) からテキストが開始される。
ev3の画面は、178x128 pixelsで、
• 画面の左上端が(0, 0)
• 画面の中央が(89, 64)
※y座標は画面下に行くにつれて数字が大きくなります。

**Point** : font↓
![fonts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/d8971d06-4948-7d21-077c-2d814f66a0ed.png)





####1-3 . ボタンを押すか否かで処理内容が異なるプログラム②
```button03.py
#!/usr/bin/env python3
from ev3dev2.button import Button
from ev3dev2.sound import Sound
from ev3dev2.display import Display

btn = Button()
snd = Sound()
dsp = Display()

while True:
    dsp.update()
    
    if btn.any():
        dsp.clear()
        button_name = btn.buttons_pressed
        dsp.text_pixels(str(button_name) + ' is pressed!',True,0,52,font = 'charB' + '10')
        snd.beep()
    else:
        dsp.text_pixels('push the button!',True,0,52,font = 'charB' + '18')
```

**Point** : どれかのボタンを押したら音がなり押されたボタンが表示され、押さなければボタンを押してくださいという文が画面に表示される。

**Point** : buttons_pressed
押されているボタンの名前のリストを返す

**Point** : str()
引数(この場合はリスト)を文字にして返す

![ev3dev-2020-06-18-10-55-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/6ecbb180-692d-422d-0416-b622dd03f6f1.png)

![ev3dev-2020-06-18-10-51-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/022659b0-e654-2ca1-6d0e-447f1a010fcb.png)
















####1-4 . ボタンを押していない間は~するプログラム
```button04.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveSteering,SpeedPercent
from ev3dev2.button import Button
from ev3dev2.sound import Sound

steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)
btn = Button()
snd = Sound()

snd.beep()
while not btn.any():
    steering_drive.on(100,SpeedPercent(40))
snd.beep()
exit()   
```

**Point** : どれかのボタンを押すまでその場で回転し続けるプログラム。

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

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

**Point** : exit()
プログラムの終了







####1-5 . ボタンを[押す/離す/バンプする]まで待機するプログラム
```button05.py
#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveSteering,SpeedPercent
from ev3dev2.button import Button
from ev3dev2.sound import Sound

steering_drive = MoveSteering(OUTPUT_A,OUTPUT_B)
btn = Button()
snd = Sound()

btn.wait_for_bump('enter')
steering_drive.on_for_degrees(0,SpeedPercent(60),1080)
snd.beep()
exit()   
```

**Point** : 中央のボタンを押すまで待機して押されたら走るプログラム。

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


**Point** : exit()
プログラムの終了





####1-6 . ボタンが同時に押されるまで待機するプログラム
```button06.py
#!/usr/bin/env python3
from ev3dev2.button import Button
from ev3dev2.sound import Sound

btn = Button()
snd = Sound()

while True:
    btn.wait_for_pressed(['right','left','down'])
    snd.beep()

    if btn.up:
        exit()
  
```

**Point** : 右と左のボタンが両方同時に押されたら音が鳴るプログラム。
もし、上のボタンが押されたらプログラムを終了する。

**Point** : 
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)
→ボタンがバンプ(押して離す)されるまで待機する。
押してから離すまでの時間制限を第一引数で設けることができる

**Point** : 
同時に押したいボタンをリストの要素にすれば良いので、
3つ同時に押すまで待機するにする場合
`btn.wait_for_pressed['left','right','down']`








#最後に

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

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