文章目录

引言

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);       }

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

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

  1. 2021校赛基于stm32f103多功能台灯

    2021校赛基于stm32f103多功能台灯 起源 又到了一学期一次的校内电子设计大赛,又到了激动人心的时刻每次电子设计大赛都会出现各种大佬展现他们的作品,对于我这种菜鸟也只能默默观望,但是呢,积极参 ...

  2. 基于CUBEMX和STM32C8T6的同轴麦轮小车制作(二)——HAL库接受jy61p陀螺仪数据,并解决数据溢出卡死问题。

    基于CUBEMX和STM32C8T6的同轴麦轮小车制作(二)--HAL库接受jy61p陀螺仪数据,并解决数据溢出卡死问题 本文利用STM32C8T6中的串口1于JY61P实时通信,并用串口2将其角度打 ...

  3. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  4. 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

    系列文章目录 一.基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二.基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三.实战 ...

  5. STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC

    STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC 本博客完整代码下载地址:https://download.csdn.net/download/qq15347150 ...

  6. 基于STM32F429和HAL库的CAN收发例程(原子阿波罗F429的CAN)可以依据他参考移植STM32F413程序

    基于STM32F429和HAL库的CAN收发例程 1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信 协议.在 ...

  7. HAL库版STM32双轮自平衡车(三) ———代码精讲

    系列文章目录 编码电机测速 HAL库OLED的使用 HAL库版STM32双轮自平衡车(一) ---代码思路和PID基础精讲 HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接 ...

  8. HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲

    系列文章目录 HAL库版STM32双轮自平衡车(一) ---代码思路和PID的简单介绍(本篇) HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接线.物料准备 HAL库版ST ...

  9. HAL库版STM32双轮自平衡车(五) ———— 调参

    系列文章目录 HAL库版STM32双轮自平衡车(一) ---代码思路和PID基础精讲 HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接线.物料准备 HAL库版STM32双轮 ...

最新文章

  1. OutofMemory之PermGen介绍
  2. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
  3. 十分钟入门RocketMQ
  4. superset出现unhashable type: ‘dict‘
  5. 给其他账户访问mysql的权限,将postgresql数据库的权限授予其他用户
  6. mybatis 一对多查询 按结果嵌套处理、按查询嵌套处理,以及两者之间的区别
  7. 快速排序伪代码_归并排序之入门到quot;放弃quot;
  8. oracle 分表和分区哪个好_互联网大厂有哪些分库分表的思路和技巧?
  9. 魔兽服务器联盟在线,《魔兽世界》怀旧服再开新服,部落联盟泾渭分明?
  10. HDU - 4456 Crowd
  11. 这个0day 影响启用 Sandbox 的多数 Windows 10 版本
  12. 分享MYSQL中的各种高可用技术
  13. 方维系统登陆弹窗,登陆后自动刷新当前页的实现方法
  14. linux c libxml2的使用
  15. cad等比例缩放快捷键_终于领会CAD缩放(放大与缩小)快捷键
  16. Python——IDLE是什么意思?
  17. win7无法发现工作组计算机,系统之家win7系统在同一个工作组看不到其他电脑的解决方法...
  18. 重磅:一台电脑两个macOS系统,macOS Big Sur和macOS Monterey切换使用
  19. 网络学习提要,真是太全了
  20. multisim电流探棒怎么改变方向?MULTISIM电流探

热门文章

  1. 导航系统 与 自动驾驶系统 基本概念
  2. 微信现金红包签名失败问题
  3. 浅谈 MySQL for excel
  4. 使用Go模板生成文本
  5. 微信小程序分包反编译教程
  6. 今天给大家分享一个HTML5的钢琴代码,可以弹奏的哦!(附完整源码)
  7. python 量化交易靠谱吗_个人做量化交易靠谱吗?
  8. 微信小程序web-view嵌入h5页面,分享当前页
  9. 玩树梅派学linux-shell编程
  10. USMART串口调试