5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-18

遅刻常連のへっぽこまるこです。
その名に恥じぬへっぽこぶりで申し訳ございません。
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

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

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?