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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4763|回复: 2

利用M5StickC做一辆迷你遥控车

[复制链接]
发表于 2019-9-11 13:43 | 显示全部楼层 |阅读模式
原文作者:HomeMadeGarbage
1_xtUpUhjFMF.jpeg
这辆小车使用Blynk来进行控制,M5StickC会建立一个"M5Stick-Car" 的热点,通过手机与它进行连接就能遥控。两个电机通过支持I2C的电机驱动芯片DRV8830来驱动,连接的原理图如下:
fig1_xfB2CcyKmZ.jpeg
使用洞洞板做一个迷你底盘,将驱动器与两个振动电机焊接固定好,可以使用热熔胶加固。

fig2_WYcAUNNgW2 (1).jpeg

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

fig3_IpNsPcFwuc.jpg

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

fig4_OA3sbvqjMh.jpeg

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

fig5_LyedfHQOUM.jpg

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

fig7_URs4Xh0LY6.jpg

选择一个摇杆组件添加到屏幕,取值范围为-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]


发表于 2019-9-12 13:59 | 显示全部楼层
赞的!先收藏了
发表于 2020-1-17 21:12 | 显示全部楼层
很棒的例子。先收藏在
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:42 , Processed in 0.227189 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表