Lambdaからobnizを動かす

前回に引き続き、obnizについて。

近頃、Alexaスキルとobnizを連携させたいと、考えるようになりました。

Alexaスキル →  Lambdaという流れは一度やったことがあるので、Lambda → obnizができれば、大枠はできると思います。

obniz公式サイトにLambdaとつなげる説明があるので参考とします。

zipがアップロードできない!

丁寧な説明が書いてあるので、主に私がつまづいたところのみ記載します。

で、ダウンロードしたファイルが重すぎて、Lambdaにzipファイルとしてアップロードするときにエラーが出ました。

手っ取り早いのが、13.6MBあるobnizのドキュメント及び画像ファイルを削除してしまうことかと思います。

/node_modules/obniz/doc

このディレクトリごと削除で、アップロードできました。

Alexa → Lambda → obniz

Alexaに話しかけ、Lambdaを経由してobnizのLEDをチカチカさせることはできました。

しかし、obnizのコードと、Alexaスキルのコードを両立させることができず・・・Alexaと対話ができなくなってしまいました。

原因調査中。

九九でクリスマスツリーを光らせよう

前回に引き続き、obnizを使ってLEDテープを光らせようと思います。

現在我が家では、子供が九九を覚えられない課題を抱えています。

それに絡めたプロダクトを考えます。

九九の正解1つにつき1つLED点灯

Webアプリで九九を出題します。

正解を入力するたびに、1つずつLEDが光るゲームです。

最終的に得点(正解数 ÷ 81 × 100の切り捨て)が出て、得点に応じて起こるイベントが変わります。

【100点】
イルミネーション(LEDランダム点灯)+クリスマスソングが流れる

【99~90点】
拍手と歓声が聞こえる

【89~80点】
「ははははは」笑い声が聞こえる(ちょっとさげすんだ感じ)

【79点以下】
「なんでやねん」

・・・子供はわざと悪い点を取って、「なんでやねん」を聞き、面白がっています。

クリスマス当日までに、はたして100点を取れるのか?

合成音声出力と音声入力対応だが

このWebアプリは出題の際、「さざんが」「ろくご」といった、合成音声でしゃべってくれます。

Sound of Textというサイトで合成音声を作ったのですが、「using the text to speech engine from Google Translate.」・・・Googleの合成音声のようです。

ライセンスが分からず、個人で楽しむ程度にします。

 

また、九九の答えの入力では、音声入力に対応しており、対話のように解答していけます。

これもGoogleさんの用意してくれた音声認識 (Asynchronous Speech Recognition)APIを使っています。

以下、音声認識のコードだけ抜粋します。

var rec = new webkitSpeechRecognition();
rec.continuous = true;
rec.interimResults = true;
rec.lang = 'ja-JP';
rec.onresult = function(e){
  for(var i = e.resultIndex; i < e.results.length; ++i){
    if (e.results[i].isFinal) {
      var val = e.results[i][0].transcript;
      if(val === "し"){
        val = 4;
      }else if(val === "く"){
        val = 9;
      }
      if(isNaN(val)){
        $rec.text(val + " ?");
      }else{
        $rec.text("");
        $answer.val(val);
        $form.submit();
      }
    }
  }
};

ににんが「し」、さざんが「く」は、数字として認識しないので、「し」⇒4、「く」⇒9に変換しています。

音声認識により、対話している感じが面白いのですが、最終的にこの機能は消しました。

「ろくご・・・」と問題をつぶやいてしまうと、6×5=[65]とご入力されてしまいます。

結局テンキー入力を採用しました。

間違いはどこだ?

このWebアプリは、ローカルサーバーで起動しており、採点結果のデータが指定フォルダに保存されます。

採点データは再テストで利用しやすいよう、JSON形式(ただの配列ですが)で出力しています。

出力結果を見ると・・・

3×7=21を24と答えてます。他にも、

9×3=27が24になってます。

「いち」と「しち」が「し」になってしまう傾向が見られました。

イルミネーションを見ながらクリスマスを過ごせるのか?

クリスマスまでに100点を取り、クリスマスソングを聞きながら、イルミネーションを見ることができるのか?

子供の成長に期待。

obnizでフルカラーLEDテープの制御

あまり制御できなかったのですが・・・参考まで。

JavaScriptでマイコンを動かす

obniz(オブナイズ)」という、素晴らしいマイコンがあります。

JavaScriptを使って手軽に実装できるマイコンです。

開封してネットに繋げば、すぐに使えます。

フルカラーLEDテープを光らせよう

フルカラーLED「WS2812B」が144個連なっているテープを購入。

obnizの公式サイトを見ると、パーツライブラリにWS2812Bの使い方が載っているので、参考にできます。

よく見ると「チェーンの最大は85です。」と書いてありました。それより多く光らせようとしてもエラーが出ます。

144個もいらなかった・・・。

個人的に都合のよい、81個のところで切ります。

電流が足りない

前述のWS2812Bの使い方ページで、サンプルコードの右上にある「Test Run」を押せば、すぐさまLEDを光らせることができます。

サンプルコードの中では、hsvs()が使いやすそうです。[色相,彩度,明度]を配列で並べていけばよいみたいです。([r,g,b],,,,となっていますが)

ピンは0がGND、1が5V、2がカラー制御用。

しかし、81個のLEDを光らせるには電流が足りないので、このまま繋いで実行すると、「heavy output」の警告がでます。

ACアダプターから電源を取ろう

obnizとLEDテープの接続はdin(カラー制御用)のみにして、電源を5V4AのACアダプターから取ることにしました。

これで光ります。

試しに、色相を少しずつ変えて、グラデーションを作ってみましょう。

    led = obniz.wired("WS2812B", {din: 2});
    var color = [];
    for(var i = 0; i < 81; i++){
      color[i] = [i * 3,  1, 0.2];
    }
    led.hsvs(color);

サンプルコードを書き換えて「Test Run」を押します。

だいたい、意図したグラデーションになりました。

・・・だいたいというのは、実行してもすぐに反映されなかったり、一部点灯しなかったり、違う色に光ったり、不安定さがあったからです。

何度か実行すると意図通りに光るのですが・・・。

流れるアニメーションはできる?

不可解な状態ですが、続いてアニメーションを試します。

一定間隔の処理「setInterval」を使えばできそうな気がします。

色の配列の先頭を最後に持ってくる命令を0.1秒ごとに行えば、流れるようなアニメーションになると信じて・・・

    led = obniz.wired("WS2812B", {din: 2});
    var color = [];
    for(var i = 0; i < 81; i++){
      color[i] = [i * 3,  1, 0.2];
    }
    led.hsvs(color);

    var setLed = function(){
      color.push(color[0]);
      color.shift();
      led.hsvs(color);
    };
    setInterval(setLed, 100);

コードを書き替えて実行。

!?

色のグラデーションが無茶苦茶で、処理も0.1秒ごとに実行されず。

色もタイミングもランダムなイルミネーションとなりました。

LEDテープが壊れたのか?

他のLED、WS2812Bの豆電球型が連なったタイプでも試してみました。

これもテープ型と同じ症状だったので、LED側の問題ではないようです。

フルカラーLEDを制御できず。

それでも綺麗だから良いとして、先に進みます。

次回はobnizを使って作ったものを紹介します。