所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开
做一辆迷你遥控车
vany5921 vany5921 2019-09-12 10:36:04
0
0
简单
projectImage

分享一个M5StickC的案例 作者:HomeMadeGarbage

准备制作的这辆小车使用M5StickC来完成,通过Blynk来进行控制,由于ESP32自带WiFi可以方便的进行连接,暂定建立一个"M5Stick-Car" 的热点,通过手机与它进行连接遥控。由于M5StickC不能直接驱动电机因此,两个电机通过支持I2C的电机驱动芯片DRV8830来驱动,连接的原理图如下:

projectImage

使用洞洞板做一个迷你底盘,如果有一个废旧的玩具小车底盘将更加方便。将驱动器与两个振动电机焊接固定好,可以使用热熔胶加固。 

projectImage

振动电机取材自坏掉的电动牙刷,使用空心杯电机也是可以的,但是空心杯速度要更快一些

projectImage

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

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

projectImage

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

projectImage

选择一个摇杆组件添加到屏幕,取值范围为-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[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();
}
	                    				
Makelog作者原创文章,未经授权禁止转载。
0
0
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
[[c.comment_content]]