|
原文作者: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[mw_shl_code=arduino,true]#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[0].asInt();
long y = param[1].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();
}
[/mw_shl_code]
|
|