Nintendo LaboをハックしてESP-32 Laboにした話

こんにちは。
IoTLT Advent Calendar 2018 Mitz(三つ目)のトップバッターを飾らせていただきます。
こう見えて、実はアドベントカレンダーを書くのもQiitaで記事を書くのも初めてだったりします。よろしくお願いします。
>この記事は今年の5月に開催された『第5回秋葉原IoTツアーズ』というハッカソンイベントで発表した内容の~~デジタルリマスター版~~再編集です。

#きっかけはヒカキンさん
さて、うちには娘が二人いるのですが、小学校低学年の上の娘が最近Youtubeでヒカキンさんのヒカキンゲームズをよく見ています。そこで、2018/4/20に発売したNintendo Laboを遊んでいる映像を見て「これ楽しそう！やりたい！」と言っていたのです。

しかし、うちにはNintendo Switchはありません。
Switchはおろか、ゲーム機と呼ばれるものは一切ありません。
娘が小さいころに某住宅展示場のイベントでNintendo64が当選したことがあるのですが、即ヤフ○クに行ってしまったという経緯まであったりします。

そんな家に産まれた娘には、LaboはSwitchで遊ぶものという認識がないので、「これ、いくらするの？」と聞かれて「うーん、ちょっとまってね。（カチャカチャ）…7－8,000円くらいみたいだね」と答えてしまったら、当然の様に「パパこれ買って！！！」

いやいやいやいやいやいやいやい。。。ちょっと待てい！
その数千円の段ボールキットとソフトを買うだけで遊ぶことができるモノではなく、ソフトを動かす「ハード」をが必要で、それが3万円以上するんだよ。お年玉より高いんだよ。と説明しました。
('ε'*)「ふーん・・・そうなんだ」

まぁ、そうなるよね！
しかし、そこでへこたれる娘を放置するパパではない！
「わかった！パパに任せろー！~~（バリバリ）~~」（心の声）
丁度、リモコンカーというのがあるのを知って、自分も気になっていたので、何とか作ってやろうと思ったのでした。

皆さんもまだクリスマスに間に合うので**Let's Try!!!**
#とりあえず材料集めから
なんと、Nintendo Laboはホームページから型紙がPDFでダウンロードできるんですね。材質が段ボールなため、破損した時の補修用として顧客サービスなのでしょうか。~~よし、悪用しよう！~~
それに、会社のフロアの端に段ボールが無造作に積んであるのはきっと神様からの啓示に違いない！

他にもいろいろと都合の良いものが揃っていて、手元にあったのは以下の通り。
##なぜか手元にあった材料
・**以前使ったことがある**Blynkアプリケーション
　→詳しくは[ここ](https://www.blynk.cc/)を参照。

・**会社のプリンタで印刷した**NintendoLABOの「リモコンカー」型紙
　→[ここ](https://www.nintendo.co.jp/labo/parts/)にあります。

・**会社のレイアウト変更で使用した廃棄予定の**段ボール
　→厚さ2.5～2.0ｍｍ程度の薄いものがおススメ

・**目的もなく買った**[ESP-32マイコン](https://www.aliexpress.com/item/WEMOS-WiFi-Bluetooth-Battery-ESP32-development-tool-ESP32-battery-esp8266-ESP-WROOM-32-ESP32/32819459737.html)
![ESP-32-300x300.jpg](https://qiita-image-store.s3.amazonaws.com/0/316614/a2f42bba-5538-ff9d-a967-705f8178c58c.jpeg)
技適がついてるESP-32に、更に電源も搭載できる、非常に便利なマイコンボードです。

・**目的もなく買った**[2chモータードライバー](https://www.aliexpress.com/item/Dual-Motor-Driver-1A-TB6612FNG-for-Arduino-Microcontroller-Free-Shipping-1PCS/1977454280.html)
![MOTOR-300x219.jpg](https://qiita-image-store.s3.amazonaws.com/0/316614/fc5b999a-28fd-d169-f6d8-6f761de30c33.jpeg)
とりあえずモーターをドライブしたくて買ってあったみたいです。
~~サンライトイエローオーバードライブ！！！~~

・**懐中電灯用に本数買い過ぎた**[18650電池](https://www.aliexpress.com/item/GTF-3-7V-18650-Battery-9800mah-Li-ion-Rechargeable-Battery-For-LED-Flashlight-Torch-or-electronic/32919990388.html)
![18650-300x285.jpg](https://qiita-image-store.s3.amazonaws.com/0/316614/1d0e7ab3-6c7b-f20e-1c5b-b34d6c942ebc.jpeg)
…まぁありますよね。こういうもの。

・**目的もなくまとめ買いした**[サーボモーター](https://www.aliexpress.com/item/10pcs-lot-lofty-ambition-SG90-9g-Mini-Micro-Servo-for-RC-for-RC-250-450-Helicopter/32680024453.html)
![Servo-300x300.jpg](https://qiita-image-store.s3.amazonaws.com/0/316614/87543ab1-aa36-e73b-8c30-08875d1f89ef.jpeg)
これも安い買ったからつい買ってしまったモノ。

・**いつ買ったかも覚えていないJUNKの**ガラケー用バイブレーションモーター
![IMG_0625.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/97f328f4-2660-1164-2385-07f4c8fc8835.jpeg)
詳細不明です。記憶が不鮮明ですが、たぶん「現品.com」で購入したモノだと思います。
吉野電装さんが運営されていた独特な注文方法のJUNK品ばかりを扱っている通販サイトです。最盛期は2003～2004年頃だったでしょうか。某巨大掲示板でも常に話題になるほどで、私も当時はだいぶお世話になりました。

##（；`・ω・）o━ヽ_｡_･_ﾟ_･_フ))作るよ！！
なんだ。材料ほとんど揃ってるじゃないか。神様が「今作れ」と言っているな！？
しかもちょうど今定時過ぎたし！

という訳で18時から工作を始めて3時間程度で一気にプロトタイプを作り終えました。
#じゃーん！完成です！
リモコンカー！
![IMG_0621.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/4167c042-090d-be6d-48bf-b0254d09df1d.jpeg)
すごい！リモコンカー（↓本物）っぽい！！！
ちなみに、ゾウさんの様な顔を勝手ににつけてみましたが、ここにこのようにつけるモノなのかどうかはわかりません！
![R-Car.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/79fc1928-77d9-0691-5061-37eeba53047d.jpeg)

中身はこんな感じです。う～ん、雑っ！
![IMG_0622.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/ac5e5cd6-e099-ebe7-3e75-8567aad3e538.jpeg)
顔はサーボで回ります。
![IMG_0623.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/4e76f8cd-0f28-9b3a-fec2-30ebdf270f86.jpeg)
顔を取るとサーボが丸見えです。
![IMG_0624.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/eb60109e-09ed-84f2-34c8-8851750545e0.jpeg)

#作り方(概要)
それでは、作り方の解説、行ってみましょう！
まずは順番に目次として紹介。
こんな内容で作成しました。

1.まず、服を脱ぎます！！！

・・・

嘘です。
いや、別に脱いでも良いです。寒いので適当にしましょう。

##外装編
・段ボールに型紙を貼る

・適当に切る（カッターでは非常に切りづらいのでレーザーカッター欲しい！）

・切り出した段ボールを組み立てる

・サーボ・モーターを固定する穴を空ける

##電子工作編
・回路を考える

・適宜配線する

・マイコン・モーター・サーボを固定する

##プログラミング編
・コーディングする

・ArduinoIDEでマイコンにプログラムを書き込む

・完成～♪

#作り方(詳細)
ここからは詳細を記します。

##外装編
###段ボールに型紙を貼る
　→ダウンロードした型紙PDFは、A3に印刷すると良い感じの大きさになります。ノリをかなりしっかり貼らないと、意外と簡単に剥がれてきますので頑張って！
###適当に切る
　→きっと、レーザーカッターが欲しくなる呪いにかかります。
###切り出した段ボールを組み立てる
　→この工程で結構大変な思いをするので、段ボールは割と薄いものがおススメです。私は厚さ3㎜程度のものを用いたのですが、もう少し薄い2.5~2.0の物の方が良さそうです。
もしくはおとなしくレーザーカッターを買いましょう！
###サーボ・モーターを固定する穴を空ける
　→現物合わせになりますね。

童心を思い出して楽しみましょう！
しかし段ボールって本当に切りづらいです。
この後めちゃめちゃ・・・レーザーカッター欲しくなりました。(3回目)

##電子工作編
###回路を考える
以下の様にテキトーに配線しました。
とりあえず機能を満たすだけで、あまり何も考えていません。

モータードライバーの配線(ESP-32とモーターへ　一部サーボへ)

|端子|接続先|
|:---|:---|
|PWMA|ESP-32(4)|
|AIN2|ESP-32(2)|
|AIN1|ESP-32(0)|
|STBY|ESP-32(15)|
|BIN1|ESP-32(25)|
|BIN2|ESP-32(26)|
|PWMB|ESP-32(27)|
|GND|ESP-32(GND)|
|VM|VCCとServo(VIN)|
|VCC|ESP-32(VCC)|
|GND|-|
|A01|MotorA(1)|
|A02|MotorA(2)|
|B02|MotorB(2)|
|B01|MotorB(1)|
|GND|-|

サーボの配線(ESP-32　一部モータードライバーへ)

|端子|接続先|
|:---|:---|
|橙(PWM信号)|ESP-32(14)|
|赤(3.3V電源)|モータードライバー(VM)|
|茶(GND)|ESP-32(GND)|

###適宜配線する
上記の通り、配線します。
私の超テキトーで雑な空中配線写真を載せておきますねｗ
参考にしないでくださいね。
![IMG_1134.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/e9263bca-8198-1d97-6440-d8cbb9bae540.jpeg)
![IMG_1135.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/0829eb8b-dbeb-8a6f-af76-3a49794e1c11.jpeg)
![IMG_1136.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/53e98dd1-4bdc-3831-2de4-d86c5c2e011d.jpeg)
![IMG_1138.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/75626905-99e3-ea09-067e-dc6f0bacfd91.jpeg)
![IMG_1139.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/ee37b9f1-0d4c-e50c-f6f3-620c5c68bc58.jpeg)


###マイコン・モーター・サーボを固定する
本体にしっかり固定します。
※モーターは特にこの固定が甘いとサッパリ進みませんので、キツ目に押し込むように固定しましょう

##プログラミング編
###コーディングする
今回はBlynkを使用するので小難しいコーディングはほとんどありません。BlynkをESP-32にインストールして、上記の各GPIOピンを定義するだけで終わります。
ソースコードは以下の通りです。

```C:リモコンカー
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

// BlynkとWifiの設定
char auth[] = "Your Blynk Auth code";
char ssid[] = "Your access point name";
char pass[] = "Your password";

void setup() // GPIOの設定
{
  Serial.begin(9600);

  Blynk.begin(auth, ssid, pass);
  // モーターAの設定
  pinMode(0,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(4,OUTPUT);
  // モーターBの設定
  pinMode(27,OUTPUT);
  pinMode(25,OUTPUT);
  pinMode(26,OUTPUT);
  // STB
  pinMode(9,OUTPUT);
  // ESP-32オンボードLEDの設定
  pinMode(16,OUTPUT);

  // モータードライバー初期設定(停止状態)
  digitalWrite(2,LOW);//A2
  digitalWrite(4,HIGH);//PWM A
  digitalWrite(26,LOW);//B2
  digitalWrite(27,HIGH);//PWM B
  digitalWrite(9,HIGH);//STB

  // サーボの設定
  ledcSetup(0, 50, 10);  // 0ch 50 Hz 10bit resolution
  ledcAttachPin(14, 0); // 14pin, 0ch
}

BLYNK_WRITE(V0){
  ledcWrite(0, param.asInt() );
}

void loop()
{
  Blynk.run();
}
```
以上です。
本当にGPIOの定義と初期設定のみでしょ？

###ArduinoIDEでマイコンにプログラムを書き込む
USBケーブルで接続して書き込みましょう！

#遊ぼう！！！
こんな感じで遊びましょう～！
楽しい！✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
##動作している動画
[![Labo_Movie.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/f877656e-ace5-9008-08a3-f6b9f3b77ee6.jpeg)](https://www.youtube.com/watch?v=MiuwSniEUlE)


##発表のスライド
[![Labo_SS.JPG](https://qiita-image-store.s3.amazonaws.com/0/316614/9f35cc43-42ef-fee5-dda4-f0d192f64180.jpeg)
](https://www.slideshare.net/nbihibashi/nintendo-labo-esp32)

以上、最後まで見ていただいてありがとうございました！

Have a good Christmas!!!