利用M5StickC做一辆迷你遥控车-Arduino中文社区 - Powered by Discuz! Archiver

vany5921 发表于 2019-9-11 13:43

利用M5StickC做一辆迷你遥控车

原文作者:HomeMadeGarbage

这辆小车使用Blynk来进行控制,M5StickC会建立一个"M5Stick-Car" 的热点,通过手机与它进行连接就能遥控。两个电机通过支持I2C的电机驱动芯片DRV8830来驱动,连接的原理图如下:

使用洞洞板做一个迷你底盘,将驱动器与两个振动电机焊接固定好,可以使用热熔胶加固。



振动电机取材自坏掉的电动牙刷,使用空心杯电机也是可以的



控制部分选择了M5StickC,因为它足够迷你,带有全彩LCD显示,并且支持蓝牙和WIFI,内嵌了麦克风和按键,功能十分强大。



控制软件部分选择了Blynk通过WIFI来进行连接。Blynk的使用非常简单,在手机上安装Blynk,注册一个账号就可以添加一些功能组件。



打开软件新建一个硬件设备,我取名为M5STICK-Car,开发板类型为ESP32 DEV,连接方式为Wi-Fi。AUTH TOKEN在进行arduino编程时会用到,它会被发送到注册邮箱里。



选择一个摇杆组件添加到屏幕,取值范围为-20~20。
DRV8830为电机提供电压控制电机转动方向,我用跳线帽改变了I2C地址,其中一个是0X60,另一个是0X64,电机电压从0~1.6V对应摇杆的0~20#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>

// You should get Auth Token in the Blynk App.
char auth[] = "YourAuthToken";

// Your WiFi credentials.
char ssid[] = "WiFi SSID";
char pass[] = "WiFi Password";

const int motorL = 0x60;
const int motorR = 0x64;
long Speed;
long SpeedL, SpeedR;

//motor driver I2C
void writeMotorResister(int motor, byte vset, byte data1){
int vdata = vset << 2 | data1;
Wire.beginTransmission(motor);
Wire.write(0x00);
Wire.write(vdata);
Wire.endTransmission(true);
}

//Joystick data reception
BLYNK_WRITE(V0) {
long x = param.asInt();
long y = param.asInt();

Serial.print("x: ");
Serial.print(x);
Serial.print("y: ");
Serial.print(y);

Speed = sqrt(x*x+y*y);
if(Speed > 20){
   Speed = 20;
}
Serial.print("Speed: ");
Serial.println(Speed);

 //Motor control
if(y >= 0){
   if(x >= 0){
   SpeedL = 0;
   SpeedR = abs(x);
   }else{
   SpeedL = abs(x);
   SpeedR = 0;
   }
   writeMotorResister(motorL, byte(Speed - SpeedL), 0x01);
   writeMotorResister(motorR, byte(Speed - SpeedR), 0x01);
}else{
   if(x >= 0){
   SpeedL = 0;
   SpeedR = abs(x);
   }else{
   SpeedL = abs(x);
   SpeedR = 0;
   }
   writeMotorResister(motorL, byte(Speed - SpeedL), 0x02);
   writeMotorResister(motorR, byte(Speed - SpeedR), 0x02);
}
}

void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
Wire.begin(0, 26, 10000); //SDA, SCL
delay(500);
writeMotorResister(motorL, 0x00, 0x00);
writeMotorResister(motorR, 0x00, 0x00);
}

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



ki1381 发表于 2019-9-12 13:59

赞的!先收藏了

laai 发表于 2020-1-17 21:12

很棒的例子。先收藏在
页: [1]
查看完整版本: 利用M5StickC做一辆迷你遥控车