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

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

##作ったもの
[![画像が表示できません](http://img.youtube.com/vi/zyrQC8Du9b0/0.jpg)](http://www.youtube.com/watch?v=zyrQC8Du9b0)

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


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

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

##電子回路
頑張れたら差し替えます。
![IMG_2778.jpg](https://qiita-image-store.s3.amazonaws.com/0/115325/96cd27a8-9626-5d0e-e029-264fdb2d4345.jpeg)

##サンタデバイス準備
サンタデバイス（？）は[こちらのブログ](https://dotstud.io/blog/face-robot-making-basic/)で乗せてもらったのを流用します。

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

```
$ 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を使った
ホスティング](https://qiita.com/n0bisuke/items/0c09ae5da43b551e98b1#%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B)でURLを準備しました。
※santaディレクトリ配下で実行


##くそプログラム
（恥を忍んであげます・・async awaitよくわかってないです・・）

```javascript: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
```

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


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