一.概述
我们提供基于Arduino平台的ESP32示例代码,提供了蓝牙手柄、ps2手柄的无线连接示例,以及对直流电机、舵机、编码器电机、电压传感器、陀螺仪和OLED显示屏等设备的使用案例。
二.基础准备
1.下载并安装Arduino IDE
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"
2.定义全局变量
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);
3.使用电机
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);
}
}
4.代码解释
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);
3.使用舵机
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);
}
}
4.代码解释
servo1->read(); 读取舵机当前角度;
servo1->write(100); 控制舵机旋转角度,具体数值请不要大于你舵机支持的角度。
六.代码分析——编码器电机
1.引用库文件
#include "EMotionPI.h"
2.定义全局变量
EMotionPI emo;
/**定义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);
3.初始化
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("启动完毕");
}
4.使用
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);
}
}
5.代码解释
enMotor1->getRPM() 获取当前电机的转速,单位是:圈/分钟;
enMotor1->getEncoderPos() 获取当前电机的位置,传感器一圈有48个触点,无论正传还是反转,每触发1个触点就自增1,因此霍尔感器检测到48时电机刚好转一圈。
原创文章,作者:奇果派,如若转载,请注明出处:https://www.7gp.cn/archives/1409