Esp32-S3电机驱动器——Arduino编程

一.概述

我们提供基于Arduino平台的ESP32示例代码,提供了蓝牙手柄、ps2手柄的无线连接示例,以及对直流电机、舵机、编码器电机、电压传感器、陀螺仪和OLED显示屏等设备的使用案例。

二.基础准备

1.下载并安装Arduino IDE

Arduino新手程序安装三板斧

2.下载库文件

3.导入库文件

项目 – 导入库 – 添加.ZIP库,选择上一步下载的压缩包

Esp32-S3电机驱动器——Arduino编程

如果后期库有更新,您可以先在目录C:\Users\yourName\Documents\Arduino\libraries 目录下删除文件夹QGP_EVMotor,然后再次导入库即可实现更新。

4.使用示例代码

选择 文件 – 示例 – QGP_EVMotor,可以看到有多个示例文件,打开任意一个,另存在你的工作目录

5.烧录

请使用usb线Type-C端插在开发板上,Type-A端插在电脑上

选择 工具 – 开发板 – esp32 下选择开发板“ESP32S3 Dev Module”

然后点击下图中的红框,选择正确的USB端口,就可以上传程序了

Esp32-S3电机驱动器——Arduino编程

三.代码分析——蓝牙手柄

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.遥控器按键对照图

Esp32-S3电机驱动器——Arduino编程

四.代码分析——直流电机

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

(0)
上一篇 5天前
下一篇 3天前

相关推荐