タイトルが自分で作っておきながらスラグ用語っぽくしたくてこんな感じになりました
前回
「しらける」を「ホワイトキック」に自動変換したかったストーリー
https://qiita.com/tkyko13/items/f80503a04d33482d9983
今回
前回のものを使って自分なりに自動変換の評価方法とその表現をフィジカルコンピューティング的に行ってみました
それがこちらの動画です
http://www.youtube.com/watch?v=RxWQeA0aLMY
本当にホワイトをキックします...
実装
概念図
前回のも合わせて図にしてみました
動画で少し写っているマイクが反応した後にLINE BOTが「イッツ ホワイトキック!!」というメッセージを送っていますが,そのフローは省略しています
使ったもの
前回の以外では,
obniz https://obniz.io/ja/
obniz nodeライブラリ v2.2.0
マイクキット http://akizukidenshi.com/catalog/g/gK-05757/
サーボモータ http://akizukidenshi.com/catalog/g/gM-08761/
ソースコード
wker.jsは前回のモジュールになっています
全体はgithubをご確認ください
https://github.com/tkyko13/WhiteKicker
"use strict";
const Obniz = require("obniz");
const express = require("express");
const line = require("@line/bot-sdk");
const wker = require("./wker");
const PORT = process.env.PORT || 3000;
const config = {
channelSecret: "<YOUR_SECRET>",
channelAccessToken:"<YOUR_TOKEN>"
};
let obniz = new Obniz("<YOUR_ID>");
let mic;
let servo;
// 環境によってしきい値を変える
const MIC_THRESHOLD = 3.5;
// サーボの角度設定
const SERVO_BASE_ANGLE = 120;
const SERVO_KICK_ANGLE = 60;
obniz.onconnect = async function() {
obniz.display.clear();
obniz.display.print("connect!");
obniz.io0.output(false); //gnd
obniz.io1.output(true); //vcc
mic = obniz.ad3;
servo = obniz.wired("ServoMotor", { signal: 5 });
servo.angle(SERVO_BASE_ANGLE);
};
const app = express();
app.get("/", (req, res) => res.send("Hello LINE BOT! wker"));
app.post("/webhook", line.middleware(config), (req, res) => {
console.log(req.body.events);
Promise.all(req.body.events.map(handleEvent)).then(result => {
res.json(result);
});
});
// デバッグ用
app.get("/:text", (req, res) => {
let text = req.params.text;
wker(text).then(function(data) {
res.send(data);
});
});
const client = new line.Client(config);
function handleEvent(event) {
if (event.type !== "message" || event.message.type !== "text") {
return Promise.resolve(null);
}
let resMess = event.message.text;
// devという文字があればデバッグモード
let dev = "";
// if (resMess.indexOf("dev") >= 0) {
if (/dev/.test(resMess)) {
dev = "-v";
resMess = resMess.replace("dev", "");
}
wker(resMess).then(function(data) {
let retText = "";
if (dev == "-v") {
retText += data.kanji.join(" ") + "\n";
retText += data.en.join(" ") + "\n";
retText += data.text;
} else {
retText += data.text;
}
obnizAction();
return client.replyMessage(event.replyToken, {
type: "text",
text: retText //実際に返信の言葉を入れる箇所
});
});
}
function obnizAction() {
mic.start(function(v) {
console.log(v);
if (v > MIC_THRESHOLD) {
obniz.display.clear();
obniz.display.print("W!K!");
servo.angle(SERVO_KICK_ANGLE); //ホワイトキック
mic.end();
// lineメッセージを送る
client.pushMessage("U774679a859ca7303bf7cfb9ff5d44aa1", {
type: "text",
text: "イッツ ホワイトキック!!"
});
setTimeout(function() {
servo.angle(SERVO_BASE_ANGLE); //元の位置へ
}, 3000);
}
});
setTimeout(function() {
mic.end();
}, 3000);
}
process.env.NOW_REGION ? (module.exports = app) : app.listen(PORT);![undefined]()
console.log(`Server running at ${PORT}`);
説明など
前回のLINE BOTで笑ったら足が付いたサーボが動いて白って書いてある紙を蹴るというもの
LINE BOTが返答した後,3秒ほど音量を取得しています
笑うという判断はマイクの音量がしきい値を超えたらになっていますので,笑いじゃなくてもツッコミや怒号でもサーボが動く(ホワイトキック)します
また,LINE BOTに「イッツ ホワイトキック!!」というメッセージを送らせています
3秒後にまたサーボが元の位置に回転して戻ります
LINE BOTが面白くなく3秒ほど場がし〜んとなったら「ホワイトキック」しないです
結果
場が「しらけ(る)」てしまっても「ホワイトキック」はしないが,場が「しらけ(る)」なくても「ホワイトキック」するということです
え〜...以上です