Arduino IDE 开发教程¶
概述¶
我们提供基于Arduino平台的ESP32示例代码,提供了蓝牙手柄、ps2手柄的无线连接示例,以及对直流电机、舵机、编码器电机、电压传感器、陀螺仪和OLED显示屏等设备的使用案例。
我们使用PlatformIO环境对各种类型的遥控器和的电机控制做了一些具体实现,可以找客服要源码。
一.开发环境搭建¶
1)安装驱动¶
因为电脑要和主板进行通讯,所以需要安装一个串口驱动
下载后解压安装, 点击“计算机”--“属性”--“设备管理器”,显示如下图是安装成功的了

2)下载开发工具¶
windows系统可以从网盘下载 网盘下载IDE
Mac和windows系统均可以从官网下载 网盘下载IDE

根据系统选择需要下载的版本,如果是老系统建议下载zip压缩包,解压后就可以使用

下载后一路安装,我就不截图演示了。
3)配置Arduino IDE¶


因访问外网的限制,最好把服务地址更换成国内的,将这个地址:
https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_index_cn.json
粘贴到最下方的输入框,再点击“确定”保存这个地址,如下图:
4)安装开发板¶
先点击“工具”→“开发版:”,,再点击“开发版管理器...”进入“开发版管理器”页面,在文本框中输入“esp32”,选择 2.xcn或3.xcn 版本进行安装,点击“安装”开始安装相关安装包。如下图:(特别提醒:选择带cn结尾的国内版本,否则可能访问不了国外的服务器。)

选择带cn结尾的安装包

二.安装插件¶
2.下载库文件 奇果派ArduinoIDE库文件
3.导入库文件
项目 – 导入库 – 添加.ZIP库,选择上一步下载的压缩包

如果后期库有更新,您可以先在目录C:\Users\yourName\Documents\Arduino\libraries 目录下删除文件夹QGP_EVMotor,然后再次导入库即可实现更新。
4.使用示例代码
选择 文件 – 示例 – QGP_EVMotor,可以看到有多个示例文件,打开任意一个,另存在你的工作目录

5.烧录
请使用usb线Type-C端插在开发板上,Type-A端插在电脑上
选择 工具 – 开发板 – esp32 下选择开发板“ESP32S3 Dev Module”

然后点击下图中的红框,选择正确的USB端口(设备管理器中那个端口),就可以点击左上角的箭头上传程序了

三.代码分析——蓝牙手柄¶
1.引用库文件
#include "StickCB.h"
2.定义全局变量
BLEControlStick _joy;
3.初始化
void setup()
{
Serial.begin(115200);
// 初始化蓝牙手柄
_joy.setStickCallback(new StickCB());
_joy.begin();
Serial.println("启动完毕");
}
4.使用
void loop()
{
_joy.update();
if (_joy.Button(BTN_DPAD_UP))
{
//按下向上键时...
}else if (_joy.Button(BTN_DPAD_DOWN))
{
//按下向下键...
}
}
5.遥控器按键对照图

四.代码分析——直流电机¶
1.引用库文件
#include "EMotionPI.h"
EMotionPI emo;
/**定义4个普通电机*/
EMO_DCMotor *enMotor1=emo.getMotor(M1);
EMO_DCMotor *enMotor2=emo.getMotor(M2);
EMO_DCMotor *enMotor3=emo.getMotor(M3);
EMO_DCMotor *enMotor4=emo.getMotor(M4);
void loop()
{
_joy.update();
//按遥控器的上、下键
if (_joy.Button(BTN_DPAD_UP))
{
// 4个电机向前转
enMotor1->run(FORWARD); enMotor1->setSpeed(100);
enMotor2->run(FORWARD); enMotor2->setSpeed(100);
enMotor3->run(FORWARD); enMotor3->setSpeed(100);
enMotor4->run(FORWARD); enMotor4->setSpeed(100);
}else if (_joy.Button(BTN_DPAD_DOWN))
{
//4个电机向后转
enMotor1->run(BACKWARD); enMotor1->setSpeed(100);
enMotor2->run(BACKWARD); enMotor2->setSpeed(100);
enMotor3->run(BACKWARD); enMotor3->setSpeed(100);
enMotor4->run(BACKWARD); enMotor4->setSpeed(100);
}
}
enMotor1->run(BACKWARD); 控制电机转向,FORWARD前进 BACKWARD后退;
enMotor1->setSpeed(100); 控制电机转速,取值0至100,注意部分电机数值过低可能会转不动;
enMotor1->brake(100); 电机主动刹车,取值0至少100。
五.代码分析——舵机控制¶
1.引用库文件
#include "EMotionPI.h"
2.定义全局变量
**定义4个舵机*/
EMO_Servo* servo1=emo.getServo(S1);
EMO_Servo* servo2=emo.getServo(S2);
EMO_Servo* servo3=emo.getServo(S3);
EMO_Servo* servo4=emo.getServo(S4);
void loop()
{
_joy.update();
//舵机1
if (_joy.Button(BTN_DPAD_UP))
{
if(servo1->read() < 175)
servo1->write(servo1->read()+1);
}else if (_joy.Button(BTN_DPAD_DOWN))
{
if(servo1->read() > 5)
servo1->write(servo1->read()-1);
}
}
servo1->read(); 读取舵机当前角度;
servo1->write(100); 控制舵机旋转角度,具体数值请不要大于你舵机支持的角度。
六.代码分析——编码器电机¶
1.引用库文件
#include "EMotionPI.h"
/**定义4个编码器电机*/
EMO_EncoderMotor *enMotor1=emo.getEncoderMotor(M1);
EMO_EncoderMotor *enMotor2=emo.getEncoderMotor(M2);
EMO_EncoderMotor *enMotor3=emo.getEncoderMotor(M3);
EMO_EncoderMotor *enMotor4=emo.getEncoderMotor(M4);
void setup()
{
Serial.begin(115200);
// 初始化蓝牙手柄
_joy.setStickCallback(new StickCB());
_joy.begin();
delay(100);
emo.begin();
enMotor1->begin(90); //该电机齿数比是1:90
enMotor2->begin(90);
enMotor3->begin(90);
enMotor4->begin(90);
Serial.println("启动完毕");
}
void loop()
{
_joy.update();
int speed = 0;
//左侧摇杆控制车子前进后退
if (_joy.Analog(BPSS_LY) < 125)
{
speed = map(_joy.Analog(BPSS_LY), 125, 0, 30, cur_speed);
enMotor1->run(FORWARD); enMotor1->setSpeed(100); //控制电机先前转
enMotor2->run(FORWARD); enMotor2->setSpeed(100);
enMotor3->run(FORWARD); enMotor3->setSpeed(100);
enMotor4->run(FORWARD); enMotor4->setSpeed(100);
}else if (_joy.Analog(BPSS_LY) > 130){
speed = map(_joy.Analog(BPSS_LY), 130, 255, 30, cur_speed);
enMotor1->run(BACKWARD); enMotor1->setSpeed(100);
enMotor2->run(BACKWARD); enMotor2->setSpeed(100);
enMotor3->run(BACKWARD); enMotor3->setSpeed(100);
enMotor4->run(BACKWARD); enMotor4->setSpeed(100);
}
if(millis() - gp_time > 1000){
gp_time = millis();
int rpm = enMotor1->getRPM();
long pos = enMotor1->getEncoderPos();
float laps = pos/48;
Serial.printf("转速: %d/min,",enMotor1->getRPM());
Serial.printf("位置: %d,",enMotor1->getEncoderPos());
Serial.printf("第 %0.f圈 \n",laps);
}
}
enMotor1->getRPM() 获取当前电机的转速,单位是:圈/分钟;
enMotor1->getEncoderPos() 获取当前电机的位置,传感器一圈有48个触点,无论正传还是反转,每触发1个触点就自增1,因此霍尔感器检测到48时电机刚好转一圈。