3Dプリンタでメカナムホイールを堪能
凄いものを見つけてしましました。
なんと憧れのメカナムホイールの3Dプリンタ用データを公開されている方がいたのです!
動画もありすごくいい感じに動いてる!これはプリントするしかない!
だって私はずっとメカナムホイールに思いを寄せていたのだから。
目次
メカナムホイール 3Dプリンタ出力
3Dプリンタは購入以来フル稼働で活用させていただいております。
早速メカナムホイールを出力してみました!
左右のホイールを2個づつと小さいタイヤを56個出力します。
— HomeMadeGarbage (@H0meMadeGarbage) December 23, 2019
タイヤをM3×25mmのネジでクルクル回る程度に締め付けて固定しました。
本当にできてしまった。。。
車体構成
出力したメカナムホイールの性能を確かめるべく車を製作します。
ESP32を使用してBlueToothでスマホでラジコン感覚で動かします。
部品
- BLE、WiFi内蔵マイコンボード ESP32-DevKitC-32D
- モータドライバ DRV8835
- ダブルギヤボックス
-
ユニバーサルプレート
- モバイルバッテリ
モータドライバDRV8835
モータドライバDRV8835にESP32からPWM信号を入力してモータを制御します。モータドライバのMODEピンはGNDに接続しています。
http://akizukidenshi.com/download/ds/akizuki/AE-DRV8835-Ss.pdf
ESP32 PWM出力
モータドライバDRV8835にESP32からPWM信号を入力してモータを制御します。
ESP32のPWM出力は通常のArduinoマイコンのアナログ出力と異なりledcWrite()という関数で実施します。
ledcWrite()でPWM出力できるピンは限りがありますので、詳細は参考ブログを参照ください。
GPIO14ピンはデフォルトでHi出力なので10kohmでプルダウンしています。
参考
Blynk設定
ここではスマホアプリのblynkでBLE32とBluetooth通信で車体を動かします。
新規プロジェクトを作成します。ハードウェアはESP32 Dev Boardを選択。Conection TypeにはBluetoothを指定します。
AUTH TOKENはArduinoコード生成時に使用します (アカウント登録したメールに送信されます)。
ウィジェットとしてBluetoothと2個のJoystickウェジットを配置します。
2個のJoystickウェジットはそれぞれバーチャルピンV0, V1を使用します。
ジョイスティックの設定はx軸とy軸の出力をMERGEしてヴァーチャルピンV0(V1)に出力させ、それぞれ値は-100~100としました。
AUTO RETURNはONにしてジョイスティックはタップ移動後離すと自動的に中央に戻します。
ROTATE ON TILTはOFFにてスマホの回転に依存せずのx, y軸を固定とします。
メカナムホイール動作
2つのジョイスティックの角度によってモータを制御します。
上のジョイスティック(V0)で直進、下のジョイスティック(V1)で回転させます。
参考
Arduinoコード
Bluetoothを介してBlynkのジョイスティックの動きをヴァーチャルピンV0, V1で受信して、角度を導出してモータを制御しています。
モータスピードはタミヤのダブルギヤボックスのギア比114.7:1で、PWMのデューティ50%(128)としました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
#define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <BlynkSimpleEsp32_BT.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "BlynkアプリのYourAuthTokenを入力"; //channel name const int FA1 = 0; const int FA2 = 1; const int FB1 = 2; const int FB2 = 3; const int RA1 = 4; const int RA2 = 5; const int RB1 = 6; const int RB2 = 7; int duty = 128; //前後進 BLYNK_WRITE(V0) { int x = param[0].asInt(); int y = param[1].asInt(); float th0 = atan2(y, x) * 180.0/M_PI; if(th0 < 0){ th0 = th0 + 360.0; } if(sqrt(x*x + y*y) > 50){ if(67.5 < th0 && th0 <=112.5){ //前進 ForwardFA(); ForwardFB(); ForwardRA(); ForwardRB(); }else if(247.5 < th0 && th0 <=292.5){ //後進 BackFA(); BackFB(); BackRA(); BackRB(); }else if( 337.5< th0 || th0 <=22.5){ //右 ForwardFA(); BackFB(); BackRA(); ForwardRB(); }else if(157.5 < th0 && th0 <=202.5){ //左 BackFA(); ForwardFB(); ForwardRA(); BackRB(); }else if(22.50 < th0 && th0 <=67.5){ //右上 ForwardFA(); ForwardRB(); }else if(112.5 < th0 && th0 <=157.5){ //左上 ForwardFB(); ForwardRA(); }else if(292.5 < th0 && th0 <=337.5){ //右下 BackFB(); BackRA(); }else if(202.5 < th0 && th0 <=247.5){ //左下 BackFA(); BackRB(); }else{ //停止 StopFA(); StopFB(); StopRA(); StopRB(); } }else{ //停止 StopFA(); StopFB(); StopRA(); StopRB(); } Serial.println(th0); } //回転 BLYNK_WRITE(V1) { int x = param[0].asInt(); int y = param[1].asInt(); float th1 = atan2(y, x) * 180.0/M_PI; if(th1 < 0){ th1 = th1 + 360.0; } if(sqrt(x*x + y*y) > 50){ if(315< th1 || th1 <=45){ //右回転 ForwardFA(); BackFB(); ForwardRA(); BackRB(); }else if(135 < th1 && th1 <=225){ //左回転 BackFA(); ForwardFB(); BackRA(); ForwardRB(); }else if(45 < th1 && th1 <=135){ //右大回転 ForwardFA(); ForwardRA(); }else if(225 < th1 && th1 <= 315){ //左大回転 ForwardFB(); ForwardRB(); }else{ //停止 StopFA(); StopFB(); StopRA(); StopRB(); } }else{ //停止 StopFA(); StopFB(); StopRA(); StopRB(); } } void setup(){ // Debug console Serial.begin(9600); ledcSetup(FA1, 5000, 8); //channel, freq, resolution_bits ledcSetup(FA2, 5000, 8); ledcSetup(FB1, 5000, 8); ledcSetup(FB2, 5000, 8); ledcSetup(RA1, 5000, 8); ledcSetup(RA2, 5000, 8); ledcSetup(RB1, 5000, 8); ledcSetup(RB2, 5000, 8); ledcAttachPin(32, FA1); //pin, channel ledcAttachPin(33, FA2); ledcAttachPin(14, FB1); ledcAttachPin(27, FB2); ledcAttachPin(13, RA1); ledcAttachPin(12, RA2); ledcAttachPin(4, RB1); ledcAttachPin(2, RB2); Serial.println("Waiting for connections..."); Blynk.setDeviceName("Blynk"); Blynk.begin(auth); } void loop(){ Blynk.run(); } void ForwardFA(){ ledcWrite(FA2, duty); ledcWrite(FA1, 0); } void ForwardFB(){ ledcWrite(FB1, duty); ledcWrite(FB2, 0); } void ForwardRA(){ ledcWrite(RA2, duty); ledcWrite(RA1, 0); } void ForwardRB(){ ledcWrite(RB1, duty); ledcWrite(RB2, 0); } void BackFA(){ ledcWrite(FA2, 0); ledcWrite(FA1, duty); } void BackFB(){ ledcWrite(FB1, 0); ledcWrite(FB2, duty); } void BackRA(){ ledcWrite(RA2, 0); ledcWrite(RA1, duty); } void BackRB(){ ledcWrite(RB1, 0); ledcWrite(RB2, duty); } void StopFA(){ ledcWrite(FA1, 0); ledcWrite(FA2, 0); } void StopFB(){ ledcWrite(FB1, 0); ledcWrite(FB2, 0); } void StopRA(){ ledcWrite(RA1, 0); ledcWrite(RA2, 0); } void StopRB(){ ledcWrite(RB1, 0); ledcWrite(RB2, 0); } |
Blynk BLE接続
ESP32とスマホをBluetoothでつなぎます。
BlynkプロジェクトのBluetoothウェジットをクリックして設定します。
“Connect Bluetooth device”をクリックして “Blynk”が表示されたらOKをクリックして接続する。
動作
スピード上げてみた。
それっぽいけどまだ滑る。
ゴム履かせるか。#メカナムホイール #3Dプリンタ pic.twitter.com/vWvSISnThl— HomeMadeGarbage (@H0meMadeGarbage) December 27, 2019
タイヤが滑るので熱収縮チューブをかぶせてみました。
圧縮チューブをはかせてみた。
グリップ向上し動きも少し改善。
もう少し回転速度上げたいけど、空中配線ではこれが限界。 pic.twitter.com/rARmv8kffW— HomeMadeGarbage (@H0meMadeGarbage) December 29, 2019
だいぶ滑りは改善されました♪
モータノイズ対策
もう少しモータの回転スピードを上げたいのですが、これ以上高速化つまりモータへの供給電流を上げるとノイズでマイコンが誤動作してしまいます。
マイコンの電源5Vピンにデカップリングコンデンサ100uFを挿入したり、モータにノイズ除去用に10nFを挿入して対策はしたのですが空中配線ではこれ以上の改善は難しかったです。
モータドライバのロジック系とモータ電源のGNDが分けれなかったり
ESP32ボードの電源入力ピンの接続が不明確だったりでノイズ対策が完全に実施できていないことが今後の課題です。
自分で基板作ってみようかなぁ。
まだプライベートでオリジナル基板作ったことないのでいい題材かもしれません。
メカナムへの情念
憧れのメカナムホイールを3Dプリンタでタダ同然で手にすることができました。
非常にありがたくそして感動的なことです。
私がいかにメカナムホイールに憧れを抱いていたかをご紹介させていただきお別れしたいと思います。
追記
タイヤの固定 (20/8/19)
メカナムホイールのタミヤのギアボックスへの固定のために以下のようなシャフトを通して固定するリングを3Dプリントしました。
以下でリングの3Dモデル(STLファイル)がダウンロードできます。
リングモデル
リングを以下のようにメカナムホイールに接着してギアボックスのシャフトに通して固定します。
いつも為になる記事を提供頂きありがとうございます。楽しく拝見させて頂いています。
記事を参考に作ってみました。
メカナムホイールは密林で¥3,000ほどで購入しました。
https://youtu.be/FhFwyGjDiLs
とても楽しい動きをしますね。でも操縦が難しいです。
ここから自分なりに改良してみます。製作過程や改良は後々自分のサイトにアップさせて頂きます。よろしくお願いします。
コメントありがとうございます!
すごいスムーズな動きですね。
私も十字方向やナナメ方向の動作はやってみたのですが、その中間の動きなどはどうすればいいのかなど気になっていることはあります。
進捗楽しみにしております!
速度制御を含めて操作系のアイデアはあるのですが、実現にはまだまだ修行が必要な様です。
電源ノイズ苦労されているみたいですが、私はLipoをDC/DCで5Vに昇圧してESP32に突っ込んでいます。モータードライバには直接Lipoを接続しています。空中配線ですが、パスコンなど何もなしで問題なく動いています。
いつもわかりやすくて楽しい記事をありがとうございます。
私も家にある3Dプリンターで印刷してみたのですが、そのままだとタミヤのギアボックスにはめることができませんでした。
どのようにギアボックスにはめているのですか?
ありがとうございます!!
追記にて説明追加いたしました。
ご確認ください。
https://homemadegarbage.com/mecanum01#%E3%82%BF%E3%82%A4%E3%83%A4%E3%81%AE%E5%9B%BA%E5%AE%9A_(20/8/19)
ナカナムホイールが気になってこちらにお世話になりましたすごく面白い仕組みで作ってみようと思いましたですが作ってみようと思うと思い通りに行きませんでした
もしよければSTLデータをこちらのページに
貼っていただけませんか?無理言ってすみません
(もうどこかに貼っていたらすいません)
こちらは以下のモデルを使用して製作しました。ご確認ください。
https://www.thingiverse.com/thing:1203230