IoT × LINEbotでチキンレースゲームを作ってみた

# はじめに
obnizとLINEbotを使って、チキンレースゲームを作ってみました。


[チキンレース](https://kotobank.jp/word/chicken%20race-565500)とは
《〈和〉chicken＋race　chickenは臆病者の意》
１ 相手の車や障害物に向かい合って、衝突寸前まで車を走らせ、先によけたほうを臆病者とするレース。チキンゲーム。チキンラン。
２ 相手を屈服させようとして互いに強引な手段をとりあう争い。チキンゲーム。「値下げ競争はチキンレースの様相を呈している」

壁からちょうど100mmになるようにうまいことブルドーザーを止められたら優勝です（？）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">IoT × LINEbotでチキンレースゲームを作ってみた<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/6L7pM8vvlQ">pic.twitter.com/6L7pM8vvlQ</a></p>&mdash; R19 (@r19_tech) <a href="https://twitter.com/r19_tech/status/1143829323574415361?ref_src=twsrc%5Etfw">June 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 概念図
![スクリーンショット 2019-06-26 19.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/4e9009ec-c222-9b55-71f5-86e309274a13.png)

# 使ったもの
・[obniz](https://www.switch-science.com/catalog/3838/?gclid=CjwKCAjwr8zoBRA0EiwANmvpYFMecMd-q3rihjShoGf6Igu2-s_EWdDHhQkuozwPQp5vVSs44BjMPhoCaDoQAvD_BwE) これがwifiに繋がってて、obnizのシリアルNOが分かれば、サーバーからアクセスできる
・[超音波センサー HC-SR04](https://www.switch-science.com/catalog/2860/) 壁からの距離を測るために使います
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">用意したもの <a href="https://t.co/WAxAkWSp6R">pic.twitter.com/WAxAkWSp6R</a></p>&mdash; R19 (@r19_tech) <a href="https://twitter.com/r19_tech/status/1143836981866070016?ref_src=twsrc%5Etfw">June 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
・あとは適宜ジャンプボードとかコードとか
・100均に売ってたブルドーザー（？）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">IoTのために生まれてきたようなデザイン <a href="https://t.co/O7yzNPMsJR">pic.twitter.com/O7yzNPMsJR</a></p>&mdash; R19 (@r19_tech) <a href="https://twitter.com/r19_tech/status/1143693222939467776?ref_src=twsrc%5Etfw">June 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 作ってみよう
## LINEbot
[こちら]()を参考に
## サーバー
以下をインストールしておく

```
npm install express --save
npm install @line/bot-sdk --save
npm install axios --save
npm install obniz —save
```

```javascript:server.js
'use strict';

const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
const PORT = process.env.PORT || 3001;
const Obniz = require('obniz');

const config = {
    channelSecret: 'xxxxxxxxxx',
    channelAccessToken: 'xxxxxxxxxx'
};

const app = express();

var hcsr04;

var obniz = new Obniz("xxxx-xxxx");
obniz.onconnect = async () => {
    obniz.display.clear();

    hcsr04 = obniz.wired("HC-SR04", {gnd:0, echo:1, trigger:2, vcc:3});
    hcsr04.temp = 25;
    hcsr04.reset_alltime = true;

    var distance = await hcsr04.measureWait();
    obniz.display.print(distance);
}

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)'));
app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);
    Promise
      .all(req.body.events.map(handleEvent)) //引数のすべてのpromiseを集約する
      .then((result) => res.json(result));
});

const client = new line.Client(config); // LINEのclientを介してpushMessageなど処理する

function handleEvent(event) {
    // textメッセージ以外は処理しない
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    }
    let mes = '';
    const message = event.message.text
    console.log(message);
    if (message === '#計測') {
        hcsr04mesure(event.source.userId);
        mes = '計測中...';
    }else{
        mes = message;
    }
    return client.replyMessage(event.replyToken, {
        type: 'text',
        text: mes
    });
    
}

// 測るとこ
const hcsr04mesure = async (userID) => {
    const dis = await hcsr04.measureWait();
    const res = await make_message(dis);
    pushMsg(userID, res);
}

// LINEbotからメッセージを送信
function pushMsg(userId, message) {
    return client.pushMessage(userId, {
      type: 'text',
      text: message,
    })
}

// 距離からメッセージを作る
function make_message (dis) {
    if(100 === Math.round(dis)){
        return "ピタリ賞！！！！！ : " + Math.round(dis) + " mm"
    } else if( 110 > Math.round(dis) && Math.round(dis) > 90) {
        return "おしい〜 : " + Math.round(dis) + " mm"
    }else{
        return "クソザコナメクジ！！！！！！ : " + Math.round(dis) + " mm"
    }
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);
```

準備ができたらnode.jsで起動します

```
node server.js
```

# 感想
めちゃめちゃ簡単な実装ながら、作ってからみんなで遊んでもそこそこ楽しめるかなと思いました。
LINEbotを介すので管理画面や操作画面を作る必要がないのもお手軽ですね。

obnizで遊ぶように、ジョイスティックやチルドスイッチ、LED付きキートップなども手に入れたので、また何か作ってみます！