Funpack2-3基于FireBeetle ESP32-E的蓝牙遥控小车
本项目基于DFRobot公司的FireBeetle ESP32-E模块通过VScode进行代码的编写,使用DFRobot公司的红外模块进行车辆与前方距离的判断来进行指示灯的亮灭,ESP32通过电机驱动模块驱动四颗N20减速电机来驱动小车
标签
Funpack活动
蓝牙
Funpack2-3
ESP32-E
叶佳敏
更新2023-01-03
济宁学院
471

项目描述:

本项目依托Funpack第二季第三期活动的任务三:遥控小车。使用FireBeetle ESP32-E开发板作为控制单元,制作一台可以遥控的小车,遥控方式可以是蓝牙、红外、espnow,wifi等方式实现车辆前进后退转向等功能。

本项目基于DFRobot公司的FireBeetle ESP32-E开发板,实现了蓝牙遥控小车的制作,本项目通过点灯科技APP实现蓝牙遥控小车前进、后退、转向。并且通过红外模块实现了距离指示灯的亮灭。取得了良好的效果,具有一定的价值。

本项目基于DFRobot公司的FireBeetle ESP32-E模块通过VScode编译器进行代码的编写,使用DFRobot公司的红外模块进行车辆与前方距离的判断来进行指示灯的亮灭,ESP32通过电机驱动模块驱动四颗N20减速电机,来驱动小车前进后退,通过差速进行转向。通过点灯科技APP使用手机蓝牙,对其APP的摇杆组件进行操作,来实现蓝牙遥控小车的前进、后退、转向。

主控介绍:

FjsseR9Nnuval6GNr1Sf4Cx94JXe

FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。通过和IFTTT等物联网平台的连接,你可轻松制作出你独有的特色物联网智能家居系统。FireBeetle ESP32-E深度支持ArduinoIDE编程,并且即将支持Scratch图形化编程及MicroPython编程。

引脚说明:

FpKngZKdEVBpQMCjD26zUBGx2bMO

FireBeetle ESP32-E 最多有 22 个物理 GPIO,其中 34-39 号管脚仅作为输入管脚,其他的可以作为输入和输出管脚。所有逻辑电压均为 3.3V。

  • Control:Fire Beetle的的使能以及复位引脚
  • Touch:具有电容触摸功能的引脚
  • Analog:具有模拟功能的引脚
  • Port PIN:芯片默认的物理引脚号,可直接使用此数字控制对应引脚
  • IDE:在 arduino IDE中,Fire Beetle 将引脚号码进行映射,也可直接使用此符号控制对应引脚
  • RTCPIN:Fire Beetle具有低功耗功能,在进入deepsleep模式下仅RTC pin可以被使用
  • Power:Fire Beetle将供电电源以及稳压后的3.3V电源通过引脚引出,方便用户使用
  • GND:Fire Beetle的公共接地引脚

硬件设计原理:

Ft3YpHmOfIUAGbvzdLadxZlF7hHi

本项目使用4颗N20减速电机,相同一侧进行并联,电机正负极分别连接至电机驱动模块,电机驱动模块采用单独电源供电与主控电源分离,保证了主控供电电流的稳定性,电池为3.7V锂电池。FireBeetle ESP32-E主控输出PWM控制电机驱动模块。红外传感器进行对小车前方障碍物距离的判断,若小于15cm则LED指示灯亮起。

电机驱动模块:

FkRpcBvqbGzv1mqkHDRpyPtpXfeG

Fg23-CaaTb3acLDu4y-ruXiGktbb

FireBeetle ESP32-E开发板D2引脚接IN1、D3引脚接IN2、D7引脚接IN3、D9引脚接IN4,进行控制电机的运动。

APP设置:

将代码烧录进去后,浏览器搜索https://diandeng.tech/dev下载点灯科技APP,并注册,按以下步骤操作

图形说明:

FhZpzG-SPyEA3e5kJAhsJzJqCrhJ

文字说明:

1、将APP下载完成后进行注册,点击右上角加号。
2, 点击左侧arduino图标的独立设备。
3,首先要将代码烧录至单片机后将单片机供电,使其蓝牙打开,然后打开手机的蓝牙,点击蓝牙接入选择esp32的蓝牙。
4,点击右上角编辑按钮
5,选择右下角摇杆组件
6,点击刚加入的摇杆组件
7,将原本的组件键名改为大写的A,然后点击右上角的对号。
8,点击右上角的保存,然后点击从右往左数第3个连接按钮

主要代码:

#define A1 0
#define A2 1
#define B1 2
#define B2 3
#define IN1 D2
#define IN2 D3
#define IN3 D7
#define IN4 D9
#define JOY_1 "JOYKey"
const int InfraredSensorPin = 4; // Connect the signal pin to the digital pin 4
const int LED = 12;
BlinkerJoystick JOY1("A");
void joystick1_callback(uint8_t xAxis, uint8_t yAxis)
{
    int L, R, X = xAxis, Y = yAxis;
    X = map(xAxis, 0, 255, -128, +128);
    Y = map(yAxis, 0, 255, -128, +128);

    if (Y < 0)
    {
        if (X > 0)
            R = abs(Y) - X;
        else
            R = abs(Y);
    }
    if (Y > 0)
    {
        if (X > 0)
            R = abs(Y) - X;
        else
            R = abs(Y);
    }
    R = R * 2;
    if (Y < 0)
    {
        if (X < 0)
            L = abs(Y) - abs(X);
        else
            L = abs(Y);
    }
    if (Y > 0)
    {
        if (X < 0)
            L = abs(Y) - abs(X);
        else
            L = abs(Y);
    }
    L = L * 2;

    L = map(L, 0, 255, 50, 255); //两轮使用
    R = map(R, 0, 255, 50, 255);
    if (L < 0)
        L = 0;
    if (R < 0)
        R = 0;

    if (xAxis == 128 && yAxis == 128)
    {
        ledcWrite(A1, 0);
        ledcWrite(A2, 0);
        ledcWrite(B1, 0);
        ledcWrite(B2, 0);
    }

    else
    {
        if (Y < 20 && Y > -20)

        {
            if (X > 0)
            {
                ledcWrite(A2, map(X, 0, 128, 150, 255));
                ledcWrite(B1, map(X, 0, 128, 150, 255));
            }
            if (X < 0)
            {
                ledcWrite(A1, map(X, -128, 0, 150, 255));
                ledcWrite(B2, map(X, -128, 0, 150, 255));
            }
        }
        else
        {
            if (Y < 0)
            {
                ledcWrite(A1, R);
                ledcWrite(B1, L);
            }
            if (Y > 0)
            {
                ledcWrite(A2, R);
                ledcWrite(B2, L);
            }
        }

        Serial.printf("x=");
        Serial.println(X);
        Serial.printf("y=");
        Serial.println(Y);
        Serial.printf("L=");
        Serial.println(L);
        Serial.printf("R=");
        Serial.println(R);
    }
}
void setup()
{
    Serial.begin(115200);

    BLINKER_DEBUG.stream(Serial);

    pinMode(9, OUTPUT);
    digitalWrite(9, LOW);
    pinMode(InfraredSensorPin, INPUT);
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
    Blinker.begin();

    JOY1.attach(joystick1_callback);
    ledcSetup(A1, 1200, 8);
    ledcSetup(A2, 1200, 8);
    ledcSetup(B1, 1200, 8);
    ledcSetup(B2, 1200, 8);
    ledcAttachPin(IN1, A1);
    ledcAttachPin(IN2, A2);
    ledcAttachPin(IN3, B1);
    ledcAttachPin(IN4, B2);
}

void loop()
{
    if (digitalRead(InfraredSensorPin) == LOW)
        digitalWrite(LED, HIGH);
    else
        digitalWrite(LED, LOW);
    Blinker.run();
}

代码说明:由于所使用的红外传感器返回值为数字量,所以使用digitalRead()函数来检测前方是否有障碍物。当读取引脚为低电平时说明前方15cm内有障碍物,随着指示灯亮起。

功能展示及说明:

心得体会:

通过对本项目的学习,我对ESP32-E模块又有了进一步的了解,对蓝牙传输信息有了更深的理解和感悟,很感谢硬禾学堂举办了Funpack这个活动,通过这次活动我收获了很多,也让我成长了许多。受益匪浅。未来期望再次参加这样的活动,了解并学习更多的知识,掌握更多的技能,开拓电子芯片在生活中运用的视野,改变思维模式,在专业上有既定的发展方向。

附件下载
FireBeetle-ESP32.zip
代码
团队介绍
本团队还在襁褓中,有待发展
团队成员
叶佳敏
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号