您的位置 首页 芯片行情

keil5开发案例分享 基于STM32设计遥控小车

STM32程序开发IDE: keil5;这是基于STM32设计的4轮遥控小车,支持通过Android手机APP、Windows上位机完成对小车遥控;支持前进、后退、左转、右转、停止等操作。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

一、环境介绍

小车主控MCU: STM32F103ZET6

STM32程序开发IDE: keil5

STM32程序风格: 采用寄存器方式开发,注释齐全,执行效率高,方便移植

手机APP: 采用QT设计,程序支持跨平台编译运行(AndroidIOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解)

硬件包含: 淘宝购买的完整一套4轮遥控小车(采用STM32F103ZET6作为主控板)、DHT11温湿度传感器、中科微GPS模块、ESP8266

小车完整源码下载地址:https://download.csdn.net/download/xiaolong1126626497/19557040

APP完整源码下载地址: https://download.csdn.net/download/xiaolong1126626497/19557009

二、功能介绍

这是基于STM32设计的4轮遥控小车,支持通过Android手机APP、Windows上位机完成对小车遥控;支持前进、后退、左转、右转、停止等操作。

小车上会实时采集温度、湿度、GPS经纬度、通过ESP8266 WIFI上传至手机APP,手机APP收到数据之后,会将温湿度实时显示出来,经纬度收到后会调用百度地图,显示小车的位置,并且数据也会存放到数据库里,方便查看历史数据;支持范围内温湿度查询、最高温湿度、最低温湿度查询。

小车电机驱动模块采用L298N、WIFI模块采用ESP8266、MCU采用STM32F103C8T6、温湿度模块采用DTH11、GPS模块采用北斗GPS+BDS。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.pngpoYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

三、相关硬件介绍

poYBAGDYdXCAWkKMAAAAK8RNs4s030.pngpoYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

四、程序源码

硬件连接说明: GPS接的串口1: PA3(RX) –5V~3.3VWIFI接的串口3: PB10(TX)—>接ESP8266的RX PB11(RX)—>接ESP8266的TX –3.3VDHT11温湿度接: PA7

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.1 STM32小车端: main.c源码

#include \"stm32f10x.h\"#include \"led.h\"#include \"delay.h\"#include \"key.h\"#include \"usart.h\"#include #include \"timer.h\"#include \"bluetooth.h\"#include \"esp8266.h\"#include \"dht11.h\"#include \"gps.h\"#include \"motor.h\"/*硬件连接说明:  GPS接的串口1:   PA3(RX)   --5V~3.3VWIFI接的串口3:  PB10(TX)--->接ESP8266的RX    PB11(RX)--->接ESP8266的TX    --3.3VDHT11温湿度接:  PA7    */u8 ESP8266_SendBuff[50];char Buffer[1024];int main(){   u32 time_cnt=0;   double Longitude=120.086199;   double latitude=30.139219;   u8 temp=20;   u8 humi=70;        //延时2秒保证系统稳定   delay_ms(1000);   delay_ms(1000);    LED_Init();   BEEP_Init();       USART1_Init(115200);  //串口调试       USART2_Init(9600); //接GPS模块   TIMER2_Init(72,20000);       USART3_Init(115200);   //串口-WIFI ESP8166_01默认波特率9600  ESP8266_12F默认波特率115200   TIMER3_Init(72,20000); //超时时间20ms      printf(\"正在初始化请稍等.\\r\\n\");   printf(\"DHT11_Init:%d\\r\\n\",DHT11_Init());//温湿度传感器初始化      printf(\"准备检测WIFI硬件,请稍等...\\r\\n\");    //初始化WIFI硬件   if(ESP8266_Init())printf(\"WIFI硬件错误.\\r\\n\");   else   {       printf(\"WIFI设备正常....\\r\\n\");      //配置WIFI的模式   192.168.4.1      printf(\"WIFI配置状态:%d\\r\\n\",ESP8266_AP_TCP_Server_Mode(\"esp8266_666\",\"12345678\",8089));   }       MotorInit();  //电机初始化   //电机脉冲控制     TIMER4_Init(72,1000);       while(1)   {           //接收到GPS的数据       if(USART2_RX_FLAG)       {           USART2_RX_BUFFER[USART2_RX_CNT]=\'\\0\';           //解析经纬度           GPS_GNRMC_Decoding((char*)USART2_RX_BUFFER,&Longitude,&latitude);           USART2_RX_CNT=0;           USART2_RX_FLAG=0;           //打印到串口调试助手           printf(\"GPS:%f,%f\\r\\n\",Longitude,latitude);       }                       //接收到WIFI的数据        if(USART3_RX_FLAG)        {            USART3_RX_BUFFER[USART3_RX_CNT]=\'\\0\';            printf(\"WIFI:%s\\r\\n\",USART3_RX_BUFFER);             strcpy(Buffer,(char*)USART3_RX_BUFFER);            USART3_RX_CNT=0;            USART3_RX_FLAG=0;                                   BEEP=1;            delay_ms(50);                        BEEP=0;                        if(strstr((char*)Buffer,\":a\"))            {                printf(\"向前...\\r\\n\");                CarGo();            }            else if(strstr((char*)Buffer,\":b\"))            {                 printf(\"后退...\\r\\n\");                CarBack();            }            else if(strstr((char*)Buffer,\":c\"))            {                 printf(\"向左...\\r\\n\");                 CarLeft();            }            else if(strstr((char*)Buffer,\":d\"))            {                 printf(\"向右...\\r\\n\");                 CarRight();            }            else if(strstr((char*)Buffer,\":e\"))            {                 printf(\"停止...\\r\\n\");                 CarStop();            }        }               time_cnt++;       delay_ms(10);              //判断轮询时间       if(time_cnt>=100*2)       {            time_cnt=0;            //读取温湿度数据           DHT11_Read_Data(&temp,&humi);                      sprintf((char*)ESP8266_SendBuff,\"#%d,%d,%f,%f\",temp,humi,Longitude,latitude);           //向服务器上传数据           ESP8266_ServerSendData(0,ESP8266_SendBuff,strlen((char*)ESP8266_SendBuff));                      //打印到串口调试助手           printf(\"ESP8266_SendBuff:%s\\r\\n\",(char *)ESP8266_SendBuff);                      //运行状态           Motor_LED=!Motor_LED;       }   }} 

4.2 STM32小车端: 电机控制源码

#include \"motor.h\"//全局变量定义unsigned int speed_count=0;//占空比计数器 50次一周期int front_left_speed_duty=SPEED_DUTY;int front_right_speed_duty=SPEED_DUTY;int behind_left_speed_duty=SPEED_DUTY;int behind_right_speed_duty=SPEED_DUTY;unsigned char continue_time=0;//根据占空比驱动电机转动void CarMove(void){    BEHIND_RIGHT_EN;//右前轮if(front_right_speed_duty > 0)//向前{if(speed_count < front_right_speed_duty){FRONT_RIGHT_GO;}else                //停止{FRONT_RIGHT_STOP;}}else if(front_right_speed_duty < 0)//向后{if(speed_count  0)//向前{if(speed_count < behind_left_speed_duty){BEHIND_LEFT_GO;}else                //停止{BEHIND_LEFT_STOP;}}else if(behind_left_speed_duty < 0)//向后{if(speed_count APB2ENR|=1<APB2ENR|=1<APB2ENR|=1<CRH&=0xFF0F0F0F;    GPIOG->CRH|=0x00303030;        GPIOD->CRL&=0xF0F0F0F0;    GPIOD->CRL|=0x03030303;        GPIOC->CRH&=0xFFFF0FFF;    GPIOC->CRH|=0x00003000;    CarStop();}

4.3 STM32小车端: ESP8266 WIFI源码

#include \"esp8266.h\"u8 ESP8266_IP_ADDR[16]; //255.255.255.255u8 ESP8266_MAC_ADDR[18]; //硬件地址/*函数功能: ESP8266命令发送函数函数返回值:0表示成功  1表示失败*/u8 ESP8266_SendCmd(char *cmd){    u8 i,j;    for(i=0;i<10;i++) //检测的次数--发送指令的次数    {        USART3_RX_FLAG=0;        USART3_RX_CNT=0;        USARTx_StringSend(USART3,cmd);        delay_ms(200);        if(USART3_RX_FLAG)        {            USART3_RX_BUFFER[USART3_RX_CNT]=\'\\0\';            USART3_RX_FLAG=0;            USART3_RX_CNT=0;            if(strstr((char*)USART3_RX_BUFFER,\"OK\"))            {                return 0;            }        }    }    return 1;}/*函数功能: ESP8266硬件初始化检测函数函数返回值:0表示成功  1表示失败*/u8 ESP8266_Init(void){    ESP8266_SendCmd(\"+++\");    delay_ms(200);    ESP8266_SendCmd(\"+++\");    delay_ms(200);    return ESP8266_SendCmd(\"AT\\r\\n\");}/*函数功能: 一键配置WIFI为AP+TCP服务器模式函数参数:char *ssid  创建的热点名称char *pass  创建的热点密码 (最少8位)u16 port    创建的服务器端口号函数返回值: 0表示成功 其他值表示对应错误值*/u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port){    char *p;    u8 i;    char tmp_buff[100];    /*1. 测试硬件*/    if(ESP8266_SendCmd(\"AT\\r\\n\"))return 1;    /*2. 关闭回显*/    if(ESP8266_SendCmd(\"ATE0\\r\\n\"))return 2;    /*3. 设置WIFI模式*/    if(ESP8266_SendCmd(\"AT+CWMODE=2\\r\\n\"))return 3;    /*4. 复位*/    ESP8266_SendCmd(\"AT+RST\\r\\n\");    delay_ms(1000);    delay_ms(1000);    delay_ms(1000);    /*5. 关闭回显*/    if(ESP8266_SendCmd(\"ATE0\\r\\n\"))return 5;    /*6. 设置WIFI的AP模式参数*/    sprintf(tmp_buff,\"AT+CWSAP=\\\"%s\\\",\\\"%s\\\",1,4\\r\\n\",ssid,pass);    if(ESP8266_SendCmd(tmp_buff))return 6;    /*7. 开启多连接*/    if(ESP8266_SendCmd(\"AT+CIPMUX=1\\r\\n\"))return 7;    /*8. 设置服务器端口号*/    sprintf(tmp_buff,\"AT+CIPSERVER=1,%d\\r\\n\",port);    if(ESP8266_SendCmd(tmp_buff))return 8;    /*9. 查询本地IP地址*/    if(ESP8266_SendCmd(\"AT+CIFSR\\r\\n\"))return 9;    //提取IP地址    p=strstr((char*)USART3_RX_BUFFER,\"APIP\");    if(p)    {        p+=6;        for(i=0;*p!=\'\"\';i++)        {            ESP8266_IP_ADDR[i]=*p++;        }        ESP8266_IP_ADDR[i]=\'\\0\';    }    //提取MAC地址    p=strstr((char*)USART3_RX_BUFFER,\"APMAC\");    if(p)    {        p+=7;        for(i=0;*p!=\'\"\';i++)        {            ESP8266_MAC_ADDR[i]=*p++;        }        ESP8266_MAC_ADDR[i]=\'\\0\';    }        //打印总体信息    printf(\"当前WIFI模式:AP+TCP服务器\\n\");    printf(\"当前WIFI热点名称:%s\\n\",ssid);    printf(\"当前WIFI热点密码:%s\\n\",pass);    printf(\"当前TCP服务器端口号:%d\\n\",port);    printf(\"当前TCP服务器IP地址:%s\\n\",ESP8266_IP_ADDR);    printf(\"当前TCP服务器MAC地址:%s\\n\",ESP8266_MAC_ADDR);    return 0;}/*函数功能: TCP服务器模式下的发送函数发送指令: */u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len){    u8 i,j,n;    char ESP8266_SendCMD[100]; //组合发送过程中的命令    for(i=0;i\"))            {                //继续发送数据                USARTx_DataSend(USART3,data,len);                //等待数据发送成功                delay_ms(200);                if(USART3_RX_FLAG)                {                    USART3_RX_BUFFER[USART3_RX_CNT]=\'\\0\';                    USART3_RX_FLAG=0;                    USART3_RX_CNT=0;                    if(strstr((char*)USART3_RX_BUFFER,\"SEND OK\"))                    {                        return 0;                    }                 }                                 }        }    }    return 1;}

4.4 QT软件端代码布局poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

<!–

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: admin

为您推荐

如何使用GPU编程优化模型/代码

  使用 Python 和 NumPy 库开发的 HIM 模型在 hackathon 开始时没有并行或 GPU 计算。在活动期间, THINKLAB 团队使用 CuPy 为了使他们的代码在 GPU 上并行运行,然后重点将用户定义的 CUDA 内核应用于参数。结果是 672 倍加速,计算时间从 2 周缩短到大约 30 分钟。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

NVIDIA驱动程序支持OpenCL和Vulkan进行互操作

  OpenCL 和 Vulkan 之间的互操作在移动和桌面平台上都有很强的需求。 NVIDIA 与 Khronos OpenCL 工作组密切合作,发布了一套临时跨供应商的 KHR 扩展。这些扩展使应用程序能够在 OpenCL 和 Vulkan 等 API 之间高效地共享数据,与使用隐式资源的前一代互操作 API 相比,灵活性显著提高。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

准备去元宇宙过第二人生?小心别被骗了

准备去元宇宙过第二人生?小心别被骗了   电子发烧友网报道(文/黄山明)随着元宇宙在近期的大火,相信大家对于这一技术已不陌生。但元宇宙因为其特性,也需要建立合适的网络安全防护措施,来应对这项技术带来的独特挑战。并且在元宇宙想要得以持续,需要用去中心化的平权式共享机制与共治机制来作为保障,既要做大“蛋糕”,也要分好“蛋糕”。但问题在于,去中心化的元宇宙,在安全问题上也将面临更大的挑战。     先简单解释一下元\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

代工巨头再次换帅,中芯国际高管频频离职,业绩喜人之下原因为何?

电子发烧友网(文/黄山明)3月17日,中芯国际发出公告,公司代理董事长高永岗博士,获委任为中芯国际董事长,自2022年3月17日生效。而在半年前辞去中芯国际董事长职位的“芯片泰斗”周子学最终以身体原因为由,辞去了执行董事一职。   对于这一次的交接,有业内人士称这是一次完美的交接,对中芯国际乃至中国半导体产业都有着重要的影响。不过另一方面,自周子学辞任中芯国际董事长之后,其股价便一路走低,从半年前的21.1港元降至如今的\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

电子测量仪器企业普源精电上市!年营收超3亿,募资7.6亿加速自研芯片项目

电子发烧友网报道(文/莫婷婷)4月8日,普源精电在科创板上市,发行价格60.88元/股,公开发行股份约3032.74万股,占公司发行后总股本的比例为25%。该股上市当日开盘即破发,截至今日收盘,普源精电报39.78元,跌幅34.66%,总市值48.26亿元。   图源:东方财富   在上市之前,普源精电在招股书的风险因素中提到,“公司无法保证未来几年内实现盈利,公司上市后亦可能面临退市的风险”。2020年、2021年上半年,普源精电分别亏损2716.6万元、2036.48万元,连\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部