本日は、Google AIY Voice Kitが付いたラズベリーパイを使って、音声認識でフルカラーLEDを光らせたお話です。
日常の合間をぬって、細々とやっている電子工作。毎度のことですが、私はクジラ飛行机さんの「やさしくはじめるラズベリーパイ」の本を教科書に日々取り組んでいます。
今回は、当該書の第3-7章「フルカラーLEDを使ってみよう」に挑戦です。
一部を改変して、Google AIY Voice Kitのスピーカーにも使用したいので、Voice Kitのダンボールがくっついたラズパイにブレッドボード一式を接続してみました。
配線してみる
今回使用した材料は以下のとおり。
- ブレッドボード 1つ
- フルカラーLEDライト 1つ
- LED光拡散キャップ 1つ
- 330Ωのカーボン抵抗器 3つ
- ジャンパワイヤ オスーオス 4つ
- ジャンパワイヤ メスーオス 3つ
これらは以前、秋月電子通商さんで購入したものです(^-^)。
Voice Hatの穴にワイヤを入れるため、メスーオスのメスにオスーオスのワイヤを差し込んで延長しています。
今回は、Voice Hatの基盤のServo0-2の左端の穴(ポート番号は26番、6番、13番)を、GNDにはServo0の右端の穴を使用しました。下の図の黄色いところですね。
毎度ながら、このVoice HatのServoって穴にワイヤの先を入れるのが何げに面倒です。油断すると、すぐにスポっと抜けてしまいます。ムギャーとなること何度かで、なんとかつなげました(^_^;)。
今回のLEDは、フルカラーLEDといって、赤、青、緑のLEDが一緒になっていて、切り替えることで複数の色が出るようになっています。水泳帽みたいなLED光拡散キャップというのも付けています。
まずは音声認識なしで
最初に、「やさしくはじめるラズベリーパイ」のP.108-109のプログラムを写経して実行してみます。
今回は、エラーなくプログラムを実行できました。だけど光らない…。
また、Voice Hatの穴からワイヤが抜けてるんだろうなぁと思いながら、ワイヤを軽く触ると点きました。接触の問題ですね。
その後も、色によっては付いたり付かなかったり、ワイヤを軽く触って、ライトがきちんと点灯するよう調節しました。普通にGPIOにワイヤを差し込む方が数倍楽です。でも、音声認識をやりたいからガマン…。
プログラムを改変するぞ
さて、配線もできて、プログラムを実行して、無事、ライトが点くのを確認したら、音声認識をやっていきます。
ベースになるのは、AIYスピーカー付属の冊子の57ページのプログラムです。Google Cloud Speechへの登録と日本語化ができているのが前提です。
import部分
というわけで、AIYスピーカー付属の冊子の57ページに書かれているプログラムのimportのところに2行を付け足します。
import aiy.audio import aiy.cloudspeech import aiy.voicehat import RPi.GPIO as GPIO import sys, time # Sleepを利用する aiy.i18n.set_language_code('ja-JP')
def mainの部分
そして、def main()のところに、日本語を足してみます。この箇所は日本語を書かなくても動くのですが、書いておいた方が認識力が上がる気がします。
def main(): recognizer = aiy.cloudspeech.get_recognizer() recognizer.expect_phrase('赤') recognizer.expect_phrase('緑') recognizer.expect_phrase('青') recognizer.expect_phrase('チカチカ') recognizer.expect_phrase('電気をつけて') recognizer.expect_phrase('電気を消して') button = aiy.voicehat.get_button()
今回は、ボタンを押して、「赤」、「青」、「緑」と色の名前を言うと、その色が点灯し、「チカチカ」で3色が交互に点灯、「電気をつけて」で白色が点灯、「電気を消して」でライトが消灯、という形を想定しています。
ポート番号を指定する箇所は、「やさしくはじめるラズベリーパイ」のプログラムを基に大幅に追加してこんな感じに。
button = aiy.voicehat.get_button() aiy.audio.get_recorder().start() # ポート番号を指定 PORT_R = 26 PORT_G = 6 PORT_B = 13 # GPIOポートの初期化 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) ports = [PORT_R, PORT_G, PORT_B] for port in ports: GPIO.setup(port, GPIO.OUT) # LEDをRGBの特定の色に設定 def set_color(r, g, b): GPIO.output(PORT_R, r) # 赤色LEDを操作 GPIO.output(PORT_G, g) # 緑色LEDを操作 GPIO.output(PORT_B, b) # 青色LEDを操作
そして、While True…以下は
while True: print('ボタンを押して話してください') button.wait_for_press() print('聞き取り中...') text = recognizer.recognize() if text is None: print('すみません。聞き取れませんでした。') else: print('あなたの言葉は "', text, '"') if '赤' in text: set_color(1, 0, 0) elif '青' in text: set_color(0, 1, 0) elif '緑' in text: set_color(0, 0, 1) elif 'チカチカ' in text: for i in range(10): set_color(1, 0, 0) # 赤 time.sleep(0.3) set_color(0, 1, 0) # 緑 time.sleep(0.3) set_color(0, 0, 1) # 青 time.sleep(0.3) elif '電気をつけて' in text: set_color(1, 1, 1) elif '電気を消して' in text: set_color(0, 0, 0) elif 'さよなら' in text: sys.exit() GPIO.cleanup()
elifの場所は、2色を同時に点灯させると、違う色が出てくるので、紫や黄色を足してあげても良いですね。
elif '紫' in text: set_color(1, 1, 0) elif '黄色' in text: set_color(1, 0, 1)
いざ実行!
で、これを実行すると…
「赤!」
「緑!」
「青!」
色の名前を言うたびに、違う色のライトが点灯することになりました。
ちなみに、私の言い方が悪いのかもしれませんが、「赤」というのがなかなか認識されなくて、何度か言ってようやく赤色のLEDが点灯しました。「ワインレッド!」とか言葉を長めに設定した方が分かってもらいやすいかもしれません。
「チカチカ」「電気をつけて」「電気を消して」といったコマンドも無事成功。デフォルトでは、電気がつけっぱなしになってしまうので、「電気を消して」コマンドは重宝します。
DIPスイッチは普通のラズパイで
さて、「やさしくはじめるラズベリーパイ」の本では、この後、DIPスイッチという4つ付いたスイッチを使って、色の切り替えを行なうプログラムもありました。
さっそくこれも実施してみましたが、AIYスピーカーのVoice Hatに、さらにジャンパワイヤを複数挿すのは、苦行というか、頭が変になってしまいそうだったので、普通のラズパイに挿して実施することに。
ワイヤを挿すのはこちらが数倍楽です、ホント。
DIPスイッチというのも今回初めて使ってみました。スイッチの切替で、LEDの色の切り替えができるのは楽しい!
ですが、音声認識で色の切り替えが出来る方がさらに楽なので、Voice Hatにワイヤを挿すのがいかに苦行でも、やはりやってみた甲斐はあったと思ったのでした。
コメント