手机通过ESP8266(WiFi)控制stm32f103c8t6的洒水小车 ...

      最后更新:2021-12-18 20:39

      一、大致结构

      移动电话(通过TCP通过这一APP连接)连接 ess 826, esp8266 使用序列端口与一台机器(stm32f103c8t6)进行互动,而一台机器则分析数据,以实施动力和舵控控。

      两台电动机器控制了漏水器,一台用于移动,另一台用于水,另一台用于方向,另一台用于水。

      二、配置代码

      1..##.##.##

      ESP8266是一个低功率UART-WiFi电子学习模块。(a) 该行业拥有具有高度竞争力的超低耗能包装技术;专门设计用于移动设备和物体联网应用,用户的有形设备可与无线无线网络连接。这是与互联网或局域网(局域网)的连接。实现联网功能。

      硬件连接

      GND、VCC、TXD、RXD和CH-PD与esp8266模块的Satgle形状机器连接,该模块的TXD和RXD被倒转,而且该模块处于高水平工作状态。

      软件配置

      第1步: 配置 WiFi 模块的操作模式 。

      STA/AP/STA+AP业务模式得到ESP8266模块的支持。

      由于我是用手机连接WiFi,所以应该是WiFi作为热点,设置工作模式为AP模式                    指令为    “AT+CWMODE=<mode>”

      <mode>    1 STA 模式:ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设                      备的远程控制。

      2 AP模式:ESP 8266模块,作为直接移动电话或计算机与一个局域网的模块和无线控制进行直接接触的热点。

      3A+AP模式:两种模式共存模式,即通过互联网控制实现和执行无缝转换。

      第二步:以APP模式, 设定参数

      设置热点的参数 指令为“ AT+ CWSAP=<ssid>,<pwd>,<chl>,<ecn>”

      其中<ssid>字符串参数,热点名称,

      <pwd>字符串参数,密码最长 64 字节 ASCII,

      <chl>通道号,

      <ecn> 加密类型  0 OPEN

      2 WPA_PSK

      3 WPA2_PSK

      4 WPA_WPA2_PSK

      第三步:启动多连接

      设置热点连接类型( 单个或多个连接) 。

      指令为“AT+ CIPMUX=<mode>”

      <mode>        0 单路连接模式

      1 多路连接模式

      第5步:设置为服务器

      服务器被打开后, 它会自动构造一个监听服务器。 服务器在连接自动建立连接之前不会被启动 。 AT=1 + CIPMUX=1

      指令为“AT+ CIPSERVER= <mode>,<port>”

      <mode> 0 关闭 server 模式

      1 切换到服务器模式

      <port>    端口号,缺省值为 333

      WiFi 模块模块配置代码

      void esp8266_start_trans(void)
      {
      /配置工作模式1:标准模式2:AP模式3:遵守AP+标准模式
      	esp8266_send_cmd("AT+CWMODE=2","OK",100);	
      	esp8266_send_cmd("AT+CWSAP="yeyeye","12345678",1,3","OK",100);
      	esp8266_send_cmd("AT+CIPMUX=1","OK",100);
      	esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",100);
      }

      二. 接收和解决系列议定书

      移动电话将八位数的十六进制数据(包含指令头、地址、控制命令和校准代码)发送到一个单播放机,该机通过一个序列端口接收数据,对数据进行剖析,并完成对单播放机的控制。

      //协议接收
      void ESP8266_IntGenData(u16 rec_tem)
      	{
      接收静态的未签名字符 rea_ccount = 0; /
      Jean 以一个静态的未签名字符开头开始_rec=0;
      
      如果 (rec_tem = open_cpurec_tem = cpu_openstatse) // / 做出一个决定
      		{	
      			rec_count = 0;
      			start_rec = 1;
      		}
      		if(start_rec == 1) 
      		{ 
      rec_count++];//收到数据
      (rec_count=command_长度)//确定八人是否收到数据
      			{
      				start_rec = 0;
      				rec_flag = 1;			
      			}
      		}
      	}

      在序列端口收到的数据被发送到协议接收功能,该功能首先检查命令信头是否准确,如果准确,则检查收件人符号为1,数据保存在数组中。收到数据后,协议解析指标设为1,表明协议已经处理。

      三. 电气和舵的配置

      电机配置

      定时器的第3和第4频道分别用于调节前向和溢水的发动机。

      void TIM3_PWM_Init(u16 arr,u16 psc)
      {      
      	GPIO_InitTypeDef 			GPIO_InitStructure;
      	TIM_TimeBaseInitTypeDef  	TIM_TimeBaseStructure;
      	TIM_OCInitTypeDef  			TIM_OCInitStructure;
      
      	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
      / 使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, Enable)使 GPIO 外部时钟启用。
      	                                                                     	
      	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //
      GPIO_Init结构.GPIO_Mode = GPIO_Mode_AF_PP; // 驱动输出重复
      	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      	GPIO_Init(GPIOB, &GPIO_InitStructure);
      
      TIM_TimeBase Struitre.TIM_Period = arr; / 设定下次更新活动的自动重新装入内存周期值, 以装载活动 80K 。
      TIM_时间基结构。 TIM_ pressaker =psc; / 提供前频率值, 用作TIMx时钟频率, 按频率除以 。
      TIM_ TimeBase 结构 。 TIM_ 时基解析 = 0; / 配置时钟拆分 : TTDS = Tck_ tim
      //TIM_时间基结构。 TIM_对称模式 = TIM_对称模式 ;
      	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
      
       
      TIM_OCInit 结构 。 TIM_OCMode = TIM_OCMode_PWM1; // 计时模式选择: TIM Pulse Width 模式 2
      TIM_OCInitStustructionre.TIM_外源国家 = TIM_外源国家_联网;// 比较启用的输出 。
      TIM_OCInit 结构.TIM_ Pulse = 0; / / 设定装载脉冲值, 用于比较内存抓取
      / 出口极: TIM 输出更为严重 。 TIM_ OC Init StruitStructure.TIM_ OCPrity = TIM_ OCPrity_ high;
      	
      	TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
      	TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
      
      
      //CH1 预加载推进器 TIM_OC3 前加载config (TIM3, TIM_OC预加载-可使用);
      //CH2 预加载推进器 TIM_OC4 前加载config (TIM3, TIM_OC预加载-可使用);
      
      Tim_ARRPreloadConfig(TIM3, Enable); / ARR 上的 TIMx 预加载器
      	
      TIM_Cmd( TIM3, 可选); / / TIM3 已启用 。
      
      
      }
      

      舵机配置

      舵和溢水器的流量由2号定时器第1和第2频道控制。

      void MG996_SG90_pwm_init(void)
      {
      
      GPIO_ InitTypeDef GPIO_Init结构; / 此函数声明结构变量 。用来初始化GPIO
      
      Tim_Time_BasicInitTypeDef Tim_Time_BasicInitTypeDef Tim_Tim_TimeBaseIntitustructure;// 此函数声明结构变量 。用来初始化定时器
      
      TIM_OCInitTydef Tim_OCInit Structure;/ 取决于 TIM_OCInitStruct 提供的参数的 TIM_OCInitStruct 初始化 。
      
      * 设定计时器 *
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
      	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
      
      * 设置全球定位系统模型和IO嘴*
      	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_1;// PA0|PA1
      	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
      GPIO_ Init结构.GPIO_Mode = GPIO_mode_AF_PP;// 重复推进输出
      	GPIO_Init(GPIOA,&GPIO_InitStructure);
      	
      启动TIM3计时器
      自动再加载器周期的价值由 TIM_TimeBaseInitStruitStructure.TIM_Period = 199;/PWM 频率 = 7200/(199+1) = 36 Khz 确定。
      TIM_ Timm_ Timmex 时钟的频率前值。 TIM_ 预证器= 7199;/ 设定为 Timx 时钟的频率前值
      TIM_ TIM_ TimeBasyBase Init 结构 。 TIM_ Clock Dissession = 0;/ 配置时钟拆分: TTS = Tck_ tim
      //TIM_时间基础基础设施.TIM_对称模式 = TIM_对称模式更新;
      	TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);
      
      
      /PWM 基于 TIM_OCInitStruct 参数的TIMx外推法的初始化//初始化。
      	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
      PWM 输出能力 TIM_OC Init StruitStruitre. TIM_ 输出国= TIM_ 输出国_ 启动;// TIM_ OC Init Struitstructionre. TIM_ 输出国= TIM_ 输出国_ 启动;// TIM_ OC Init Struitstructionre. TIM_ 输出数据
      	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
      	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
      	TIM_OC2Init(TIM2,&TIM_OCInitStructure);
      注意在启动时使用TIM_OC1Init而不是TIM_OCInit。否则会出错。因为硬件版本各有不同。
      	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
      TIM_OC2 预装入config (TIM2, TIM_OC预装入_启用);/ 用于启动或禁用 CCR1 上的提姆克斯的预装入器。
      	TIM_ARRPreloadConfig(TIM2,ENABLE);
      TIM_Cmd (TIM2, 可容性);/ 侵入或破坏 TIMx 外部
      }

      4.红外避障

      在车辆前面安装了三个装有自动引水溢漏特征的红外住房单元。

      / 获得红外线避免模块的状况。
      char GetVoidStatus(void)
      {
      	char left=0,right=0,zhong=0;
      	char count;
      如果(bizhang_left = BARRIER_N) / 左侧出现紊乱, 则已观察到 。
      	{
      			left = 1;
      	}
      	else left=0;
      	
      如果(bizhang_rights = BARRIER_N) / 右侧发现一个屏障 。
      	{
      			right = 2;
      	}
      	else right = 0;
      	
      如果(bizhang_zhong = BARRIER_N) / 前面的障碍被识别
      	{
      			zhong = 4;	
      	}
      		else zhong = 0;
      	
      	return left + right+zhong;
      }
      
      //红外避障处理
      发现左向右转
      / 右转已检测到, 左转 。
      / / 前方检测到 停止, 撤退, 右转
      / / 在所有检测到的侧面 停止, 后退, 右转
      // 未确定直线
      void VoidRun(void)
      {
      	char status=7;	
      
      				
      		if(model==12)
      			{
      				status = GetVoidStatus();	 
      			}		
      	switch(status)
      	{
      		case VOID_1: ;
      	 CarLeft(); delay_ms(1000);Cargo();
      			break;
      		case VOID_2:
      	CarRight(); 	delay_ms(1000); Cargo();
      			break;
      		case VOID_3:
      	CarStop();
      			break;
      		case VOID_4:
      	CarStop();delay_ms(500);CarBack(); delay_ms(1500);CarRight();  delay_ms(1000);Cargo();
      			break;
      		case VOID_5:
      	CarStop();delay_ms(500);CarBack(); delay_ms(1500);CarRight();  delay_ms(1000);Cargo();
      			break;
      		case VOID_6:
      	CarStop();delay_ms(500);CarBack(); delay_ms(1500);CarRight();  delay_ms(1000);Cargo();
      			break;		
      		case VOID_NONE:
      			Cargo();
      			break;
      		default: break;
      	}
      }

      三、成品展示

      ESP 8266.Zip - 嵌入文件类资源 - CSDN下载

      内附完整代码

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类