メカナムホイールカーを作る

# つくったもの
メカナムホイールの車をつくりました。
PS4のコントローラで操作ができます。
Meta Quest3のブラウザで車視点の画像をストリーミングで見ることができます。

![mecanum.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/5c7e4fba-a273-7a1d-14a1-4d1dc3851ed7.jpeg)

3D CADデータ Viewer（いつまで公開するか不明）
https://a360.co/3FV13eT

Github
https://github.com/morikentech/MokumokuCar?search=1

# 対象読者
・暇な人
・メカナムホイールに興味があるけど手を出せてない人
・Jetbot作りかけで飽きた人
・3Dプリンタで筐体作りたいけどコツがわからない人
・文化祭の出し物に困ってる人
・外から見てそれっぽく見える電子工作を簡単にやりたい人

# 環境
WinPC > VSCode > PlatformIO

# 使用したもの
・TTモータ
・メカナムホイール
・M5StackCore2
・Adafruit Feather Wing Motor Driver
・M5 Camera（2023.11.16時点ディスコン）
・PS4デュアルショックコントローラ
・Meta Quest3
・3D Printer（Anker Make M5）
・電池ボックス（単3 x 8本）
・モバイルバッテリー　2口以上のやつ
・ジャンプワイヤ、ネジ、ユニバーサル基板、はんだ系

# 構成
プレステのコントローラと手元にあるドライバで動かしたかったのでこんな構成です。
後から思いつきで追加したカメラ側は完全に車側からシステム分離しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/08b402b0-5967-bb51-82fb-ed2a5d055423.png)

# つくろうとした背景
妻が都内で[地域の工作室](https://mokuhari.com/)をやっていて、そこの[文化祭](https://mokuhari.com/f3136ff1d9a34defad6fdd05f735aca5)を開くとのことでした。

出店のワークショップがすでに予約が埋まってたりするのをみて、
「当日飛び込みで来た人が楽しめるものあるといいよね、脱出ゲームとか宝探しみたいな要素とか」と言ってしまったのが発端です。

「じゃあ、それで（よろしく）」

お店の中を車走らせて地面近くのところに暗号をばら撒いてそれをカメラで見て集めるアトラクションを作ることに。

口は災いのもと、ヨーグルトは健康のもと。
# お世話になったライブラリたち
```
#include <M5Core2.h>
#include <PS4Controller.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
```
新しい要素減らしたくてM5 Unified使わなかったんですが、、シンプルなのでまぁ。

## ライブラリでハマった
utility/Adafruit･･･のエラーが出まして、下記Forumを参考に名前を変えたらうまくいきました。
https://forums.adafruit.com/viewtopic.php?t=90140

#include "utility/Adafruit_PWMServoDriver.h" (this does not work)
#include "utility/Adafruit_**MS**_PWMServoDriver.h" (this works)

# 3DデータはGrabCADで拾ってくる
DCモータの3Dデータ
https://grabcad.com/library/dc-3v-6v-tt-motor-1

メカナムの3Dデータ（タイヤ径だけ同じ類似品で妥協）
https://grabcad.com/library/mecanum-wheels-60mm-1

M5Core2やAdafruit Feather Wingも適当に検索すると出てきますので省略。

# Bluetooth接続でハマった
ペアリングでハマったのでこちらを参考にしました。
コントローラにMACアドレスを書き込みしてしまう方法みたいです。
https://qiita.com/Geek493/items/8402ad875b88822e75ab

# モータ制御でハマった
### デッドゾーン適用
あとは冒頭のGithubのコードで動いたんですが、いくつか最初うまくいかなくて調整した部分をピックアップします。

PS4コントローラは軸がデフォルトで倒れて値が0にならないので手を離しても動いてしまう問題がありました。あと、感度が敏感過ぎて扱いづらい。
なので、デッドゾーンを設定しました。
```
// デッドゾーン適用
if (abs(leftStickX) < deadZone) leftStickX = 0;
if (abs(leftStickY) < deadZone) leftStickY = 0;
if (abs(rightStickX) < deadZone) rightStickX = 0;
```
PS4コントローラは端から端までで-127~127の値が取れるのですが、**deadZone = 20**でほどほどになりました。

### モータの回転方向と速度設定
最初、自分で適当に作成したところ、右はゆっくりなのに左は全速力！みたいな挙動になりました。
コントローラの入力を絶対値化しつつ、方向を取得して、、、と**考えすぎて迷子状態**でした。

ここで潔くChatGPTさんにコード全文とメカナムホイールの挙動のまとまった画像を読み込んでもらい修正を依頼したところ、あっという間に正常化しました。

ついでにリファクタリングを頼んでも文句一つ言わずにやってくれました。

「汚いから直しました（意訳）」

# モータドライバの配線でハマった
[Adafruit Feather Wingのモータドライバ](https://www.adafruit.com/product/2927)はJetbot（JetsonNanoを使ったAIカー）の推奨ドライバなのですが、あまり使っている人を見たことがないです。

これの配線が本家サイトだと適当すぎて回路図見ないとわからないので、ここで簡単に紹介します。

モータドライバには**14本**の線を繋ぐ必要があります。
・緑部分：モータに供給する電源として電池ボックスから繋ぐところ　+-2本
・赤部分：モータに繋ぐところ　2本xモータ4個 = 8本
・黄色部分＋青部分：マイコンに繋ぐところ　4本

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/b1637013-f2a0-c7aa-f9e7-674534473097.jpeg)

### 緑部分　電池ボックス配線
図の左、ボードの端側が-です。
これはよく見るとシルク印刷があります。
### 赤部分　モータ接続部
これはマニュアルでもわかりやすいです。
左側がM1, M2、右側がM3,M4です。（たぶん）
### 黄色部分　マイコンの3.3VとGND
左から2番目と4番目のピンに繋がっています。
2番目が3.3V、4番目がGNDです。
### 青部分　マイコンのI2C接続部
図の右、ボードの端側がSDA、その左隣がSCLです。

### 余談
簡単に解説した資料ないかなーって探しつづけ、諦めて回路図見るまでに時間がかかりました。
さらに、ずっとマイコン側でINT SDA, INT SCLに接続してて全然動かなかった、、INTはINTERNALですかね。
M5StackCore2の場合、**PA_SDA, PA_SCLが正解**です。
ただでさえピン位置を数え間違えやすいので注意です。

# 3Dモデリング
3DモデルはFusion360を用いました。
モデルデータはGithubにあげましたが、ポイントをいくつかピックアップします。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491945/28741179-241c-4e30-d1c2-dd7186ce2e1c.jpeg)


### 上下カバー割り　タッピンネジで固定
モータを入れた本体を上下カバーに分割しました。（図の透明とグレー）
材料は3DプリンタのPLAで、その結合はタッピンネジを用いました。

タッピンネジサイズは**M2.6**x長さ適当で、下穴のサイズは**Φ1.65**です。

タッピンネジは雌ねじがない中でもネジを切りつけながら進むネジです。
再利用がしづらい反面、下穴にネジを切らないで済むのが長所です。

**M2.6~M3のタッピンには直径1.65の穴を開けておけば大体OKです。**（保証はしません）

ネジはカバー割面でコンニチワするように中空のボスを伸ばして作成します。

### 上下カバー位置決め
位置決めは簡単にして、下側のカバーから**リブを何本か出して前後左右の動きを規制**しました。
図のグレーの箱の内壁から上に伸びてる棒状のものです。
先端に面取りをすることでスムーズに合体できます。

### モータ周りの余白
3Dプリンタでモデリングするときは**0.5 mm程度の余白を作るとうまくハマる気がする**ので、全体的に0.5 mmの余白を作りました。

### 配線整理用のフック
これを付けると配線がバラバラにならないので組み立てがとても楽になるのでオススメです。
**リード線相手なら隙間1.0 mm程度でフックを作る**とキツキツで良い感じです。

# Quest3で1人称視点の画像を取る
元々はPC画面で見ようかなーと思ってたのですが、PCでできるならQuest3でも当然できるだろうということでQuest3を使いました。

これは大したことしてなくて、Quest3のWifi設定からM5 CameraのWifiに接続できます。
その状態で**標準ブラウザ**を開いて192.168.4.1に接続するとM5 Cameraの画像をストリーミングできます。

**M5 Cameraが元々そういう仕様**で、なんの工夫もなくQuest3の標準ブラウザで接続しただけです。

MRなので車本体を3人称視点で操作しつつ、時折、空中に浮くブラウザから1人称視点を見る、
みたいにするとけっこう楽しいです。

これの欠点は、オンラインに出ていけないことです。
実を言うと、PCにM5 Cameraを映すとQuest3に繋げなくなると気づいて、もうQuest3だけ映ればいいやってなりました。

そういうのよくわからないので、得意な方教えてください。。

# まとめ
・PS4コントローラはMACアドレスを書き換えると簡単
・デッドゾーンは設定しよう
・ChatGPTにコードを書かせる、資料も読ませる
・M5 Camera + Quest3でぽくなる
・3Dモデルのクリアランスは0.5 mm, ネジ穴はΦ1.65
・あまり余計なことは言わない
・文化祭を楽しもう