[ev3dev×Python]   表示、音声、LEDの制御

この記事はPythonでev3を操作してみたい人のための記事です。
今回はインテリジェントブロックを使ってテキストや数値を表示したり、音声を再生したり、LEDを制御していきたいと思います。


#目次
0 . 用意するもの
1 . 表示
2 . 音声
3 . LED
4 . プログラム例



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



#1.表示

####1-0 . 表示の基礎プログラム ① 
```display00.py
#!/usr/bin/env python3
from time import sleep

print("HELLO WORLD")
sleep(3)
```

**Point** : インテリジェントブロックに３秒間小さな文字を表示するプログラム。
文字の大きさは小さいが一番シンプルなプログラム。

**Point** : print()
文字列、数値および変数の値を出力する

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

**Point** : MINDSTORMSでプログラムすると下のようになります。
![スクリーンショット 2020-06-16 18.28.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/28f2a620-9c00-b003-8530-da608c5f0bf4.png)

####1-1 . 表示の基礎プログラム ② (資料p.52)
```display01.py
#!/usr/bin/env python3
from ev3dev2.display import Display 
from time import sleep

#インスタンスの生成
dsp = Display()

#無限ループ
while True:
    #文字を表示する
    dsp.update()
    dsp.text_pixels('HELLO WORLD',True,0,52,font = 'courB' + '24')

```

**Point** : インテリジェントブロックに文字をずっと表示するプログラム。


**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** : update()
スクリーンへの変更を反映するための関数
この関数がないと画面には何も表示されない

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




#2.音声

####2-0 . 音声の基礎プログラム (資料p.46)
```sound00.py
#!/usr/bin/env python3
from ev3dev2.sound import Sound
spkr = Sound()

#インスタンスの生成
spkr.beep()

#文字を音声に変換する
spkr.speak('lets start STAR WARS music')

#音楽を演奏する
spkr.play_song((
('D4', 'e3'),
('D4', 'e3'),
('D4', 'e3'),
('G4', 'h'),
('D5', 'h')
))
```

**Point** : ビーという音を鳴らした後に、言葉を喋って、メロディを演奏するプログラム

**Point** : play_song('音階','音価')

音階↓
![DqTLAYFV4AAsKFO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/83fb4c8f-252b-701e-d3a7-b76381cb6f45.jpeg)

音価(音の長さ)↓
![184978921.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/53155351-c12a-36fb-e320-36671fbff9ff.jpeg)







#3.LED

####3-0 . LEDの基礎プログラム(資料p.43)
```led00.py
#!/usr/bin/env python3
from ev3dev2.led import Leds
from ev3dev2.sound import Sound
from time import sleep

#インスタンスの生成
led = Leds()
snd = Sound()

#3回繰り返す
for i in range(3):
    #琥珀色にLEDを光らせる
    led.set_color("LEFT","AMBER")
    led.set_color("RIGHT","AMBER")
    sleep(1)
    #LEDを消す
    led.all_off()
    sleep(1)
    snd.beep()
```

**Point** : set_color(group, color, pct=1)
　**group**
　　• LEFT
　　• RIGHT

　**color**
　　• BLACK
　　• RED
　　• GREEN
　　• AMBER
　　• ORANGE
　　• YELLOW









#4.プログラム例

####4-0 . ジャイロセンサーの値を表示し続けるプログラム
```example00.py
#!/usr/bin/env python3
from ev3dev2.display import Display
from ev3dev2.sensor.lego import GyroSensor
from time import sleep

#インスタンスの生成
dsp = Display()
gy = GyroSensor()

while True:
    dsp.update()
    #ループの中で変数numを定義することで常に値を更新する
    #オブジェクトgyが持つフィールド(変数)angleにドットを使ってアクセスする
    num = gy.angle
    #str()関数を使って、float型からstring型に型を変換して表示する
    # +記号を使って表示する時に、単位degree(角度)も表示できるようにする
    dsp.text_pixels(str(num) + ' degrees',True,0,52,font = 'helvB' + '24')
    #0.5秒間値を表示する(=0.5おきに値を更新する)
    sleep(0.5)
```

**Point** : ジャイロセンサーに関しては資料のp.36をみてください！

**Point** : str()は、引数を文字に変換する関数


####4-1 . タッチセンサを押して色を変えるプログラム
```example01.py
#!/usr/bin/env python3
from ev3dev2.sensor import INPUT_1
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.led import Leds

#インスタンスの生成
ts = TouchSensor(INPUT_1)
leds = Leds()

#LEDの色を変えるためにタッチセンサおしてくださいと表示する
print("Press the touch sensor to change the LED color!")
while True:
    #タッチセンサが押されたら
    if ts.is_pressed:
        #緑に光らせる
        leds.set_color("LEFT", "GREEN")
        leds.set_color("RIGHT", "GREEN")
    #タッチセンサが押されなければ
    else:
        #赤に光らせる
        leds.set_color("LEFT", "RED")
        leds.set_color("RIGHT", "RED")
```

**Point** : タッチセンサが押されたら緑色にして、押されていない時は赤色にするプログラム

**Point** : タッチセンサに関しては資料のp.33をみてください！

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

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

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

**Point** : INPUT_1~4
センサは何かしらの値を**取得**するために使い、
モーターは**出力**するために使うので、
それぞれポートは INPUT/OUTPUTで表記する。

**Point** : MINDSTORMSでプログラムすると下のようになります。
![スクリーンショット 2020-06-17 8.39.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/6d3121dd-bba2-871e-4fad-05af539b00a8.png)





####4-2 . リストを使って色を変えていくプログラム
```example02.py
#!/usr/bin/env python3
from ev3dev2.led import Leds
from ev3dev2.sound import Sound
from time import sleep

#インスタンスの生成
led = Leds()
snd = Sound()
#事前に色のリストを準備する
color_list = ["BLACK","RED","GREEN","AMBER","ORANGE","YELLOW"]

#リストから要素を1つずつ取り出していく
for i in color_list:
    print(i)
    #リストの先頭の色から光らせていく
    led.set_color("LEFT",i)
    led.set_color("RIGHT",i)
    sleep(1)
    led.all_off()
    sleep(1)
    snd.beep()
```

**Point** : リストの先頭から順番に文字を取り出して、それをLEDの色にする

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


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





####4-3 . リストとランダム関数を組み合わせて色を変えていくプログラム
```example03.py
#!/usr/bin/env python3
from ev3dev2.led import Leds
from ev3dev2.sound import Sound
from time import sleep
import random

#インスタンスの生成
led = Leds()
snd = Sound()
#リストを作成
color_list = ["BLACK","RED","GREEN","AMBER","ORANGE","YELLOW"]

#リストから要素を1つずつ取り出していく
for i in color_list:
    print(c)
    #randomモジュールが持つ関数choice()を使う
    #リストの中からランダムに要素を選んで変数cに代入する
    c = random.choice(color_list)
    led.set_color("LEFT",c)
    led.set_color("RIGHT",c)
    sleep(1)
    led.all_off()
    sleep(1)
    snd.beep()
```

**Point** : リストからランダムに文字を取り出して、LEDの色にすることをリストの要素の数だけ繰り返す

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


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







#最後に

読んで頂きありがとうございました！！
次回はインテリジェントブロックボタンについて書いていきたいと思います！

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