IoTでポケモンマスターに俺はなる！ #iotlt


[IoTLT](https://iotlt.connpass.com/)アドベントカレンダー1日目ですね！ みなさん張り切っていきましょう :+1: 

作品が混ざってしまっているような記事タイトルですが、そのままです。

ポケモンマスターになるためのIoTハックをします。

ちなみに、IoTLTではアドベントカレンダーが3つあるので注目ですね!

> * https://qiita.com/advent-calendar/2018/iotlt
> * https://qiita.com/advent-calendar/2018/iotlt_neo
> * https://qiita.com/advent-calendar/2018/iotlt_mitz

時間ないから[作ったモノ見たい人はページ下部](https://qiita.com/n0bisuke/items/027ac51527a499b5d19f#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E4%BB%8A%E5%9B%9E%E3%81%AE%E6%9C%80%E7%B5%82%E5%BD%A2)へ。

## ポケットモンスター Let's Go! ピカチュウ・Let's Go! イーブイ

皆さん、ポケモンレッツゴーやってますか？

<img src="https://i.gyazo.com/c2cbb97370de5a9497a260037a5848d4.jpg" width="500">

> https://www.pokemon.co.jp/ex/pika_vee/

Nintendo Switchで初の[ポケモンメインタイトル](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%A2%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC_(%E3%82%B2%E3%83%BC%E3%83%A0)#%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E4%B8%80%E8%A6%A7)です。

ストーリー的には第１世代のピカチュウ版のストーリーですが、前作のサンムーンとかの`アローラ地方版ポケモン`がいたり、もともとの第１世代にはなかったタイプの`はがね`や`あく`などがあったり、`ストーリー以外は新要素`が入っていて過去のピカチュウ版をやったことがある人でも楽しめると思います。

他にも......
・
・
・
(まだ話せそうですがQiitaレギュレーション的に省略)
・
・

とりあえず僕はイーブイ版にしました。

<img src="https://i.gyazo.com/9db98f915f01d37477c07c5a153acc0d.gif" width="500">

**かわいい。。。**

ピカチュウ版は過去にもあったしイーブイにしようって人多いかもしれないですね。

## アツい新デバイス 「モンスターボール Plus」

そしてこちらは **新デバイス**！

<img src="https://i.gyazo.com/2e97a84ebc1025ff37630bc6aa14afd2.jpg" width="500" >

なんとゲームコントローラーになってます。この動作でモンスターボールを投げてポケモンをGET出来るのは、 **ポケモン世代的にはめちゃ激アツ**です！！

<img src="https://i.gyazo.com/3886235b8846427663ac617a9e1b9281.gif" alt="pokeball" width="500">

Nintendo Switchのコントローラーなので加速度/ジャイロセンサが入ってるんですよね。

今回は関係ないけど、[ポケモンGoとも連携](https://www.pokemongo.jp/monsterballplus-support/howto/)出来ます。

ちなみに僕は[ポケモンレッツゴーイーブイとモンスターボールPlusのセット（限定特典付）](https://amzn.to/2SnpZB4)を購入しました。クリスマスプレゼントにオススメですね。

### 仕様など

デバイスの簡単な仕様などは公式ページを参照しましょう。 
ちなみにNintendo SwitchのコントローラーはBLEを利用していて、モンスターボール PlusもBLEデバイスです。ただ、BLE仕様を探ろうとしましたがアクセス出来ず、手詰まりだったので今回はBLEは利用しません。（通常のNintendo Switchのコントローラーはハックしている人結構います。）

> <img src="https://i.gyazo.com/22225fdfedce5cdcdf85974298c8c946.png" width="400">
> https://www.pokemongo.jp/monsterballplus-support/
> ![](https://i.gyazo.com/d87ad43eab8af4f8fa4987ff389f68b1.png)

### モンスターボールにポケモンを入れて経験値をためる

このモンスターボールにポケモンを入れることが出来きます。 
**しかも買うとミュウが入っているという。**

> [幻のポケモン「ミュウ」を受け取る方法](https://www.pokemon.co.jp/ex/pika_vee/howtoplay/181109_02.html)

![](https://i.gyazo.com/80ef5056f9b69173016eaeef5478d183.gif)

ポケモンを入れて歩いてると、 **歩いた歩数によって経験値が溜まって、ポケモンレッツゴー側で経験値を受け取れる**というすごいやつです。

なんとなく作るものが想像ついて来たでしょうか...!

## 今回やりたいこと - 忙しい大人でも子供に勝ちたい

ということで、このモンスターボールPlusは歩くと経験値が溜まる仕様ですが、 **加速度/ジャイロセンサなので振ってあげれば歩いた判定になって経験値がたまります。**

最近は勉強会の懇親会でよく振ってます。

**子供たちは僕らが仕事している時間に経験値をあげたりしているのですが、忙しい大人はなかなか経験値稼ぎが出来ないので、これを自動化したいと思います。**

なんとなくやりたいイメージは`アレ`に近いです。

> アレ↓
> <img src="https://camo.qiitausercontent.com/79e4bc9ed59ea4181cbf8617689503d96540dd77/68747470733a2f2f692e6779617a6f2e636f6d2f65633538303165303235343530306139303836373964323336613936303836322e676966" width="500">

> 参考: [クリスマスなので出会い系サービスのマッチング率を上げるデバイスを作る #iotlt](https://qiita.com/n0bisuke/items/802d3a3c2be6b04bb80b)

## 縛り試作: オフィスにあったもののみを使う

何個か試作試してみました。

~~作業した時間帯的にお店がやってなかったので、~~
**今回はオフィスに転がっていたモノだけで作る縛りプレイにしました。**

[作ったモノ見たい人はページ下部](https://qiita.com/n0bisuke/items/027ac51527a499b5d19f#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E4%BB%8A%E5%9B%9E%E3%81%AE%E6%9C%80%E7%B5%82%E5%BD%A2)へ。

### 試作No.0: 扇風機

まず考えたのが、扇風機です。

**扇風機にモンスターボール Plusを結びつけて振り回せないか...**

オフィスにあった扇風機時計

> 参考: [新センで見つけた謎デバイスたち #iotlt vol44](https://speakerdeck.com/n0bisuke/xin-sendejian-tuketami-debaisutati-number-iotlt-vol44)

<img src="https://i.gyazo.com/3c87a909c519dc0abed65ca219ca6120.jpg" width="400">

結構動きが速くて危なそうだったのと、 **ドライバーが見つからなくて網を開くことが出来なかった。**
・
・
・
**結果: 試す前に心が折れて断念**

### 試作No.1: USBミニ扇風機

そのまま試すことが出来そうだったのでチャレンジ。

<img src="https://i.gyazo.com/8ea7390e3ac07abdbedf16634ed1a409.gif" width="400">

モンスターボール Plusの紐をくくりつけて回すと...

<img src="https://i.gyazo.com/11c233391d01e9db11b81c7e398030eb.gif" width="400">

・
・
・

**悲しいことにビクともしませんでした。**

<img src="https://i.gyazo.com/5a22b7fb5fd5f6470868b9fbfc0156ed.gif" width="400">


・
・
・

**結果: モーターのトルクが足りず失敗**

成功してもスマホから給電するタイプだったのでこのままだとバッテリー問題ありそう。

### 試作No.2: 電磁石モジュール + スマホ固定するアーム

スマホ固定するアーム（製品名よくわからない）がオフィスにありました。

**ここからは`これにモンスターボール Plusを吊るす作戦`です。**

少し前に[Groveの電磁石モジュール](http://wiki.seeedstudio.com/Grove-Electromagnet/#play-with-arduino)というものを目的なく購入しました。オフィスに転がってたので使ってみます。

<img src="https://i.gyazo.com/583fe478588e027fb9759e557302a7a8.gif" width="500">

> https://www.instagram.com/p/BqMZoTbDkLg/

これ電子工作的に信号送ることで磁力が発生するというモノで、結構面白いんですけど、なかなか使い所が難しんですよね。ということで試してみます。

紐に、金属（スマホSIMのつまようじ）を貼り付けて磁力をon/offしてみます。

<img src="https://i.gyazo.com/e945187483b68e954ceb2db58dced3e3.gif" width="400" >

**ビクとはしたけど磁力の適用距離の取り方が絶妙で難しい。。。**

・
・
・

**結果: 調整でイラつきそうだったので断念**

電磁石モジュールは他に何に使えるだろう...

### 試作No.3: DCモーター + セロテープ + スマホ固定するアーム

磁力の限界を感じたので物理的に攻めます。DCモーターを動かしてみます。

<img src="https://i.gyazo.com/7d373285b50153dc4bcc96cda488e8c4.jpg" width="300">

そしてDCモーターでペシペシ叩くイメージです。

<img src="https://i.gyazo.com/b1c35ae2998d3019cc16bac1313a24be.png" width="400">


では試します。

<img src="https://i.gyazo.com/f73f4c21f3fbfda46254dd6d9a84a955.gif" width="400">

**悲しいことにビクともしませんでした。**（デジャブ）

・
・
・

**結果: セロテープが弱すぎて失敗**

でも風は結構出てたので卓上扇風機にはなりそう。

### 試作No.4: No.3に爪楊枝を追加

セロテープが弱いので爪楊枝で強化しました。

<img src="https://i.gyazo.com/be5e8d19a5e2573182d354d141795f59.png" width="400">

試します。

<img src="https://i.gyazo.com/8fa8da68125f669124eade5e5d42582d.gif" width="400">

**結構いい感じに振動を与えられてます！**

ただ、 **勢いが強くてやはり怖いのと、モンスターボールにガシガシぶつかるので破損が怖い 苦笑**

・
・
・

**結果: 今までの中では良さげ。だけどデバイスへのダメージが怖い**

（ないと思うけど）試す場合は危ないので爪楊枝の尖ってるところは削りましょう。

### 試作No.5: サーボモータ + スマホ固定するアーム

DCモーター（というかさっきの作りだと電圧制御などもしてない）だと勢いが良すぎるのでサーボモータ（角度が制御できるやつ）を使ってみます。最初からこれ使えよって話かもしれない。

使ったのはみんなが大好き[SG90](http://akizukidenshi.com/catalog/g/gM-08761/)です。
オフィスに転がってた割にシャフトがちゃんと付いててよかった。いつもよく失くす。
<img src="https://i.gyazo.com/4f9382bb050939701a25bdbfffb735c9.gif" width="500">

**これはかなりいい動きです！**

これで1分くらい動かしてみた後に、Nintendo Switch側と連携して経験値がどれくらい手に入ったかを確認します。

・
・
・

・
・
・

<img src="https://i.gyazo.com/92c8acd7f9b8ab0375b3dfb6c890604b.jpg" width="400">


サン！ <img src="https://i.gyazo.com/97ce5dc28283ff6c3bace7046e2bc42d.png" width="100">

**結果: 今までの中では一番良さげ。ただ経験値を稼ぐのに時間が掛かりそう**

### 試作No.6: サーボモータ(改)

発送がスマホ固定アームに囚われてたので、シンプルにしてみました。

<img src="https://i.gyazo.com/36363df0f6584f326091202defe73762.png" width="300">

こんなイメージで固定して、サーボモータを動かすことでモンスターボール Plusを上下運動させました。さっき経験値がたまりにくかったのは上下運動が少なかったからかも。

<img src="https://i.gyazo.com/520a1dab3ff87e0d06f08a48938dbe7c.gif" width="400">

無駄にLINE Things連携も作ってみました↑。（[NefryBT](https://dotstud.io/docs/nefrybt/)がLINE ThignsでLINEと繋がってます。）

> 参考: [たぶん最速！LINE Things ハンズオン in Node学園祭2018 #nodefest](https://qiita.com/n0bisuke/items/ca6432154a590d0d4daf)


さてどうでしょう。30秒くらい動かしてみました。

・
・
・

<img src="https://i.gyazo.com/92c8acd7f9b8ab0375b3dfb6c890604b.jpg" width="400">

サン！ <img src="https://i.gyazo.com/97ce5dc28283ff6c3bace7046e2bc42d.png" width="100">

**結果: 今までの中では一番良さげ。さっきのよりも半分の時間で経験値3をGET**

## とりあえず今回の最終形

長くなってきたのでこの辺で（急に）最終形を紹介します。
~~書くの疲れた~~

<img src="https://i.gyazo.com/80d87ad7dfc9e13269fef2e93e67569d.gif" width="700">

笑

...ここまで飛ばさずに読んでくれた人からすると、急にその機構どうした!?って感じですが

### 試作No.7 謎の機構

![](https://i.gyazo.com/92206ea97e2d8ef2c24e84f82f5fb4c1.gif)

**オフィスで放置されている謎の機構が見つかりました。**

昔[ちゃんとく氏](https://twitter.com/tokutoku393)が作ったやつみたいです。

> [初のリスケ開催！久しぶりにゆったりした雰囲気だったIoTLT vol35 ツイートまとめ！ #iotlt](https://togetter.com/li/1193660)

探したらその時の投稿なども出てきましたが、大雪でリスケした時の回だったみたいです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ちゃんとく氏、トイレのためにギアを作るも空振りワロタww <a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a> <a href="https://t.co/grlL7mt9ea">pic.twitter.com/grlL7mt9ea</a></p>&mdash; 大熊 元気＠デジタルツイン (@JNTEST23) <a href="https://twitter.com/JNTEST23/status/956855991353491456?ref_src=twsrc%5Etfw">2018年1月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これは結構使えそうだなと思って採用しました。

(もっと早く見つけたかった)

実際にはこんな感じで本体へのダメージを避けつつ動作します。

<img src="https://i.gyazo.com/e1517bcd492e20634576a0727ab1ba7b.jpg" width="400">

## 機能

### とりあえず放置しておくと経験値が溜まる

![](https://i.gyazo.com/fc0f4b68dbfe659713beebb897da6b37.jpg)

12Hくらい放置でこれくらい(3654)たまりました。さっきは1分で6経験値がMAXだったので、60分で36けいけんち、12Hだと432経験値ということで **何かが圧倒的に違います。**

**当社比8.5倍の効果！**

縦と横の運動が入ったのが良かったのかも。

### LINE BOTから経験値取得のコントロールも出来る

**経験値って多ければ多いほど良い訳でもなく、ある程度コントロールしたい場合も**

これは大事で、進化などの都合でレベル上げるタイミングをある程度調整したい人もいます。
そのまま経験値を積みまくるとSwitchに戻した時に一気にレベルが上がってしまって......みたいな

現状だとある程度コントロール出来るくらいですが、LINE BOTからどれくらいモーターを動かすか制御できるようにしました。

![](https://i.gyazo.com/aea140e28dddd35a490759c518ef734a.gif)

LINE BOTからON/OFFの制御と経験値を溜める時間を指定できます。

LINE BOTである必要は別にないけど、最近WebでUIとか作るのがめんどいのでこういうときにBOT活用したりします笑

あと、 **こじづけっぽいけどIoT要素として大事です！**

## 作り方

使ってる技術要素は

* GR-ADZUKI 
* Node.js / Johnny-Five
* LINE Messaging API

です。

### GR-ADZUKI

**がじぇるね賞です。** 

[IoTLT](https://iotlt.connpass.com/)で登壇すると貰えることがある賞です。
僕は過去に50回くらいは登壇しましたがこれしかもらったことがありません。笑
女性と学生は登壇すればほぼ100%貰える気がします。

> 次回は12/20にオムロン開催 https://iotlt.connpass.com/event/111617/

[GR-ADZUKI（じーあーる あずき）](http://gadget.renesas.com/ja/product/adzuki.html)はまじめに言うと、ルネサスさんがやってるGRシリーズの開発ボードで、ロボット制御などに向いてるボードです。 **最初からモータードライバーが付いててGR-ADZUKIだけでDCモーターを動かせます**（通常は別途購入する必要がある）。

### とりあえずモーターを動かしてみる

とりあえず **オフィス転がってた先ほどの機構についてるモーター**を配線してみます。

<img src="https://i.gyazo.com/389d5e3547a98900fbf5342ffa4fcf15.jpg" width="500">

公式のピンマップを見ると **9と10のピンがモーターとして使えることが分かります。**
（試してないけど11と6も使えそうですね）

> ![](http://gadget.renesas.com/ja/product/images/pc/pin_map_adzuki.png)
> 公式のピンマップ http://gadget.renesas.com/ja/product/adzuki.html

プログラムは[IDE4GR](http://gadget.renesas.com/ja/product/ide4gr.html)というArduino IDE的なIDEで書き込みをします。

```motor.ino
#include <Servo.h> 
const int MotorPin1 = 9;   // DCモーターPIN 1
const int MotorPin2 = 10;  // DCモーターPIN 2
const int SPEED = 200; //モータのスピード

void setup()  {  
  //モーター初期化
  pinMode(MotorPin1, OUTPUT);
  pinMode(MotorPin2, OUTPUT);
  analogWrite(MotorPin1, 0);
  analogWrite(MotorPin2, 0);
}
 
void loop()  { 
  analogWrite(MotorPin1, SPEED);
}
```

USBケーブルを接続してこれで書き込みするとモーターが動いてくれます。

基板についてるスイッチが二箇所あります。

* USB <-> BATT: USB側
* Sketch <-> Scratch: Sketch側

にします。

これでとりあえずDCモーターが動きます。

### GR-ADZUKIでJohnny-Fiveを動かす。

[Johnny-Five](http://johnny-five.io)はNode.jsでArduinoなどの開発ボードを制御できるフレームワークです。

<img src="https://i.gyazo.com/1adfb2b569d2eab92b96fbc4604352e9.png" width="300">

けっこういろいろなデバイスに対応してて、普段JS書いている人がプロトタイピングするときに便利です。

ただし、今回のような場合は母艦機でNode.jsを動かしす形になるので、独立駆動させる場合は注意が必要です。Raspberry Piなどで動かせば問題ないです。

#### Firmata書き込み

IDE4GRのファイル>スケッチの例>Firmata>StandardFirmataを選択してFirmataプログラムをGR-ADZUKIに書き込みます。

![スクリーンショット 2018-12-01 9.04.21.png](https://qiita-image-store.s3.amazonaws.com/0/35387/88a6061e-0011-e50f-2985-baea276dc64e.png "スクリーンショット 2018-12-01 9.04.21.png")

Firmataのファームを書き込む時は先ほど同様にスイッチを

* USB <-> BATT: USB側
* Sketch <-> Scratch: Sketch側

にしておきましょう。

#### Johnny-Fiveでモーター制御

母艦機でNode.jsプログラムを起動させます。

ちなみに、母艦機スペックはこんなです。

* macOS Mojave / Mac Book Pro
* Node.js v11.0


```app.js
'use strict';

const MotorPin = 9;

const five = require("johnny-five");
let board = new five.Board();

board.on("ready", () => {
  let motor = new five.Motor({pin: MotorPin});
  motor.start();
});
```

これで9番ピンのモーターが動いてくれます。

```
node app.js
```

単純なモーター制御は[サンプルコード](http://johnny-five.io/examples/motor/)があるので楽ですね。

#### LINE連携

以下を参考に、Node.jsでLINE BOTを作成します。

> 参考: [1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d#2-nodejs%E3%81%A7bot%E9%96%8B%E7%99%BA)

参考記事のコードのserver.jsの一番最初に、以下を追加

```server.js
const MotorPin = 9;
const five = require("johnny-five");
let board = new five.Board();
let motor;
board.on("ready", () => {
    motor = new five.Motor({pin: MotorPin});
    board.repl.inject({motor: motor});
});


・
・
・
省略
```

さらにserver.jsのhandleEvent()を以下に書き換えます。

```server.js
function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  if(event.message.text === 'on'){
    motor.start();
  }else if(event.message.text === 'off'){
    motor.stop();
  }else if(event.message.text >= 1000){
    motor.start();
    board.wait(event.message.text, function() {
        motor.stop();
    });
  }

  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: event.message.text //実際に返信の言葉を入れる箇所
  });
}
```

雑ですが、Johnny-Fiveを使うとこんな感じで他のNode.jsプログラムとマイコンボード制御が簡単に連携できます。

## 結果ポケモンマスターになれたのか

(ポケモンマスター=チャンピオンリーグ制覇であれば) **なれました！**

実際のところ、 **ポケモンマスターの定義ってなんなんだって話を突き詰めると哲学的です。**

> [ポケモンマスターとは？意味や定義をサトシの２０年を通して学ぶ](https://pokemon-kouryaku.com/pokemon-master/)

ストーリー的にリーグ制覇はしたので問題ないでしょう。
この仕組みがあったからかどうかは不明ですが、レベル上げ貢献はしてくれてます笑

特に今回のシリーズは相棒ポケモン一体だけでも、いろいろなタイプの技を覚えられるので、（この仕組み使っても使わなくても）一体だけレベル上げまくって1体だけでリーグ制覇も可能です。

あとは、151匹の図鑑制覇ってところだと、レベルあげとはまた別の要素が発生するので図鑑制覇=ポケモンマスター(?)的な話だとまだまだ検討事項ありそうですね。（ボールをうまく投げるハックとか...?）

何にしても、モンスターボール Plus 面白いデバイスなので、BLEハックとかもできればやりたいですね。

そんなところで締めます！ この辺の発表は[12/20のIoTLT](https://iotlt.connpass.com/event/111617/)でも話したいと思ってます。ぜひお越しください。

明日のここのIoTLTアドベントカレンダーはIoTLTでお馴染みの@GenkiOkumaさんですね！
いつもVR x IoTテーマでやられているので今回も楽しみです :)

今年は3つもIoTLTアドベントカレンダーあるので他もぜひ見てください。

> * https://qiita.com/advent-calendar/2018/iotlt
> * https://qiita.com/advent-calendar/2018/iotlt_neo
> * https://qiita.com/advent-calendar/2018/iotlt_mitz

ではでは！