Help us understand the problem. What is going on with this article?

obnizとgoogle home mini で歌うサンタを雑につくる

More than 1 year has passed since last update.

遅刻常連のへっぽこまるこです。
その名に恥じぬへっぽこぶりで申し訳ございません。
Obniz Advent Calendar 2018 13日目、、、でした、、、

作ったもの

画像が表示できません

※LEDが結構強めに光っているので閲覧にはご注意ください

概要

obnizでgoogle-home-notifierを使ってgoogle home miniから音源を再生します。
それに連動して下唇に仕込んだサーボモータが動かして、
歌ってる感じにします。
Macでnode.jsがインストールされている前提で書きます。

材料

  • obniz
  • sg90
  • LED(既にランダムに光るプログラムが書き込まれてるやつ)
  • ジャンパワイヤー
  • 本当は抵抗もあったほうがよい
  • 切ないクリスマスソングの音源
  • ダンボールや生地やら両面テープやら(サンタデバイス用)

電子回路

頑張れたら差し替えます。
IMG_2778.jpg

サンタデバイス準備

サンタデバイス(?)はこちらのブログで乗せてもらったのを流用します。

ディレクトリやらライブラリやら準備

$ mkdir santa && cd $_ //ディレクトリ作成&移動
$ npm install google-home-notifier
$ npm install obniz
$ touch face.js //メインのプログラムファイル
$ mkdir audio //音源格納用

audioフォルダには音源のkurisumasusong.mp3を置いておきます。

音源準備

音源にはMP3に録音したものを使っています。
google-home-notifierでMP3を再生するには
ファイルのURLが必要になります。

今回は、こないだハンズオンで教えていただいたngrokとpythonを使った
ホスティング
でURLを準備しました。
※santaディレクトリ配下で実行

くそプログラム

(恥を忍んであげます・・async awaitよくわかってないです・・)

face.js
const googlehome = require('google-home-notifier');
const language = 'ja';
const Obniz = require("obniz");

const obniz = new Obniz("××××-××××");

obniz.onconnect = async function () {
    var mouth = obniz.wired("ServoMotor", {signal:0, vcc:1, gnd:2});
    var leftLed = obniz.wired("LED", { anode:3, cathode:4 });
    var rigthLed = obniz.wired("LED", { anode:5, cathode:6 });

    mouthMove = async function (maxDeg, maxDegWait, minDeg, minDegWait) {
        console.log(">>> mouthMove start");
        await mouth.angle(maxDeg);
        await obniz.wait(maxDegWait);
        await mouth.angle(minDeg);
        await obniz.wait(minDegWait);
    }

    singMouth = async function () {
        console.log(">>> singMouth start");
        //init
        await mouthMove(0.0, 1300, 0.0, 0);

        //く
        await mouthMove(40.0, 400, 0.0, 100);
        //り
        await mouthMove(40.0, 400, 0.0, 100);
        //す
        await mouthMove(40.0, 400, 0.0, 100);
        //ま
        await mouthMove(30.0, 80, 0.0, 100);
        //す
        await mouthMove(30.0, 80, 0.0, 100);
        //きゃ
        await mouthMove(50.0, 100, 0.0, 100);
        //ろ
        await mouthMove(30.0, 100, 0.0, 100);
        //る
        await mouthMove(30.0, 120, 0.0, 100);
        //が
        await mouthMove(40.0, 900, 0.0, 500);

        //な
        await mouthMove(40.0, 400, 0.0, 100);
        //が
        await mouthMove(40.0, 400, 0.0, 100);
        //れ
        await mouthMove(40.0, 400, 0.0, 100);
        //る
        await mouthMove(40.0, 400, 0.0, 100);
        //こ
        await mouthMove(40.0, 100, 0.0, 100);
        //ろ
        await mouthMove(40.0, 100, 0.0, 100);
        //に
        await mouthMove(40.0, 100, 0.0, 100);
        //は
        await mouthMove(50.0, 1300, 0.0, 500);

        //き
        await mouthMove(40.0, 100, 0.0, 100);
        //い
        await mouthMove(40.0, 100, 0.0, 100);
        //と
        await mouthMove(40.0, 200, 0.0, 100);
        //ぼ
        await mouthMove(40.0, 100, 0.0, 100);
        //く
        await mouthMove(40.0, 100, 0.0, 100);
        //の
        await mouthMove(40.0, 100, 0.0, 100);
        //こ
        await mouthMove(40.0, 170, 0.0, 100);
        //た
        await mouthMove(40.0, 170, 0.0, 100);
        //え
        await mouthMove(40.0, 170, 0.0, 100);
        //も
        await mouthMove(30.0, 1000, 0.0, 500);

        //き
        await mouthMove(40.0, 100, 0.0, 100);
        //い
        await mouthMove(40.0, 100, 0.0, 100);
        //と
        await mouthMove(40.0, 500, 0.0, 100);
        //で
        await mouthMove(40.0, 100, 0.0, 100);
        //て
        await mouthMove(40.0, 100, 0.0, 100);
        //い
        await mouthMove(40.0, 100, 0.0, 100);
        //る
        await mouthMove(40.0, 100, 0.0, 100);
        //だ
        await mouthMove(40.0, 100, 0.0, 100);
        //あ
        await mouthMove(40.0, 100, 0.0, 100);
        //ろ
        await mouthMove(40.0, 800, 5.0, 600);

        //く
        await mouthMove(40.0, 400, 0.0, 100);
        //り
        await mouthMove(40.0, 400, 0.0, 100);
        //す
        await mouthMove(40.0, 400, 0.0, 100);
        //ま
        await mouthMove(30.0, 80, 0.0, 100);
        //す
        await mouthMove(30.0, 80, 0.0, 100);
        //きゃ
        await mouthMove(50.0, 100, 0.0, 100);
        //ろ
        await mouthMove(30.0, 100, 0.0, 100);
        //る
        await mouthMove(30.0, 120, 0.0, 100);
        //が
        await mouthMove(40.0, 900, 0.0, 500);

        //な
        await mouthMove(40.0, 400, 0.0, 100);
        //が
        await mouthMove(40.0, 400, 0.0, 100);
        //れ
        await mouthMove(40.0, 400, 0.0, 100);
        //る
        await mouthMove(40.0, 400, 0.0, 100);
        //こ
        await mouthMove(40.0, 100, 0.0, 100);
        //ろ
        await mouthMove(40.0, 100, 0.0, 100);
        //に
        await mouthMove(40.0, 100, 0.0, 100);
        //は
        await mouthMove(50.0, 1300, 0.0, 500);

        //だ
        await mouthMove(40.0, 100, 0.0, 100);
        //れ
        await mouthMove(40.0, 100, 0.0, 100);
        //を
        await mouthMove(40.0, 400, 0.0, 100);
        //あ
        await mouthMove(40.0, 100, 0.0, 100);
        //い
        await mouthMove(30.0, 100, 0.0, 100);
        //し
        await mouthMove(30.0, 100, 0.0, 100);
        //て
        await mouthMove(30.0, 100, 0.0, 100);
        //る
        await mouthMove(30.0, 100, 0.0, 100);
        //の
        await mouthMove(40.0, 100, 0.0, 100);
        //か
        await mouthMove(30.0, 1000, 0.0, 500);

        //い
        await mouthMove(40.0, 100, 0.0, 100);
        //ま
        await mouthMove(40.0, 100, 0.0, 100);
        //は
        await mouthMove(40.0, 500, 0.0, 100);
        //み
        await mouthMove(40.0, 100, 0.0, 100);
        //え
        await mouthMove(40.0, 100, 0.0, 100);
        //な
        await mouthMove(20.0, 100, 0.0, 100);
        //く
        await mouthMove(20.0, 100, 0.0, 100);
        //て
        await mouthMove(40.0, 100, 0.0, 100);
        //も
        await mouthMove(40.0, 100, 0.0, 100);
        //お
        await mouthMove(50.0, 5000, 50.0, 0);
        for (i=49; i>=0; i--){
            await mouth.angle(i);
            await obniz.wait(80);
        }
    }

    google_home = async function() {
        console.log(">>> google home start");
        googlehome.device('Google-Home', language); 
        await googlehome.play('http://×××××.ngrok.io/audio/kurisumasusong.mp3', function(res) {
            console.log(res);
            leftLed.on();
            rigthLed.on();
            singMouth();
        });
    }

    console.log(">>> obniz start");
    await google_home();
}

実行

以下のコマンドで実行します。

$node face.js

サンタが歌ってる感じになります。

反省

サーボ音がでかいので、口パクがばれやすいのでどうにかしたいと思いました。
なんかサンタっぽさに欠けるなと思ったのですが、
おそらく直毛だからなので、クリンクリンの毛があると良いと思いました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした