红外循迹传感器
红外循迹传感器采用TCRT5000红外反射传感器,一种集发射与接收于一体的光电传感器,它由一个红外发光二极管和一个NPN红外光电三极管组成。检测反射距离1mm-25mm适用,传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。可以应用于机器人避障、机器人进行白线或者黑线的跟踪,可以检测白底中的黑线,也可以检测黑底中的白线,是寻线机器人的必备传感器。。
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a230r.1.14.16.7def2810sScrt7&id=580318855469&ns=1&abbucket=12
资料下载链接:
https://pan.baidu.com/s/11dDQHyYJfi0nNyC28vkpoA
资料提取码:qvpm
规格参数
工作电压:3.3V-5V
检测反射距离:1mm~25mm适用
输出方式: DO接口为数字量输出;AO接口为模拟量输出
读取方式:ADC
管脚数量:4 Pin(2.54mm间距排针)
原理解析
TCRT5000 传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。
其对应的原理图见图6.3-1,AO输出为红外循迹传感器直接输出的电压,所以为模拟量;DO为经过LM393进行电压比较后,输出高低电平,所以为数字量。具体原理见光敏电阻光照传感器章节的3.3 查看资料。
移植过程
引脚选择
移植至工程
我们的目标是将例程移植至ESP32-S3开发板上。已经为大家提供了完整的驱动代码,按照以下步骤,即可完成移植。
具体新建文件夹和新建c和h文件在 【DHT11温湿度传感器】章节中的1.4.2小节中有详细的教学,这里就不再多说了。
只不过这里我们将文件名 bsp_dht11.c 和 bsp_dht11.h 换成 bsp_IRtracking.c 和 bsp_IRtracking.h,文件夹名字改为IRtracking。
代码写入
在 bsp_IRtracking.c 文件中写入:
#include "bsp_IRtracking.h"
#include "stdio.h"
esp_adc_cal_characteristics_t *adc_chars;
void delay_ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void delay_us(unsigned int us)
{
ets_delay_us(us);
}
/******************************************************************
* 函 数 名 称:IRtracking_GPIO_Init
* 函 数 说 明:红外循迹模块引脚初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:
******************************************************************/
void IRtracking_GPIO_Init(void)
{
gpio_config_t DO_config = {
.pin_bit_mask = (1ULL<<DO_GPIO_PIN), //配置引脚
.mode =GPIO_MODE_INPUT, //输出模式
.pull_up_en = GPIO_PULLUP_DISABLE, //不使能上拉
.pull_down_en = GPIO_PULLDOWN_DISABLE, //不使能下拉
.intr_type = GPIO_INTR_DISABLE //不使能引脚中断
};
gpio_config(&DO_config);
adc1_config_width(width);// 12位分辨率
//ADC_ATTEN_DB_0:表示参考电压为1.1V
//ADC_ATTEN_DB_2_5:表示参考电压为1.5V
//ADC_ATTEN_DB_6:表示参考电压为2.2V
//ADC_ATTEN_DB_11:表示参考电压为3.3V
adc1_config_channel_atten( channel,atten);// 设置通道0和3.3V参考电压
// 分配内存
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
// 对 ADC 特性进行初始化,使其能够正确地计算转换结果和补偿因素
esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
}
/******************************************************************
* 函 数 名 称:Get_ADC_Value
* 函 数 说 明:对ADC值进行平均值计算后输出
* 函 数 形 参:num采集次数
* 函 数 返 回:对应扫描的ADC值
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned int Get_ADC_Value(unsigned int num)
{
unsigned int Data=0;
int i = 0;
for( i = 0; i < num; i++ )
{
Data += adc1_get_raw(channel);
delay_ms(1);
}
Data = Data/num;
return Data;
}
/******************************************************************
* 函 数 名 称:Get_DO_Num
* 函 数 说 明:读取传感器识别状态
* 函 数 形 参:无
* 函 数 返 回:1=识别为黑色 0=识别的不是黑色
* 作 者:LC
* 备 注:可以通过模块上的可调电阻调整识别黑色的阈值
******************************************************************/
unsigned char Get_DO_Num(void)
{
if( IR_DO == 1 )//灯灭识别为黑色
{
return 1;
}
else//灯亮识别的不是黑色
{
return 0;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
在 bsp_IRtracking.h文件中写入:
#ifndef _BSP_IRTRACKING_H_
#define _BSP_IRTRACKING_H_
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_rom_sys.h"
#include "esp_timer.h"
#include "driver/uart.h"
#include "rom/ets_sys.h"
#include "esp_system.h"
#include "driver/gptimer.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include "driver/spi_master.h"
#include "nvs_flash.h"
#include "esp_adc/adc_cali_scheme.h"
#include "esp_adc/adc_cali.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
#define DEFAULT_VREF 1100 //默认参考电压,单位mV
#define channel ADC_CHANNEL_0 // ADC测量通道
#define width ADC_WIDTH_BIT_12 // ADC分辨率
#define atten ADC_ATTEN_DB_11 // ADC衰减
#define unit ADC_UNIT_1 // ADC1
#define AO_GPIO_PIN 1
#define DO_GPIO_PIN 2
#define IR_DO gpio_get_level(DO_GPIO_PIN)
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void IRtracking_GPIO_Init(void);//初始化
unsigned int Get_ADC_Value(unsigned int num);//读取AO值
unsigned char Get_DO_Num(void);//读取DO值
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
到这里移植完成了,请移步到 6.5 进行移植验证。
移植验证
在main.c中输入代码如下
#include <stdio.h>
#include "bsp_IRtracking.h"
void app_main(void)
{
IRtracking_GPIO_Init();
printf("IRtracking demo start\r\n");
while(1)
{
printf("AO = %d\r\n", Get_ADC_Value(20) );
printf("DO = %d\r\n",Get_DO_Num() );
delay_ms(1000);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上电示例:
驱动代码: