ポケモンGOプラスを完全自動化Hack（物理）してみました

発売日にAmazonで運良く「Pokémon GO Plus」を手に入れることができました。

ポケモンGOプラスの登場により通知がきたらいち早くボタンを押すゲームと化したポケモンGOですが、
物理的にボタンを押すだけなら、簡単に自動化できそうだったので**Arduinoで自動化してみました！**
![タイトルなし.gif](https://qiita-image-store.s3.amazonaws.com/0/7132/b648091d-2307-d78e-f0a4-ce7b10ff4234.gif)
ポケモンGOプラスが反応したら検知して、サーボモーターでボタンを押せるようなものを作りました。

## 材料

```Pokémon GO Plus```本体と制御のための```Arduino Uno```

| 部品 | 画像 | 値段 |
|:--|:--|:--|
| Pokémon GO Plus | <a href="https://www.amazon.co.jp/Pok%C3%A9mon-GO-Plus-%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3-%E3%80%90Amazon-co-jp%E9%99%90%E5%AE%9A%E3%80%91%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E5%A3%81%E7%B4%99/dp/B01IO57DAM/ref=as_li_ss_il?ie=UTF8&qid=1474300327&sr=8-4&keywords=%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3go+plus&linkCode=li2&tag=corelar-22&linkId=5081bcfe9f51953b8067429789f6f710" target="_blank"><img src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B01IO57DAM&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=corelar-22" width="150" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=corelar-22&l=li2&o=9&a=B01IO57DAM" width="1" height="1" style="border:none !important; margin:0px !important;" />| 3,780 |
| Arduino Uno | <a href="https://www.amazon.co.jp/%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-%E3%80%90%E6%B0%B8%E4%B9%85%E4%BF%9D%E8%A8%BC%E4%BB%98%E3%81%8D%E3%80%91Arduino-Uno/dp/B0044X2E5S/ref=as_li_ss_il?ie=UTF8&qid=1474552192&sr=8-3&keywords=arduino&linkCode=li2&tag=corelar-22&linkId=3a5f623c29bcddf59b8ca892fe68ad65" target="_blank"><img src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0044X2E5S&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=corelar-22" width="150" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=corelar-22&l=li2&o=9&a=B0044X2E5S" width="1" height="1" style="border:none !important; margin:0px !important;" /> | 3,240 |


材料はたったこの２つ、Arduinoの初心者セットに良く入っている```圧電スピーカー```と```マイクロサーボ```です。

| 部品 | 画像 | 値段 |
|:--|:--|:--|
| マイクロサーボ SG92G | <a href="http://akizukidenshi.com/catalog/g/gM-08914/" target="_blank"><img src="https://qiita-image-store.s3.amazonaws.com/0/7132/9ab41fa3-6d29-db86-ded1-ef2d2c165bbb.png" width="150" ></a> | 500 |
| 圧電スピーカー SPT15 | <a href="http://akizukidenshi.com/catalog/g/gP-04228/" target="_blank"><img src="https://qiita-image-store.s3.amazonaws.com/0/7132/f6fa3e74-95cd-5205-7cee-396c5c50409b.png" width="150" ></a> | 100 |

また、ジャンパーワイヤ、両面テープ、結束バンドなども使っています。
既にArduinoを持っていれば秋月電子で送料込みで1000円以内で自動化ライフが始められますね。


# 作り方
## 圧電スピーカーを分解

今回は手元に圧電スピーカーしかなかったので、圧電スピーカーを分解し圧電素子を取り出します。

圧電素子だけでも売っているので、こっちの方が５０円お得

| 部品 | 画像 | 値段 |
|:--|:--|:--|
| 圧電サウンダ FGT-15T-6.0A1W40 | <a href="http://akizukidenshi.com/catalog/g/gP-09798/" target="_blank"><img src="https://qiita-image-store.s3.amazonaws.com/0/7132/92a4b479-6efc-06ff-edf7-3a30ead47fa9.png" width="150" ></a> | 50 |

爪で引っかかってるだけで結構簡単に外れるので、裏蓋をパカっと外して圧電素子をとりだします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/7132/70a1a98b-4fb8-7d30-ad01-4f7321b13f7f.png" width="300" ><img src="https://qiita-image-store.s3.amazonaws.com/0/7132/99656971-444e-28af-e3f9-7b91d8a05b54.png" width="300" >


## 圧電素子をセンサーとして使う

電圧を加えると振動して音を出のが圧電スピーカーですが、逆に外部から与えられた振動を電圧に変換することもできます。
今回はこの効果を利用しセンサーとして使います。

圧電素子から伸びるワイヤーを```GND```と```A1```に繋ぎます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/7132/479d4704-6ba0-64c2-f423-6a4f8c689fb2.png" width="400" >
（圧電素子のイラストなかったので圧電スピーカーで代用）

Arduinoで```analogRead()```で圧電素子の値を読み取ります。

```cpp
void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(1);
  Serial.println(sensorValue);
}
```

このコードをArduinoに書き込み、圧電素子を指で叩いてみると数字が変動しセンサーになっているのが分かります。

<img width="673" src="https://qiita-image-store.s3.amazonaws.com/0/7132/2108c5f8-ae43-a6dc-6be2-76f238b9a5cd.png">

## ポケモンGOプラスの振動を検知する

ちょうど良くポケモンGOプラスの裏のクリップが付いているので、ここに圧電素子を挟みました。
これでポケモンGOプラスのバイブを検知できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/7132/8a7347f6-31d5-3594-2184-78651160d470.png" width="300" ><img src="https://qiita-image-store.s3.amazonaws.com/0/7132/c82a5d58-7980-604c-500b-c47424ab0149.png" width="300" >

コードはこんな感じ、センサーの値が150を超えたらボタンを押すという想定。

```cpp
void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(1);
  if (sensorValue > 150) {
    Serial.println("push!");
    delay(5000);
  }
}
```

閾値は環境によって変動するので調整してみてください。


## サーボモーターを動かしてみる

頭には付属でついてくる、片側しかないやつをネジ止めしておきます。このとき０度のときに上から見てサーボモーターからはみ出ないような位置でセッティングしてください。
<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/7132/956b6614-8538-a572-623e-cb42bcdc613c.png">


そしてサーボモーターから伸びるコードとArduinoの```５V```と```GND```と```D8```にそれぞれ接続します。

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/7132/13209a2f-e676-2b2d-63b6-59cd03dfc79f.png">

先程のセンサーと組み合わせて、通知がきたらサーボモーターで15度動かして、すぐに元の位置に戻すという動作をします。

```cpp
#include <Servo.h>

Servo servo;
int SERVO_PIN = 8;

void setup() {
  servo.attach(SERVO_PIN);
  servo.write(0);
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(1);
  if (sensorValue > 150) {
    servo.attach(SERVO_PIN);
    servo.write(15);
    delay(500);
    servo.write(0);
    delay(7000);
  }

  if (servo.attached()) {
    servo.detach();
  }
  delay(5);
}
```

サーボを動かした後にdelayで７秒間待っていますが、これはdelayを行わないとポケモンを捕まえたときの振動にも反応してしまうためです。
あと使わないときは```servo.detach()```しないと待機音が結構うるさい。


## ポケモンGOプラスとサーボモーターを固定する

ここからは力技です。
両面テープでサーボモーターでボタンを押せる位置に合わせて、結束バンドで動かないように固定してしまいます。

![Artboard.png](https://qiita-image-store.s3.amazonaws.com/0/7132/432c5d6b-c7d0-05c7-c1cd-e19a9236202e.png)

最初ビニールタイでを使ってたのですが使用しているうちにズレてきてしまったので、結束バンドにしたら良い感じで固定できました。


## 完成！動かしてみる！
最終的にこんな感じで動かしています。
![Artboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/7132/a78ac931-45d1-b638-2777-5ef2b8b47404.jpeg)

これで24時間ポケモンが現れた瞬間に捕まえてくれています。お台場にまる１日放置してみたいｗ

![タイトルなし.gif](https://qiita-image-store.s3.amazonaws.com/0/7132/b648091d-2307-d78e-f0a4-ce7b10ff4234.gif)

**あちゃんでいいの**とか**Arduino Nano**とか小さいマイコンに取っ換えれば、多分ポータブル化できる、はず。