工创赛基于stm32f103的HAL库的全向麦轮的四个7路寻迹传感器智能款采集程序

文章目录

引言

1.寻迹传感器工作原理介绍

2.使用方法

3.代码实现


引言:

    基于刚刚结束的工创赛给大家分享一下我们的传感器选择方案

一、寻迹传感器工作原理介绍

       灰度传感器有数字传感器和模拟传感器两种,其原理大致相同。原理:一只发光二极管和一只光敏二极管,安装在同一面上。灰度传感器利用不同颜色的检测面对光的反射程度不同的原理进行颜色深浅检测。在有效的检测距离内(理论上距离可以无限远,实际受外界光源的影响,最佳距离为15mm至50mm,如果距离过高的话,需要进行遮光),发光二极管发出的光,照射在检测面上,检测面反射部分光线,光敏二极管检测此光线的强度并将其转换为单片机可以识别的电信号。这个电信号是一个模拟值,单片机可以根据模拟值的大小进行二值化处理,也就是给一个电平分界线,当电压大于一个值的时候给一个高电平(或低电平),当电压小于一个值的时候给一个低电平(或高电平)。当然这里可以用电压比较器作为电平的参考电压。这就是我们用的数字量灰度传感器。数字量的灰度传感器如果加入的是单片机处理数据,那么可以把得到的原始数据加入滤波算法、数据混合算法得到一个波动小、适应环境强的数字传感器。 如果对采集的原始的数据不做处理,那么就是模拟值输出。也就是我们的模拟量灰度传感器。因为每路传感器相互之间都是有误差的,所以同样的条件下模拟值肯定不是一样。

作为我们使用者来说一般知道怎么用就可以了(说点人话)简单来说智能款传感器有两种输出方式

第一种是通过gpio输出高低电平5v/3.3v(例如传感器在黑线上输出高电平,不在黑线上输出低电平)

第二种是串口通信,因为在智能款传感器上有一颗mcu通过自身的采集和计算可以采集到传感器的状态,而我们要做的就是用我们的主板与传感器的主板通信就可以来知道我们想知道的传感器的状态就可以了。


 2.使用方法

接下来给大家讲一下使用方法(仅供参考)

作为一个麦轮车要想进准的定位首先就是位置状态足够多从而实现位置闭环,如果采用第一种gpio输出高低电平的话,那么一路对应着一路引脚,四个7路就是28个引脚,太占引脚而且麻烦,所以我们采用第二种串口通信的方式,stm32f103这个型号的板子有5路硬件串口,四路作为与传感器通信,一路与我们的上位机通信处理数据和计算从而改变车身校正。

提供一个思路

第一步配置cubemx的串口

首先配置RCC、SYS、clock(这里跳过了)

 

 

然后生成项目文件打开


3.代码实现

1.主函数代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_UART4_Init();
  MX_UART5_Init();
  /* USER CODE BEGIN 2 */
delay_ms(1000);
HAL_UART_Transmit(&huart2,&Tx_strcc,sizeof(Tx_strcc),10000);//串口2发送函数
HAL_UART_Receive_IT(&huart1,&Rx_mcu,1);//串口1接收函数
HAL_UART_Receive_IT(&huart5,&Rx_dat2,1);//串口5接收函数
HAL_UART_Receive_IT(&huart3,&Rx_dat3,1);//串口3接收函数				
HAL_UART_Receive_IT(&huart2,&Rx_dat,1); //串口2接收函数

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	}
  /* USER CODE END 3 */
}

 2.串口中断代码

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  
{
	if((huart->Instance)==USART1)
			{ 
				if(Rx_mcu==0x00)
				{chuan_flag=0;
        Rx_dat=0;	
				Rx_dat2=0;	
				Rx_dat3=0;	
        wink=0;					
				}
				if(Rx_mcu==0x31)
				{chuan_flag=1;				
				}
				if(Rx_mcu==0x32)
				{chuan_flag=2;				
				}
				if(Rx_mcu==0x33)
				{chuan_flag=3;				
				}
				if(Rx_mcu==0x34)
				{chuan_flag=4;				
				}
			  if(Rx_mcu==0x35)
				{chuan_flag=5;				
				}
				if(Rx_mcu==0x36)
				{qq=1;
					chuan_flag=6;
				}
				if(Rx_mcu==0x37)
				{qq=0;
					chuan_flag=7;
					}					
				if(Rx_mcu==0x38)
				{qq=0;
					chuan_flag=8;
				}
				if(Rx_mcu==0x39)
				{qq=0;
					chuan_flag=9;
				}
				if(Rx_mcu==0x3a)
				{qq=0;
					chuan_flag=10;
				}
				if(Rx_mcu==0x3b)
				{qq=0;
					chuan_flag=11;
				}
				if(Rx_mcu==0x3c)
				{qq=1;				 
					chuan_flag=12;
				}
				if(Rx_mcu==0x3d)
				{qq=0;
					chuan_flag=13;
				}
				if(Rx_mcu==0x3e)
				{qq=0;
					chuan_flag=14;
				}
				if(Rx_mcu==0x3f)
				{qq=1;
					chuan_flag=15;
				}
				if(Rx_mcu==0x40)
				{qq=0;
					chuan_flag=16;
				}
				if(Rx_mcu==0x41)
				{qq=0;
					chuan_flag=17;
				}
				if(Rx_mcu==0x42)
				{qq=1;
					chuan_flag=18;
				}
				if(Rx_mcu==0x43)
				{qq=0;
				 chuan_flag=19;
				}
				send_data();
      HAL_UART_Receive_IT(&huart1,&Rx_mcu,1);	
			
			}
      if((huart->Instance)==UART5)
			{			
				if(chuan_flag==4)
						{if(Rx_dat2 == 0x40)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
							}}
												if(chuan_flag==5)
						{if(Rx_dat2 == 0x7f)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}}
												 if(chuan_flag==7)
						{
							if(chu_or_jue==chu)
							{
							if(Rx_dat2 == 0x08)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
							}
							if(Rx_dat2 == 0x10||Rx_dat2 == 0x18||Rx_dat2 == 0x20||Rx_dat2 == 0x40||Rx_dat2 == 0x30||Rx_dat2 == 0x60||Rx_dat2 == 0x70)
							{HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
							}
							if(Rx_dat2 == 0x04||Rx_dat2 == 0x0c||Rx_dat2 == 0x02||Rx_dat2 == 0x01||Rx_dat2 == 0x06||Rx_dat2 == 0x07||Rx_dat2 == 0x03)
							{HAL_UART_Transmit(&huart1,&Tx_0x34,sizeof(Tx_0x34),10000);     
							}
						  }		
							if(chu_or_jue==jue)
							{
							if(Rx_dat2 == 0x08)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
							}
						  }
							if(chuan_flag==9)
						{if(Rx_dat2 == 0x40)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
							}}
						if(chuan_flag==10)
						{if(Rx_dat2 != 0x40&&Rx_dat2 != 0x20&&Rx_dat2 != 0x60)
							{HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
							}
						}
            if(chuan_flag==13)
						{ 
							
							if(Rx_dat2 == 0x08)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}	
							if(Rx_dat2 == 0x04||Rx_dat2 == 0x0c||Rx_dat2 == 0x02||Rx_dat2 == 0x01||Rx_dat2 == 0x06||Rx_dat2 == 0x07||Rx_dat2 == 0x03)
							{HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
							}	
							if(Rx_dat2 == 0x10||Rx_dat2 == 0x18||Rx_dat2 == 0x20||Rx_dat2 == 0x40||Rx_dat2 == 0x30||Rx_dat2 == 0x60||Rx_dat2 == 0x70)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x31),10000);     
							}
							wink++;
						}
            else if(chuan_flag==14)
						{if(Rx_dat2 == 0x08)
							{HAL_UART_Transmit(&huart1,&Tx_0x34,sizeof(Tx_0x34),10000);     
							}}
						else if(chuan_flag==17)
						{if(Rx_dat2 == 0x01||Rx_dat2 == 0x02||Rx_dat2 == 0x03)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}
							if(Rx_dat2 == 0x40||Rx_dat2 == 0x20||Rx_dat2 == 0x30)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
							}
						}
						 HAL_UART_Transmit(&huart5,&Tx_strcc,sizeof(Tx_strcc),10000);
HAL_UART_Receive_IT(&huart5,&Rx_dat2,1);						 						
			}
			if((huart->Instance)==USART3)
			{					
				 if(chuan_flag==6)
						{if(Rx_dat3 == 0x7f)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}}
																		else if(chuan_flag==18)
						{if(Rx_dat3 == 0x01||Rx_dat3 == 0x02||Rx_dat3 == 0x03)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}
							if(Rx_dat3 == 0x40||Rx_dat3 == 0x20||Rx_dat3 == 0x30)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
							}
						}
						HAL_UART_Transmit(&huart3,&Tx_strcc,sizeof(Tx_strcc),10000);
			 HAL_UART_Receive_IT(&huart3,&Rx_dat3,1);		
			 }
			if((huart->Instance)==USART2)                      
      {    
				   if(chuan_flag==1)
						{if(Rx_dat == 0x08||Rx_dat == 0x04||Rx_dat == 0x0c)        
			     {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);						 
           }}
            if(chuan_flag==2)
						{if(Rx_dat == 0x7f)        
			     {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);						 
           }}
						 if(chuan_flag==3)
						{
           if(Rx_dat != 0x7f)       
			     {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000); 						 							 
             }
					  if(Rx_dat == 0x7f)        
			     {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);            						
            }}
						
						if(chuan_flag==8)
						{if(Rx_dat == 0x08)
							{HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
							}}	
            if(chuan_flag==11)
						{
							if(Rx_dat == 0x08)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}	
							if(Rx_dat == 0x04||Rx_dat == 0x0c||Rx_dat == 0x02||Rx_dat == 0x01||Rx_dat == 0x06||Rx_dat == 0x07||Rx_dat == 0x03)
							{HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
							}
							if(Rx_dat >= 0x10||Rx_dat == 0x18||Rx_dat == 0x20||Rx_dat == 0x40||Rx_dat == 0x30||Rx_dat == 0x60||Rx_dat == 0x70)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x31),10000);     
							}
							wink++;
						}
           	if(chuan_flag==12)
						{if(Rx_dat == 0x3f)
							{HAL_UART_Transmit(&huart1,&Tx_0x37,sizeof(Tx_0x37),10000);     
							}
						}
            else if(chuan_flag==15)
						{if(Rx_dat == 0x40)
							{HAL_UART_Transmit(&huart1,&Tx_0x35,sizeof(Tx_0x35),10000);     
							}}
						else if(chuan_flag==16)
						{if(Rx_dat == 0x01||Rx_dat == 0x02||Rx_dat == 0x03)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}
							if(Rx_dat == 0x40||Rx_dat == 0x20||Rx_dat == 0x30)
							{HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
							}
						}
             if(chuan_flag==19)
						{if(Rx_dat == 0x20||Rx_dat == 0x30)
							{HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
							}
						}			
				if(chu_or_jue==1)
				{					
HAL_UART_Receive_IT(&huart1,&Rx_mcu,1);	
				}
  HAL_UART_Transmit(&huart2,&Tx_strcc,sizeof(Tx_strcc),10000);
      HAL_UART_Receive_IT(&huart2,&Rx_dat,1);       
			}

(大家仅供参考)这个是当时我当时做的所有的位置当时用到哪个位置就就写到哪了有点乱哈=.=

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是在ESP32上使用Thonny控制与HX711模块连接的压力传感器的代码,并输出质量大小: ```python from machine import Pin import time class HX711: def __init__(self, dout_pin, pd_sck_pin, gain=128): self._dout_pin = Pin(dout_pin, mode=Pin.IN) self._pd_sck_pin = Pin(pd_sck_pin, mode=Pin.OUT) self._pd_sck_pin.value(0) self._offset = 0 self._gain = 1 self.set_gain(gain) def set_gain(self, gain): if gain == 128: self._gain = 1 elif gain == 64: self._gain = 3 elif gain == 32: self._gain = 2 self._pd_sck_pin.value(0) self.read() def read(self): while self._dout_pin.value() == 1: pass data = 0 for i in range(24): self._pd_sck_pin.value(1) data = (data << 1) | self._dout_pin.value() self._pd_sck_pin.value(0) self._pd_sck_pin.value(1) data = data ^ 0x800000 self._pd_sck_pin.value(0) return data def _calculate_offset(self, times=15): sum = 0 for i in range(times): sum += self.read() self._offset = sum / times def get_weight(self): value = self.read() - self._offset value = value / (self._gain * 1.0) return value hx711 = HX711(dout_pin=34, pd_sck_pin=32) hx711._calculate_offset() while True: weight = hx711.get_weight() if weight < -10: print("Bad quality") elif weight < 0: print("Low quality") elif weight < 10: print("Medium quality") else: print("High quality") time.sleep(1) ``` 在上面的代码中,我们定义了一个HX711类,用于控制HX711模块。read方法用于读取称重结果,get_weight方法用于获取真实重量,_calculate_offset方法用于计算偏移量,以便去掉模块自身的误差。 在主程序中,我们创建了一个HX711对象,并调用了_calculate_offset方法来计算偏移量。之后,我们进入了一个while循环,在循环中不断地调用get_weight方法来获取当前的重量,并根据重量大小输出相应的质量大小。 在这里,我们通过判断重量值的大小,将质量分为了四个级别:高质量、中等质量、低质量和差质量。如果重量小于-10,则认为是差质量,小于0则认为是低质量,小于10则认为是中等质量,否则认为是高质量。 你可以将这段代码复制到Thonny IDE中,连接ESP32和HX711模块,并运行程序,通过串口监视器查看输出的质量大小。注意,这里的重量值是按照压力传感器的压力值来计算的,需要根据具体传感器的压力范围进行调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值