M5StickC Plus (ESP32)と3DプリンタとBlynkとLEGOでラジコン作った。

# はじめに
3Dプリンタが復活したので、なにか作ろうと思って、最近遊んでるM5StickCとGeekServoとをつなぐマウントを作ってみた。いい感じにできて満足。やったことを整理しておく。

https://twitter.com/optimisuke/status/1376893944814915596?s=20

# 準備するもの
## 道具
### 3Dプリンタ
Creality Ender 3 V2ってのを使ってる。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3138343232312f39653664313335342d333837382d313362352d643262642d3333326261653233333436302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/2314b561-ed3e-bb93-bb88-ba8ea256dc96.png)

参考：[3Dプリンタを選んで買って組み立てて印刷した。 - Qiita](https://qiita.com/optimisuke/items/1e4029230ff504fff55b)

### ノギス
デジタルすばらしい。
![IMG_20210330_225920.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/4d089014-d549-29d1-f99c-8f0cf98783b2.jpeg)

## 部品
合計4,000円くらい。あきたら他の用途に流用できるし、コスパ最強説。

### フィラメント 少々
PLA使ってる

### M5StickC Plus
M5StickCでもOK

[M5StickC Plus - SWITCH-SCIENCE](https://www.switch-science.com/catalog/6470/)

### GeekServo x2
このサーボが、LEGOコンパチブルで、360度回転するので、使いやすい。
[GeekServo 9G 360° Motor-Orange - SWITCH-SCIENCE](https://www.switch-science.com/catalog/6813/)

参考：[LEGOとM5StickCで動く車作った。 - Qiita](https://qiita.com/optimisuke/items/04d466e852a25444e1b0)

### ジャンパーケーブル
ケーブル必要。電源とグランドを分岐する必要あったので、ピンにはんだ付けしてる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/20bd3ea3-e306-66c8-f629-00c48b09aaed.png)

### LEGOのタイヤ x2
十字の穴があいてるやつ
![IMG_20210330_230242.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/cc255ef2-7d63-49d1-326d-efa95d92596e.jpeg)

レゴパーツのバラ売りはここが良さげ。
[レゴパーツからミニフィグまで揃う通販専門のレゴショップ ブリッカーズ](https://www.brickers.jp/)

### LEGOの接続するやつ x4
LEGO TECHNICのLEGO買うとだいたい入ってる（たぶん）
![IMG_20210330_231106.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/b0351b4a-bbb8-57fa-406f-62e90f9dd786.jpeg)

### LEGOのデコるやつ 好きなだけ
GeekServoに接続できるからデコれる。

# 3Dプリント作業
まず、3DプリンタでM5StickCとGeekServoをつなぐマウントを作成した。

## スケッチ
シンプルかつ丈夫になるように考えてスケッチした。

![IMG_20210330_232032.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/a7d79e7d-0c2e-d3ed-97cf-5045475f7cb2.jpeg)


## 測定
結構めんどい。
GeekServoとM5StickCのサイズをノギスで測った。

## モデリング
Tinkercadってブラウザからできるやつを使った。シンプル。
[Dashboard | Tinkercad](https://www.tinkercad.com/dashboard)

こんな感じになった。
![3D-design-M5StickC-Tinkercad(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/d1520e01-f6e3-a6cb-7221-e439ab1f16fe.png)

データはここにおいた。
[M5StickC Mounter for LEGO Compatible Motor by optimisuke - Thingiverse](https://www.thingiverse.com/thing:4812521)

## 3Dプリント
Curaってソフトを使ってもろもろ設定して3Dプリント用のデータに変換する。
![Screen Shot 2021-03-29 at 18.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/28e0e90d-63c1-6057-c772-2f5d658ef6be.png)

## できあがり
こんな感じ。それっぽい。

![34633.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/007f15e7-a768-5032-21b2-8251ba14dda7.jpeg)

# アセンブル
タイヤは直接サーボにつける。
![34632.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/1f5bb1d4-b7ee-1442-8fed-2e919b56e874.jpeg)

サーボと3Dプリンタで作ったマウントをつなぐ。
![34631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/056e95c2-0e02-868b-182f-04ea180d0199.jpeg)

M5StickCも接続してデコる。
![34604.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/beb7d61b-6bf9-afaf-9174-38714b7b0b5e.jpeg)

# プログラム
## M5StickC Plus
M5StickC Plus側はこのときとまったく一緒。
[LEGOとM5StickCとBlynkでラジコン作った。 - Qiita](https://qiita.com/optimisuke/items/83152e3d792b4364a0da)

```cpp
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT

#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include "esp32-hal-ledc.h"
#include <M5StickCPlus.h>

char auth[] = "YourAuthToken";

const int WIDTH_BIT = 10;
const int FREQ = 50;
const int SPEED_PIN = 26;
const int SPEED_CH = 2;
const int STEERING_PIN = 25;
const int STEERING_CH = 3;

void setup()
{
  Serial.begin(115200);
  Serial.println("Waiting for connections...");
  Blynk.setDeviceName("Blynk");
  Blynk.begin(auth);

  ledcSetup(SPEED_CH, FREQ, WIDTH_BIT);
  ledcAttachPin(SPEED_PIN, SPEED_CH);
  ledcSetup(STEERING_CH, FREQ, WIDTH_BIT);
  ledcAttachPin(STEERING_PIN, STEERING_CH);

  M5.begin();
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.setCursor(20, 40, 2);
  M5.Lcd.print("SERVO");
}

void loop()
{
  Blynk.run();
}

BLYNK_WRITE(V1) {
  int16_t steering = param[0].asInt();
  int16_t speed = param[1].asInt();
  ledcWrite(SPEED_CH, speed);
  ledcWrite(STEERING_CH, steering);
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setCursor(20, 80, 2);
  M5.Lcd.print(speed);
  M5.Lcd.setCursor(20, 120, 2);
  M5.Lcd.print(steering);
  Serial.println(speed);
  Serial.println(steering);
}
```

## スマホ
Blynk使った。
このときとほぼほぼ一緒で、設定を少しかえた。
[LEGOとM5StickCとBlynkでラジコン作った。 - Qiita](https://qiita.com/optimisuke/items/83152e3d792b4364a0da)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/842b4e3b-7e8e-d638-4f19-4ae1c769b839.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/0168b09f-3197-55d2-a4bd-5588e23ef02d.png)

# 動作確認
いい感じに動いた。

https://twitter.com/optimisuke/status/1376893944814915596?s=20

# 改善
接続部分が微妙やったので、すこし調整してプリントしなおした。M5StickCの横のスリットにあうように、ボコっとなるようにしてる。いい感じ。
![34656.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/ef33bd1d-34b7-9df2-0bed-64272bbc0ff2.jpeg)

# おわりに
いい感じに、3Dプリンタを活用できた。
息子くんもよろこんでくれて満足。