今日も夜は大雨でしたね。
秋が近づいてきた感じはしますが、まだまだ毎日暑いですね。
先週、JTalkでしゃべったので、インタラクションの第一歩として、スイッチを押したらしゃべるぞということを実現してみたいと思います。
うまく、RPiのキャラがつけられなくて悩む日々ではありますが、とりあえず進めます。
名前をつけてあげないのがいけないのかな…。
今日は、スイッチを押したら何かしゃべるようにしてみましょう。
スイッチ、身近なデバイスではあるのですが、意外と縁の下の力持ちよろしく、あんまりちゃんとは知られてない気がします。
スイッチ、実は奥深くて、最近の学生に、キーボードはスイッチのマトリクスだといったら驚かれ、こっちが驚いた次第。
こんなところに使われてるの?状態でありますね。
デジタルインプットになるものはほとんどスイッチと思って間違いない。
アナログのインプットもしきい値を用いれば、フィルタリングしたスイッチと思っていいだろう。
単純なスイッチでさえ、ハードウェアになったとたんにチャタリング等々、面倒なことがおきます。
スイッチは便利な半面、使い方によってめちゃくちゃになることもあるので、自分が何を実現したいのかをきちんと考えて実装する必要がありますね。
とはいえ、簡単に、スイッチを押して1がきたらしゃべるようにしてみましょう。
もうちょっと丁寧にブログで内容を書きたいのですが、いかんせん、時間がありません。
そろそろ日付も変わってしまいます。
先週のお盆も返上でいろいろやってたので、今週はあまり書く時間も取れず…
申し訳ありませんが、スイッチ回路は、かんたんなので、どこかで見てください。
ここでは、GPIOの23、24を使ってスイッチ回路を作りました。
写真撮っておくの忘れました。orz
それと、wiringPiをインストールしてください。
ソースは下記です。
#include <stdio.h> #include <wiringPi.h> #include <unistd.h> #define SW1 23 /*GPIO23*/ #define SW2 24 /*GPIO24*/ //スイッチ検出でTTSを再生(SWは割り込みではない) int main() { int sw1,sw2; int i; //initialize if(wiringPiSetupGpio() == -1) return 1; pinMode(SW1, INPUT); pinMode(SW2, INPUT); printf("test\n"); while(1) { sw1 = digitalRead(SW1); sw2 = digitalRead(SW2); if(sw1 == 1) { system("./../tts/ojt.sh ./../tts/tts.txt"); usleep(100); printf("SW1 %d\n", sw1); } if(sw2 == 1) { system("./../tts/ojt.sh ./../tts/tts1.txt"); usleep(100); printf("SW2 %d\n", sw2); } } return 0; }
これをmain.cとしてセーブします。
コンパイルは
$ cc -o shaberu main.c -lwirngPi
です。
$ sudo ./shaberu
で起動します。sudoを忘れると、ハードウェアにアクセスできないとエラーになります。
プログラム中のtts.txtには、「こんにちは」とtts1.txtには「おはようございます」が入っています。
jtalk は、system関数で呼び出しているので(システム上のシェルスクリプトを起動しているので)遅いと言うのもあります。
JTalkですが、オンボードで音声合成しているので、個人的な感触としてはしゃべるのが、遅いので、どうにかならないものか?とおもっています。
あとでどのくらい時間がかかっているのか調べようとは思うが、高速化については後から考えるとして、とりあえず、これで、単純にスイッチを押したら、「こんにちは」と「おはようございます」をしゃべります。
かんたんなインタラクションはできるようになりました。
次は、サーボを動かしてみましょう。
C#の連載でおなじみだったFutabaサーボを動かしてみることにしましょう。
あれ?
今回、1枚も写真がない…(^^;
[amazonjs asin=”4899773528″ locale=”JP” title=”Raspberry Piで遊ぼう!”]