記事一覧

続報!自作のメカナムホールとM5StickCでローバーを作ってみた。ローラー改善

続報!自作のメカナムホールとM5StickCでローバーを作ってみた。ローラー改善



こんにちは、RoboTakaoです。
前回、Fusion360で設計して#Dプリンターでメカナムホイール のローバーを作ったことを紹介しました
でもフローリングの上ではローラーが滑ってしまってうまく動かないと書きました。
(ビニールのテーブルクロスの上では動いた)

今回はローラーに対策施しました。
また、信地旋回を追加しました。

NX12_20.jpeg

ローラの対策

ローラーにシリコンチューブを被せました。(ホームセンターで購入)
径が太くなってしまうのでローラーは1mmほど小さいものを再出力

NX12_21.jpeg

NX12_22.jpeg

信地旋回の追加

iPhoneでのコントロールはBlynkのジョイスティックを使いました。
ジョイスティックの操作は下記のようにしてみました

NX12_28.png

NX12_27.png

動作確認

やっとフローリングの上でうまく動くようになりました。
操作も良い感じです。



ちなみにローラに別の対策を行って失敗したことを紹介します。

ローラーに何か樹脂コーティングのようなことができないかと
木工用ボンドを塗布してみました。

NX12_23.jpeg

ローラーには薄い膜ができましたが、やはり滑ってうまく動きませんでした。





スケッチ


#include <M5StickC.h>
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT

char auth[] = "jZpGVzEJgw4g3SkzJkdpeAgdTGvRWAoW"; //メールで送られるAuth Token

const uint8_t Srv_RF = 26, Srv_RR = 0, Srv_LF = 32, Srv_LR = 33; //GPIO No.
const uint8_t srvCH_RF = 0, srvCH_RR = 1, srvCH_LF = 2, srvCH_LR = 3; //チャンネル
const double PWM_Hz = 50; //PWM周波数
const uint8_t PWM_level = 16; //PWM 16bit(0~65535)

int mRF = 0, mRR = 0, mLF = 0, mLR = 0;

int pulseMIN = 2295; //700μsec 50Hz 16bit
int pulseMAX = 7533; //2300μsec 50Hz 16bit


void setup() {
Serial.begin(151200);
m5.begin();
pinMode(Srv_RF, OUTPUT);
pinMode(Srv_RR, OUTPUT);
pinMode(Srv_LF, OUTPUT);
pinMode(Srv_LR, OUTPUT);

Blynk.setDeviceName("Blynk");
Blynk.begin(auth);

M5.Lcd.print("NX12 TEST");

//モータのPWMのチャンネル、周波数の設定
ledcSetup(srvCH_RF, PWM_Hz, PWM_level);
ledcSetup(srvCH_RR, PWM_Hz, PWM_level);
ledcSetup(srvCH_LF, PWM_Hz, PWM_level);
ledcSetup(srvCH_LR, PWM_Hz, PWM_level);

//モータのピンとチャンネルの設定
ledcAttachPin(Srv_RF, srvCH_RF);
ledcAttachPin(Srv_RR, srvCH_RR);
ledcAttachPin(Srv_LF, srvCH_LF);
ledcAttachPin(Srv_LR, srvCH_LR);
}

//右ジョイスティックのデータ受信
BLYNK_WRITE(V0) {
int x = param[0].asInt();
int y = param[1].asInt();

if(y <- 3){
if(abs(x) > 3){ //右信地旋回
mRF = 0;
mRR = 0;
mLF = x;
mLR = x;
}else{ //右超信地旋回
mRF = y;
mRR = y;
mLF = -y;
mLR = -y;
}
}else if(y > 3){
if(abs(x) > 3){ //左信地旋回
mRF = x;
mRR = x;
mLF = 0;
mLR = 0;
}else{ //左超信地旋回
mRF = y;
mRR = y;
mLF = -y;
mLR = -y;
}
}else if(abs(x) > 3){ //前後進
mRF = x;
mRR = x;
mLF = x;
mLR = x;
}else{
mRF = 0;
mRR = 0;
mLF = 0;
mLR = 0;
}
}

//左ジョイスティックのデータ受信
BLYNK_WRITE(V1) {
int x = param[0].asInt();
int y = param[1].asInt();

if(y < -3){
if(x > 3){ //右斜め前
mRF = 0;
mRR = -y;
mLF = -y;
mLR = 0;
}else if(x < -3){ //右斜め後
mRF = y;
mRR = 0;
mLF = 0;
mLR = y;
}else{ //右スライド
mRF = y;
mRR = -y;
mLF = -y;
mLR = y;
}
}else if(y > 3){
if(x > 3){ //左斜め前
mRF = y;
mRR = 0;
mLF = 0;
mLR = y;
}else if(x < -3){ //左斜め後
mRF = 0;
mRR = -y;
mLF = -y;
mLR = 0;
}else{ //左スライド
mRF = y;
mRR = -y;
mLF = -y;
mLR = y;
}
}else if(abs(x) > 3){ //前後進
mRF = x;
mRR = x;
mLF = x;
mLR = x;
}else{
mRF = 0;
mRR = 0;
mLF = 0;
mLR = 0;
}
}


void motor_drive(int motor_RF, int motor_RR, int motor_LF, int motor_LR){
motor_RF = map(motor_RF, -10, 10, pulseMIN, pulseMAX);
motor_RR = map(motor_RR, -10, 10, pulseMIN, pulseMAX);
motor_LF = map(motor_LF, -10, 10, pulseMIN, pulseMAX);
motor_LR = map(motor_LR, -10, 10, pulseMIN, pulseMAX);

ledcWrite(srvCH_RF, motor_RF);
ledcWrite(srvCH_RR, motor_RR);
ledcWrite(srvCH_LF, motor_LF);
ledcWrite(srvCH_LR, motor_LR);
}

void loop() {
M5.update();
Blynk.run();

motor_drive(-mRF, -mRR, mLF, mLR);
delay(10);
}

スポンサードリンク

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/

スポンサーリンク