今年もよろしくお願いします.
こんな記事見つけて唐突にやってみようと思ったのでチャレンジ.
ハードウェア
配線
今回はGPIOは25番使用してます.
配線がちゃんとしてるかチェック.
GPIOポートの使用開始を宣言.
$ echo 25 > /sys/class/gpio/export
$ echo in > /sys/class/gpio/gpio25/direction
GPIOポートの値を取得しましょ.
$ cat /sys/class/gpio/gpio25/value
スイッチ押してない時コマンド実行で0,押しながら実行で1が出たらOK.
今回音を鳴らすのでスピーカー準備します.
前の自分の記事参考にして設定しました.
調べたら使ってるUSBスピーカーが廃盤になってるっぽいですね.
こちら後継機っぽいですが動作どうなんでしょう...
確実な方法はイヤホンジャックにスピーカーですね.
プログラム
ただ音鳴らすのもひねりがないので音声流します.
使うソフトはAquesTalkPiというRaspberryPi用ゆっくり.
公式からDLします.
AquesTalk Pi - Raspberry Pi用の音声合成
詳しい使い方はこちらが非常に参考になりました.
とりあえず音を出してみますか.
解答したファイル内にAquesTalkPiというファイルがあるので
実行プログラムのあるフォルダ内に設置しておきます.
main.py
#coding:utf-8
import os
import sys
#メイン処理
if __name__ == "__main__":
try:
message = "hello"
os.system('./AquesTalkPi' + message + ' | aplay")
except Exception , e:
print e , "error"
これで実行したらゆっくりボイスでへろーと喋ってくれるはず.
$ python main.py
再生中 WAVE 'stdin' : Signed 16 bit Little Endian, レート 8000Hz, モノラル
mesageを変えれば喋る言葉変えられます.
ストップスイッチ
スイッチ押したら音声が止まるようにしたいっすね.
元記事だと再生用と停止用の2つのプログラム作っていましたが1つでも行けるんじゃないかと思ってチャレンジ.
とりあえずこんな感じでどーよと.
20回再生するうちにスイッチ押されたら終了するイメージ.
main.py
#coding:utf-8
import os
import sys#メイン処理
if __name__ == "__main__":
try:
message = "hello"
sum = 0os.system('echo 25 > /sys/class/gpio/export')
os.system('echo in > /sys/class/gpio/gpio25/direction')for num in range(1,20):
os.system('./AquesTalkPi' + message + ' | aplay")
sum += num
if os.system('cat /sys/class/gpio/gpio25/value') == 1 :
break
except Exception , e:
print e , "error"
実行したけどうまく止まってくれないっす.
gpioポートのvalueの値を取得できてないっぽいですね.
ここで小1時間悩んで「これPythonじゃなくてshellやんけ」という結論に.
PythonにGPIOポートの値取得するものあるのになぜかPyhon内にshell記述してました.
PythonでGPIOポートの値取得できるので書き直します.
配線
正しい配線はこちら
見にくいかもしれませんが24番ポートを使ってます.
ソース
Python使いました.
#coding:utf-8
import os
import sysimport RPi.GPIO as GPIO
from time import sleepGPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.OUT)
GPIO.setup(24,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)#メイン処理
if __name__ == "__main__":try:
message = "hello"#USBスピーカーの設定 必要に応じて
#os.system('lsusb')
#os.system('sudo alsa unload')
#os.system('sudo modprobe snd_usb_audio')while GPIO.input(24) == 0 :
os.system('./Voice/aquestalkpi/AquesTalkPi '+ message + ' | aplay')else :
print "end"sleep(0.01)
except KeybordInterrupt:
passGPIO.cleanup()
GPIOポート使うので sudo つけて実行.
うまくいったっぽいですぞ.
Pythonで書いたらスッキリした感.
他のやつもPythonで実装してみよ.
こちらの本がGPIO周りで非常に参考にさせていただきました.
[amazonjs asin="4062578913" locale="JP" title="Raspberry Piで学ぶ電子工作 超小型コンピュータで電子回路を制御する (ブルーバックス)"]
コメント