如何使用探索者传感器
作者:机器谱
触碰传感器 触须传感器 近红外传感器 闪动传感器 光强传感器 灰度传感器 白标传感器 声控传感器 加速度传感器 超声测距模块 温湿度传感器 摇杆模块 IIC颜色传感器 红外编码器 新版红外编码器 电子罗盘 六轴陀螺仪 语音识别模块 TCS3200颜色 |
2. 工作原理
触发触碰传感器后,该传感器会在其输出端输出数字量0,即低电平信号,未触发时输出数字量1,即高电平信号。
原理图:
1. 简介
触碰传感器是一种开关量传感器,它的检测元件是一个微动开关(小行程限位开关),可以检测物体对开关的有效触碰,开关行程距离约2mm,接触式触发。触碰传感器一般用于机器人或机器的行程限位,是一种简单稳定的传感器,在工业里也有广泛的应用。
触碰传感器的检测元件:微动开关
引脚从左到右接线说明表
实物与PCB引脚对照图
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void forward(void); void back(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM4_PWM_Init(20000-1,84-1); TIM3_PWM_Init(20000-1,84-1); //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. LED0=0; while(1) { if(flag){ if(num%2 == 0) forward(); else back(); num++; flag = FLASE; } } } void forward(void) { TIM_SetCompare1(TIM4,0); TIM_SetCompare4(TIM3,2000); } void back(void) { TIM_SetCompare1(TIM4,2000); TIM_SetCompare4(TIM3,0); } |
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
序号 | 内容 |
1 | 触碰传感器电路原理图等 |
2 | Arduino例程-触碰控制电机转动 |
3 | STM32例程-触碰传感器测值 |
4 | STM32例程-触碰控制编码电机转动 |
5 | STM32例程-触碰控制舵机运动 |
3. Arduino上的用法
(1)获取数据
环境:Basra主控板,Bigfish扩展板,触碰传感器,Arduino IDE等等。
触碰传感器只能输出数字量信号。可将传感器接在Bigfish的A0接口上,烧录如下程序:
在Serial Monitor(串口监视器)中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
(2)用法示例
效果:按下触碰传感器的微动开关时,直流电机转动,否则直流电机静止。
环境:Basra主控板,Bigfish扩展板,触碰传感器,直流电机,Arduino IDE等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5,6直流接口上。
程序:
void stop(); void spin(); void setup() { pinMode( A0, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(A0) )) { spin(); } else { stop(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
5. 应用场景
· 机器人触碰避障
· 机器的启动开关
· 机器的行程限位
6. 资料清单
(2)用法示例
效果:按下触碰传感器的微动开关时,直流电机反转,否则直流电机正转。
环境:MCU-F4主控板,SH-F4TT扩展板,触碰传感器,直流电机,Keil编程软件等。
电路:将传感器接在扩展板的的PA0接口上,直流电机接在PC6,PC7;PC8,PC9口上。
重点程序展示:
4. STM32上的用法
(1)获取数据
环境:MCU-F4主控板,SH-F4TT扩展板,触碰传感器,Keil编程软件等等。
触碰传感器只能输出数字量信号。可将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手中可以读取到数据。传感器触发输出0,否则输出1。
【整体打包】-【U009】如何使用探索者传感器-触碰-资料附件.zip | 26.62MB | 下载101次 | 下载 |
1. 简介
触须传感器是一种仿生类的传感器,同时它也是一种数字量(开关量)传感器,触须传感器的检测元件是一个拉簧和金属环,拉簧和金属环环共同起检测作用。此传感器可应用于机器人的设计中,它可以使机器人良好的感知外界环境,并且做出相应判断,可以使机器人在快速移动的过程中,避免发生碰撞。
2. 工作原理
触须传感器是一种开关量传感器,即拉簧和金属环接触式激发,触发触须传感器后,该传感器会在其输出端输出数字量0,即低电平信号,未触发时输出数字量1,即高电平信号。当触须传感器的触须接触到物体时,触须传感器将会被触发,即触须传感器的输出口将会输出低电平。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void forward(void); void back(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM4_PWM_Init(20000-1,84-1); TIM3_PWM_Init(20000-1,84-1); //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. LED0=0; while(1) { if(flag){ if(num%2 == 0) forward(); else back(); num++; flag = FLASE; } } } void forward(void) { TIM_SetCompare1(TIM4,0); TIM_SetCompare4(TIM3,2000); } void back(void) { TIM_SetCompare1(TIM4,2000); TIM_SetCompare4(TIM3,0); } |
void stop(); void spin(); void setup() { pinMode( 14, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(14) )) { spin(); } else { stop(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
3. Arduino上的用法
(1)获取数据
器材:Basra主控板,Bigfish扩展板,触须传感器等。
触须传感器只能输出数字量信号。可将传感器接在Bigfish的A0接口上,烧录如下程序。
在Serial Monitor中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
效果:触发触须传感器时,直流电机转动,否则直流电机静止。
器材:Basra主控板,Bigfish扩展板,触须传感器,直流电机等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5/6直流接口上。
本实验例程源代码如下:
4. STM32上的用法
(1)获取数据
环境:MCU-F4主控板,SH-F4TT扩展板,触须传感器,Keil编程软件等等。
触须传感器只能输出数字量信号。可将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手中可以读取到数据。传感器触发输出0,否则输出1。
(2)用法示例
效果:触发触须传感器时,直流电机正转,否则直流电机反转。
器材:MCU-F4主控板,SH-F4TT扩展板,触须传感器,直流电机等。
电路:将传感器接在扩展板的PA0接口上,直流电机接在PC6,PC7;PC8,PC9口上。
本实验例程源代码如下:
5. 应用场景
· 仿生昆虫的触须外观
· 智能小车的柔性接触避障
6. 资料清单
序号 | 内容 |
1 | 触须传感器电路原理图等 |
2 | Arduino例程-触须控制电机转动 |
3 | STM32例程-触须传感器测值 |
4 | STM32例程-触须控制编码电机转动 |
【整体打包】-【U009】如何使用探索者传感器-触须-附件资料.zip | 17.91MB | 下载25次 | 下载 |
1. 简介
近红外传感器是一种开关量传感器,它可以检测到前方是否有物体存在,当检测到有物体存在时,传感器输出口会输出低电平;相反在未检测到前方有物体时,传感器输出口会输出一个高电平。主控芯片可根据传感器采集的电平高低做出相应的动作指令。
2. 工作原理
近红外线传感器是利用红外线的物理性质来进行测量的传感器。红外线又称红外光,它具有反射、折射、散射、干涉、吸收等性质。而近红外传感器正是利用其这一特性工作的,当前方有物体并且在红外线反射范围之内时,传感器会接收到反射的红外线,进而触发近红外传感器。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
3. Arduino上的用法
(1)获取数据
环境:Basra主控板,Bigfish扩展板,近红外传感器,Arduino IDE等。
检测数字量,将传感器接在Bigfish的A0接口上,烧录如下程序。
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
void stop(); void spin(); void setup() { pinMode( 14, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(14) )) { stop(); } else { spin(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void Turn_180(void); void Turn_0(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM12_PWM_Init(20000-1,84-1);//定时器初始化 //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. TIM_SetCompare2(TIM12,1500); while(1) { if(flag){ if(num%2 == 0) Turn_180(); else Turn_0(); num++; flag = FLASE; } } } void Turn_180(void) { for(int i=1500; i < 2500; i++){ TIM_SetCompare2(TIM12,i); delay_ms(1); } for(int i=2500; i > 1500; i--){ TIM_SetCompare2(TIM12,i); delay_ms(1); } } void Turn_0(void) { for(int i=1500; i > 500; i--){ TIM_SetCompare2(TIM12,i); delay_ms(1); } for(int i=500; i < 1500; i++){ TIM_SetCompare2(TIM12,i); delay_ms(1); } } |
在Serial Monitor中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
(2)用法示例
效果:当近红外传感器检测到障碍物时,直流电机停止,否则直流电机保持转动。
环境:Basra主控板,Bigfish扩展板,近红外传感器,直流电机,Arduino IDE等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5,6直流接口上。
代码如下:
4. STM32上的用法
(1)获取数据
环境:MCU-F4主控板,SH-F4TT扩展板,近红外传感器,Keil5编程软件等等。
检测数字量,将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手种可以读取到数据。传感器触发输出0,否则输出1。低电平时传感器触发。
(2)用法示例
效果:接通电源,当近红外传感器检测到障碍物时,舵机运行到180°,再次触发时,舵机运动到0°。
环境:MCU-F4主控板,SH-F4TT扩展板,近红外传感器,180°舵机,Keil5 编程软件等。
电路:将传感器接在扩展板的PA0接口上,舵机接在PB15引脚上。
C代码:
5. 应用场景
· 机器人避障、跟随
· 目标、障碍等物体的检测
6. 资料清单
序号 | 内容 |
1 | 近红外传感器电路原理图等 |
2 | Arduino例程-近红外控制电机转动 |
3 | STM32例程-近红外传感器测值 |
4 | STM32例程-近红外控制编码电机转动 |
【整体打包】-【U009】如何使用探索者传感器-近红外-资料附件.zip | 17.94MB | 下载33次 | 下载 |
1. 简介
闪动传感器是一个开关量传感器,也就是开关量传感器,它可以检测光线变化的动作,即当它检测到光线明暗变化时,就会被触发,进而输出一个低电平;当光线无明显变化时,闪动传感器将不会被触发,即传感器将会一直以高电平输出。
2. 工作原理
闪动传感器作为一个开关量传感器,它的工作原理就是检测光线的明暗变化,进而控制其输出口电平的高低不同。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
void stop(); void spin(); void setup() { pinMode( 14, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(14) )) { spin(); } else { stop(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void forward(void); void back(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM4_PWM_Init(20000-1,84-1); TIM3_PWM_Init(20000-1,84-1); //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. LED0=0; while(1) { if(flag){ if(num%2 == 0) forward(); else back(); num++; flag = FLASE; } } } void forward(void) { TIM_SetCompare1(TIM4,0); TIM_SetCompare4(TIM3,2000); } void back(void) { TIM_SetCompare1(TIM4,2000); TIM_SetCompare4(TIM3,0); } |
3. Arduino上的用法
(1)获取数据
环境:Basra主控板,Bigfish扩展板,闪动传感器,Arduino IDE等等。
检测数字量,将传感器接在Bigfish的A0接口上,烧录如下程序。
在Serial Monitor中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
效果:当闪动传感器检测到光线变化时,直流电机转动,否则直流电机静止。
环境:Basra主控板,Bigfish扩展板,闪动传感器,直流电机,Arduino IDE等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5、6直流接口上。
代码:
4. STM32上的用法
(1)获取数据
环境:MCU-F4主控板,SH-F4TT扩展板,闪动传感器,Keil编程软件等等。
闪动传感器只能输出数字量信号。可将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手中可以读取到数据。传感器触发输出0,否则输出1。
(2)用法示例
效果:触发闪动传感器时,直流电机正转,否则直流电机反转。
器材:MCU-F4主控板,SH-F4TT扩展板,闪动传感器,直流电机等。
电路:将传感器接在扩展板的PA0接口上,直流电机接在PC6,PC7;PC8,PC9口上。
C代码:
5. 注意事项
该传感器为普通传感器,所以应当避免其工作在非正常环境下,即一些高温、高压等严峻环境下。
6. 应用前景
· 机器人检测光线的闪烁变化
· 检测环境中光线变化的应用
7. 资料清单
序号 | 内容 |
1 | 闪动传感器电路原理图等 |
2 | Arduino例程-闪动控制电机转动 |
3 | STM32例程-闪动传感器测值 |
4 | STM32例程-闪动控制编码电机转动 |
【整体打包】-【U009】如何使用探索者传感器-闪动.zip | 17.9MB | 下载0次 | 下载 |
1. 简介
光强传感器是由一个光敏三极管以及双运算运放芯片LM358组成,光敏三极管是作为信号采集部分,负责将光信号转换为电信号,并且在三极管的反向电流会随着光照强度的改变而变化。LM358则是作为传感器的信号处理部分,可以将光敏三极管所传输回的信号进行放大处理。光强传感器既可以作为数字量传感器使用,也可以作为模拟量传感器使用。
2. 元器件简介
光敏三极管:
光敏三极管和普通三极管相似,也有电流放大作用,只是它的集电极电流不只是受基极电路和电流控制,同时也受光辐射的控制。 通常基极不引出,但一些光敏三极管的基极有引出,用于温度补偿和附加控制等作用。 光敏三极管又称光电三极管,它是一种光电转换器件,其基本原理是光照到P-N结上时,吸收光能并转变为电能。当光敏三极管加上反向电压时,管子中的反向电流随着光照强度的改变而改变,光照强度越大,反向电流越大,大多数都工作在这种状态。
LM358:
LM358是双运算放大器。内部包括有两个独立的、高增益、内部频率补偿的运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。
3. 工作原理
通过光敏三极管在采集外界环境的光照强度,然后将采集光信号转换为电信号,进而通过LM385芯片对所信号进行放大处理,当光照强度达到所设定的阈值时,光照传感器输出端将输出一个低电平,代表传感器已经被触发。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
void setup() { Serial.begin(9600); } void loop() { Serial.print(analogRead(A0)); Serial.println(); } |
void stop(); void spin(); void setup() { pinMode( 14, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(14) )) { spin(); } else { stop(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void forward(void); void back(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM4_PWM_Init(20000-1,84-1); TIM3_PWM_Init(20000-1,84-1); //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. LED0=0; while(1) { if(flag){ if(num%2 == 0) forward(); else back(); num++; flag = FLASE; } } } void forward(void) { TIM_SetCompare1(TIM4,0); TIM_SetCompare4(TIM3,2000); } void back(void) { TIM_SetCompare1(TIM4,2000); TIM_SetCompare4(TIM3,0); } |
4. Arduino上的用法
(1)获取数据
环境:Basra主控板,Bigfish扩展板,光强传感器,Arduino IDE等。
光强传感器既可以输出数字量信号,又可以输出模拟量信号,将传感器接在Bigfish的A0接口上,烧录相应程序并读取结果。
①检测数字量的程序
在Serial Monitor中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
②检测模拟量的程序
观察串口监视器模拟量输出。
(2)用法示例
效果:当光强传感器检测到使其触发的光照时,直流电机转动,否则直流电机静止。
环境:Basra主控板,Bigfish扩展板,光强传感器,直流电机,Arduino IDE等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5,6直流接口上。
代码:
5. STM32上的用法
(1)获取数据
环境:MCU-F4主控板,SH-F4TT扩展板,光强传感器,Keil5 编程软件等等。
光强传感器既能输出数字量信号,也能输出模拟量信号,利用串口助手,我们可以读取这些信号。
①读取传感器的数字量信号
可将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手中可以读取到数据。传感器触发输出0,否则输出1。低电平时传感器触发。
(2)用法示例
效果:触发光强传感器时,直流电机正转,否则直流电机反转。
器材:Ares主控板,SH-F4ST扩展板,光强传感器,直流电机等。
电路:将传感器接在扩展板的PA0接口上,直流电机接在A口上。
C代码:
6. 应用前景
· 防盗报警装置
· 在路灯、航标中做自动电路控制
· 应用于智能家电中
· 应用于机器人设计中
7. 资料清单
序号 | 内容 |
1 | 光强传感器电路原理图等 |
2 | Arduino例程-光强控制电机转动 |
3 | STM32例程-传感器数字量测值 |
4 | STM32例程-传感器模拟量测值 |
5 | STM32例程-光强控制编码电机转动 |
②读取传感器的模拟量信号
将传感器接入PA1,通过串口助手查看传感器数值,传感器触发状态下数值接近0,非触发状态下接近1024
【整体打包】-【U009】如何使用探索者传感器-光强-资料附件.zip | 26.45MB | 下载3次 | 下载 |
1. 简介
灰度传感器,有一只发光二极管和一只光敏电阻,安装在同一面上。灰度传感器利用不同颜色的检测面,对光的反射程度不同,光敏电阻利用不同检测面返回的光不同、其阻值也不同的原理来进行颜色深浅检测。在有效的检测距离内,发光二极管发出白光,照射在检测面上,检测面反射部分光线,光敏电阻检测此光线的强度并将其转换为机器人可以识别的信号。灰度既可以当作数字量传感器使用,也可以当作模拟量传感器使用。
2. 工作原理
灰度检测的有效距离在0.7cm~3cm之间,当传感器检测到有深色标记时,将会触发传感器,使其输出口有低电平输出;当传感器检测到浅色标记时,传感器将不会被触发,所以其输出口是高电平输出。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
void setup() { Serial.begin(9600); } void loop() { Serial.print(analogRead(A0)); Serial.println(); } |
void stop(); void spin(); void setup() { pinMode( 14, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(14) )) { spin(); } else { stop(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void forward(void); void back(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM4_PWM_Init(20000-1,84-1); TIM3_PWM_Init(20000-1,84-1); //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. LED0=0; while(1) { if(flag){ if(num%2 == 0) forward(); else back(); num++; flag = FLASE; } } } void forward(void) { TIM_SetCompare1(TIM4,0); TIM_SetCompare4(TIM3,2000); } void back(void) { TIM_SetCompare1(TIM4,2000); TIM_SetCompare4(TIM3,0); } |
3. Arduino上的用法
(1)获取数据
环境:Basra主控板,Bigfish扩展板,灰度传感器,Arduino IDE等等。
灰度传感器既可以输出数字量信号,又可以输出模拟量信号,将传感器接在Bigfish的A0接口上,烧录如下程序。
①检测数字量的程序
在Serial Monitor中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
②检测模拟量的程序
观察串口监视器模拟量输出。
(2)用法示例
效果:当灰度传感器检测到深色标记时,直流电机转动,否则直流电机静止。
环境:Basra主控板,Bigfish扩展板,灰度传感器,直流电机,Arduino IDE等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5,6直流接口上。
C代码:
4. STM32上的用法
(1)获取数据
环境:MCU-F4主控板,SH-F4TT扩展板,灰度传感器,Keil5 编程软件等等。
灰度传感器可以将检测到的信号转化为数字量,也可以转化为模拟量。
①读取数字量信号
可将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手中可以读取到数据。传感器触发输出0,否则输出1。低电平时传感器触发。
②读取模拟量信号
将传感器接入PA1,通过串口助手查看传感器数值,传感器触发状态下数值接近0,非触发状态下接近1024
(2)用法示例
效果:触发灰度传感器时,直流电机正转,否则直流电机反转。
器材:MCU-F4主控板,SH-F4TT扩展板,灰度传感器,直流电机等。
电路:将传感器接在扩展板的PA0接口上,直流电机接在PC6,PC7;PC8,PC9口上。
C代码:
5. 注意事项
(1)该传感器在具有强烈光反射的情况下使用时将会影响其测控精度,所以在正常情况下使用该传感器才能准确的使用其功能。
(2)灰度传感器采集数据时,既可以数字量采集,也可以模拟量采集。
6. 应用前景
· 机器人循迹
· 机器人识别悬崖
· 灰度颜色
7. 资料清单
序号 | 内容 |
1 | 灰度传感器电路原理图等 |
2 | Arduino例程-灰度控制电机转动 |
3 | STM32例程-灰度传感器数字量测值 |
4 | STM32例程-灰度传感器模拟量测值 |
5 | STM32例程-灰度控制编码电机转动 |
【整体打包】-【U009】如何使用探索者传感器-灰度-资料附件.zip | 26.45MB | 下载79次 | 下载 |
1. 简介
白标传感器可以帮助进行白线的跟踪,可以识别黑色背景中的白色区域。寻线信号可以提供稳定的输出信号,使寻线更准确更稳定。白标既可以当作开关量传感器使用,也可以当作模拟量传感器使用。白标检测的有效距离在0.7cm~3cm之间,工作电压:4.7~5.5V,工作电流:1.2mA。
2. 工作原理
当白标传感器检测到白色标记时,将会被触发,传感器会在其输出端输出数字量0,即低电平信号,未触发时输出数字量1,即高电平信号。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
void setup() { Serial.begin(9600); } void loop() { Serial.print(analogRead(A0)); Serial.println(); } |
void stop(); void spin(); void setup() { pinMode( 14, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(14) )) { spin(); } else { stop(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void forward(void); void back(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM4_PWM_Init(20000-1,84-1); TIM3_PWM_Init(20000-1,84-1); //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. LED0=0; while(1) { if(flag){ if(num%2 == 0) forward(); else back(); num++; flag = FLASE; } } } void forward(void) { TIM_SetCompare1(TIM4,0); TIM_SetCompare4(TIM3,2000); } void back(void) { TIM_SetCompare1(TIM4,2000); TIM_SetCompare4(TIM3,0); } |
3. Arduino上的用法
(1)获取数据
环境:Basra主控板,Bigfish扩展板,白标传感器,Arduino IDE等等。
白标传感器既可以输出数字量信号,又可以输出模拟量信号,将传感器接在Bigfish的A0接口上,烧录如下程序。
①读取数字量
在Serial Monitor中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
②读取模拟量
观察串口监视器模拟量输出
(4)用法示例
效果:当白标传感器检测黑色背景中的白色区域时,直流电机转动,否则直流电机静止。
环境:Basra主控板,Bigfish扩展板,白标传感器,直流电机,Arduino IDE等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5,6直流接口上。
C代码:
4. STM32上的用法
(1)获取数据
器材:MCU-F4主控板,SH-F4TT扩展板,白标传感器等。
白标传感器可以将检测到的信号转化为数字量,也可以转化为模拟量。
①读取数字量信号
可将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手中可以读取到数据。传感器触发输出0,否则输出1。低电平时传感器触发。
②读取模拟量信号
将传感器接入PA1,通过串口助手查看传感器数值,传感器触发状态下数值接近0,非触发状态下接近1024
(2)用法示例
效果:触发白标传感器时,直流电机正转,否则直流电机反转。
器材:MCU-F4主控板,SH-F4TT扩展板,白标传感器,直流电机等。
电路:将传感器接在扩展板的PA0接口上,直流电机接在PC6,PC7;PC8,PC9口上。
本实验例程源代码如下:
5. 注意事项
(1)白标传感器在具有强烈光反射的情况下使用时将会影响其测控精度,所以,在正常情况下使用该传感器才能准确的使用其功能。
(2)白标传感器的安装应当贴近地面且与地面平行,这样才能更加灵敏并且有效的检测到信号。
(3)白标传感器采集数据时,既可以数字量采集,也可以模拟量采集。
6. 应用前景
· 机器人循迹
· 机器人避障
· 特定颜色识别
· 公共安防
7.资料清单
序号 | 内容 |
1 | Basra相关原理图引脚图电路文件等 |
2 | Arduino例程-白标控制电机转动 |
3 | STM32例程-白标传感器数字量测值 |
4 | STM32例程-白标传感器模拟量测值 |
5 | STM32例程-白标控制编码电机转动 |
【整体打包】-【U009】如何使用探索者传感器-白标-资料附件.zip | 26.45MB | 下载2次 | 下载 |
1. 简介
声控传感器既是一个数字量传感器,也是一个模拟量传感器。声控传感器也分为触发和未触发两种工作状态,即当声控传感器检测到有声音发出,并且达到所设定的阈值时,会向主机输入一个触发状态的低电平,反之则会向主机持续输入一个高电平。
2. 工作原理
声控传感器利用声音的相对比较,返回是否有声音的相对信号给机器人主机。使用调节器调节给定声控传感器的初始值,声控传感器不断地把外界声音的强度与给定强度作比较,超过给定的强度时,向主机发送“有声音”信号 ,即传感器输出低电平信号0,否则发送“没有声音”的信号,传感器输出高电平信号1。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 数据接口 |
4 | 空脚,请悬空 |
void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { Serial.print(!( digitalRead(A0) )); Serial.println(); } |
void setup() { Serial.begin(9600); } void loop() { Serial.print(analogRead(A0)); Serial.println(); } |
void stop(); void spin(); void setup() { pinMode( 14, INPUT); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); } void loop() { if (!( digitalRead(14) )) { spin(); } else { stop(); } } void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); } void spin() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); } |
#include "sys.h" //调用库文件sys.h #include "led.h" //调用库文件led.h #include "digital_sensor.h" //调用库文件digital_sensor.h int main(void) { u8 flag; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168);//初始化延时,168为CPU运行频率 uart_init(9600);//初始化串口1 LED_Init();//初始化LED灯 Sensor_Init();//传感器初始化 while(1) { delay_ms(1000); flag = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);//获取传感器状 printf("flag:%d\n", flag); } } |
#include "sys.h" #include "led.h" #include "key.h" #include "pwm.h" int num = 0; void forward(void); void back(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); LED_Init();//初始化LED灯 KEY_Init();//初始化按键 TIM4_PWM_Init(20000-1,84-1); TIM3_PWM_Init(20000-1,84-1); //84M/84=1000000hz的计数频率,重装载值20000,所以频率为 1000000/20000=50hz. LED0=0; while(1) { if(flag){ if(num%2 == 0) forward(); else back(); num++; flag = FLASE; } } } void forward(void) { TIM_SetCompare1(TIM4,0); TIM_SetCompare4(TIM3,2000); } void back(void) { TIM_SetCompare1(TIM4,2000); TIM_SetCompare4(TIM3,0); } |
3. Arduino上的用法
(1)获取数据
环境:Basra主控板,Bigfish扩展板,声控传感器,Arduino IDE等等。
声控传感器既可以输出数字量信号,又可以输出模拟量信号,将传感器接在Bigfish的A0接口上,烧录如下程序。
①读取数字量
在Serial Monitor中可以读取到数据。此处程序添加“非”,传感器触发输出1,否则输出0。
②读取模拟量
观察串口监视器的模拟量输出。
(2)用法示例
效果:当声控传感器检测到声音时,直流电机转动,否则直流电机静止。
环境:Basra主控板,Bigfish扩展板,声控传感器,直流电机,Arduino IDE图形界面等。
电路:将传感器开关信号输出引脚接在Bigfish的A0接口上,直流电机接在5,6直流接口上。
例程源代码如下:
4. STM32上的用法
(1)获取数据
器材:MCU-F4主控板,SH-F4TT扩展板,声控传感器等。
白标传感器可以将检测到的信号转化为数字量,也可以转化为模拟量。
①读取数字量信号
可将传感器接在扩展板的PA0接口上,编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
在串口助手中可以读取到数据。传感器触发输出0,否则输出1。低电平时传感器触发。
②读取模拟量信号
将传感器接入PA1,通过串口助手查看传感器数值,传感器触发状态下数值接近0,非触发状态下接近1024
(2)用法示例
效果:触发声控传感器时,直流电机正转,否则直流电机反转。
器材:MCU-F4主控板,SH-F4TT扩展板,声控传感器,直流电机等。
电路:将传感器接在扩展板的PA0接口上,直流电机接在PC6,PC7;PC8,PC9口上。
例程源代码如下:
5. 注意事项
(1)环境内的声音值是个变量,要取得比较精确的环境声音值,可以在一段时间内连续取几次值,再求它们的平均数,这种办法适用于所有的模 拟传感器。
(2)检测指定环境声音时,注意不要受其它声源干扰。
(3)声控传感器采集数据时,既可以数字量采集,也可以模拟量采集。
6. 应用前景
· 电路声音控制
7. 资料清单
序号 | 内容 |
1 | 声控传感器电路原理图等 |
2 | Arduino例程-声控控制电机转动 |
3 | STM32例程-声控传感器数字量测值 |
4 | STM32例程-声控传感器模拟量测值 |
5 | STM32例程-声控控制编码电机转动 |
【整体打包】-【U009】如何使用探索者传感器-声控-资料附件.zip | 26.46MB | 下载0次 | 下载 |
1. 简介
加速度传感器是一种可以对物体运动过程中的加速度进行测量的电子设备,典型互动应用中的加速度传感器可以用来对物体的姿态或者运动方向进行检测,比如WII游戏机和iPhone手机中的经典应用。
探索者加速度传感器采用Freescale(飞思卡尔)公司生产的高性价比微型电容式三轴加速度传感器MMA7361芯片,该芯片一般应用于摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。
MMA7361采用信号调理、单极低通滤波器和温度补偿技术,提供±1.5g/6g两个量程,用户可在这2个灵敏度中选择。该器件带有低通滤波并已做0g补偿,提供休眠模式,因而是电池供电的无线数据采集的理想之选。
探索者加速度传感器只引出了MMA7361芯片的X轴和Y轴。是一个两轴加速度传感器。
2. 特点
· 睡眠模式:3微安
· 开启时间快(0.5毫秒启用响应时间)
· 低通滤波器具有内部信号调理功能
· 设计稳定,防震能力强
· 自由落体检测诊断的自我测试
· 0克的检测自由落体保护
· 低通滤波器与信号调理
3. 参数
· 供电电压:3.3~5V
· 数据接口:模拟电压输出
· 低功耗,工作时电流为400μA,休眠模式下为3μA
· 高灵敏度,在1.5g量程下为800mV/g
· 模块尺寸:25x27mm
4. 工作原理
通过MMA7361芯片采集Y方向和X方向的加速度值,进而得出物体的倾斜状况,并将采集数据通过相应方向的接口输出。
原理图:
实物与PCB引脚对照图:
引脚从左到右接线说明表:
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | 5V | 供电5V DC |
3 | Y | Y轴数据输出接口 |
4 | X | X轴数据输出接口 |
void setup() { Serial.begin(9600); } void loop() { Serial.print(analogRead(14)); Serial.println(); Serial.print(analogRead(15)); Serial.println(); Serial.print("-------------------------------"); Serial.println(); } |
void setup() { Serial.begin(9600); pinMode( 9 , OUTPUT); pinMode( 10 , OUTPUT); } void loop() { Serial.print(analogRead(15)); Serial.println(); if (( ( analogRead(15) ) < ( 400 ) )) { digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); } else { digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); } } |
5. 获取数据
环境:Basra主控板,Bigfish扩展板,加速度传感器,Arduino IDE等等。
将加速度传感器连接到A0口上,烧录如下程序:
通过串口监视器可以观察到X,Y轴方向的数据变化。
6. 用法示例
效果:当加速度传感器在X方向倾斜一定角度时,直流电机转动,否则直流电机静止。
环境:Basra主控板,Bigfish扩展板,加速度传感器,直流电机,Arduino IDE等。
电路:将传感器接在Bigfish的A0接口上,直流电机接在5,6直流接口上。
C代码:
7. 注意事项
MMA7361加速度传感器模块仅引出了X、Y轴数据,如需进行精确的姿态控制,请使用6DOF IMU模块。
8. 应用前景
汽车安全、游戏控制、图像自动翻转、电子指南针倾斜校正、GPS导航系统死角的补偿、计步器功能、防手抖功能、硬盘保护、设备或终端姿态检测、智能产品。
9. 参考资料
10. 资料清单
序号 | 内容 |
1 | 加速度传感器电路原理图等 |
2 | 加速度示波器项目(例程+函数库+上位机) |
【整体打包】-【U009】如何使用探索者传感器-加速度-资料附件.zip | 1.85MB | 下载27次 | 下载 |
1. 简介
“探索者”超声测距模块使用HC-SR04 超声波测距模块,可提供2cm-400cm 的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。
2. 实物图片与接口
3. 参数
工作电压 | DC 5 V |
工作流电 | 15mA |
工作频率 | 40kHz |
最远射程 | 4m |
最近射程 | 2cm |
测量角度 | 15 度 |
输入触发信号 | 10uS 的TTL 脉冲 |
输出回响信号 | 输出TTL 电平信号,与射程成比例 |
4. 超声波时序图
以上时序图表明你只需要提供一个10uS 以上脉冲触发信号,该模块内部将发出8 个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms 以上,以防止发射信号对回响信号的影响。
5. 工作原理
(1)采用IO口TRIG 触发测距,给最少10us 的高电平信呈。
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回。
(3)有信号返回,通过IO 口ECHO 输出一个高电平,高电平持续的时间就是波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。
6. Arduino上的用法
环境:Basra主控板,Bigfish扩展板,超声测距传感器,Arduino IDE等等。
将传感器接在Bigfish的A0接口上,烧录如下程序。
#define ECHOPIN 14 #define TRIGPIN 15 void setup() { Serial.begin(9600); pinMode(ECHOPIN, INPUT); pinMode(TRIGPIN, OUTPUT); } void loop() { digitalWrite(TRIGPIN, LOW); delayMicroseconds(2); digitalWrite(TRIGPIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGPIN, LOW); float distance = pulseIn(ECHOPIN, HIGH); distance= distance/58; Serial.println(distance); delay(500); } |
#include "sys.h" #include "led.h" #include "timer.h" #include "exti.h" int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 uart_init(115200); //串口初始化 LED_Init();//初始化LED灯 EXTI5_Init();//外部中断初始化 TIM2_Init(20000-1, 8400-1); //142M/8400=20000hz的计数频率,重装载值20000,所以PWM频率为 20000/20000=1hz. while(1) { Wave_SRD_Strat4(); delay_ms(60); printf("distance:%.2fCM\n", Distance); delay_ms(100); } } |
运行Serial Monitor查看超声模块测量得出的距离值,如下图所示:
7. STM32上的用法
器材:MCU-F4主控板,SH-F4TT扩展板,超声测距传感器等。
将超声波传感器的输出引脚(trig)接在PA4引脚上,输入引脚(echo)接在PA5引脚上。编写如下程序(请勿直接复制粘贴下列代码,如需使用代码请下载源文件,并用Keil打开。):
运行串口助手查看超声模块测量得出的距离值,如下图所示:
8. 应用前景
· 机器人避障
· 物体测距
· 液位检测
· 公共安防
· 停车场检测
9. 注意事项
· 此模块不宜带电连接,若要带电连接,则先让模块的GND 端先连接,否则会影响模块的正常工作。
· 测距时,被测物体的面积不少于0.5 平方米且平面要求平整,否则影响测量的结果
10. 原理图
11. 资料清单
序号 | 内容 |
1 | 超声测距传感器电路原理图等 |
2 | Arduino例程-超声测距 |
3 | STM32例程-超声测距 |
4 | 超声雷达项目(Arduino例程+上位机) |
【整体打包】-【U009】如何使用探索者传感器-超声测距-资料附件.zip | 9.1MB | 下载50次 | 下载 |
1. 简介
探索者温湿度传感器,采用DHT11数字温湿度检测模块,是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11模块都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。
2. 特点
· 相对湿度和温度测量
· 全部校准,数字输出
· 卓越的长期稳定性
· 超低能耗
3. 参数
· 供电电压: 3.3~5.5V DC
· 输 出: 单总线数字信号
· 测量范围: 湿度20-90%RH, 温度0~50℃
· 测量精度: 湿度+-5%RH, 温度+-2℃
· 分 辨 率: 湿度1%RH, 温度1℃
· 互 换 性: 可完全互换
· 长期稳定性: <±1%RH/年
4. 电路
参数 | 条件 | min | typ | max | 单位 |
供电 | DC | 3 | 5 | 5.5 | V |
供电电流 | 测量 | 0.5 | 2.5 | mA | |
平均 | 0.2 | 1 | mA | ||
待机 | 100 | 150 | uA | ||
采样周期 | 秒 | 1 | 次 |
pin | 名称 | 注释 |
1 | GND | 接地,电源负极 |
2 | VCC | 供电5V DC |
3 | DATA | 串行数据,单总线 |
4 | 空脚,请悬空 |
// // FILE: dht11_test1.pde // PURPOSE: DHT11 library test sketch for Arduino // //Celsius to Fahrenheit conversion double Fahrenheit(double celsius) { return 1.8 * celsius + 32; } // fast integer version with rounding //int Celcius2Fahrenheit(int celcius) //{ // return (celsius * 18 + 5)/10 + 32; //} //Celsius to Kelvin conversion double Kelvin(double celsius) { return celsius + 273.15; } // dewPoint function NOAA // reference: http://wahiduddin.net/calc/density_algorithms.htm double dewPoint(double celsius, double humidity) { double RATIO = 373.15 / (273.15 + celsius); // RATIO was originally named A0, possibly confusing in Arduino context double SUM = -7.90298 * (RATIO - 1); SUM += 5.02808 * log10(RATIO); SUM += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ; SUM += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ; SUM += log10(1013.246); double VP = pow(10, SUM - 3) * humidity; double T = log(VP/0.61078); // temp var return (241.88 * T) / (17.558 - T); } // delta max = 0.6544 wrt dewPoint() // 5x faster than dewPoint() // reference: http://en.wikipedia.org/wiki/Dew_point double dewPointFast(double celsius, double humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(humidity/100); double Td = (b * temp) / (a - temp); return Td; } #include <DHT11.h> dht11 DHT11; #define DHT11PIN A0 void setup() { Serial.begin(9600); Serial.println("DHT11 TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT11LIB_VERSION); Serial.println(); } void loop() { Serial.println("\n"); int chk = DHT11.read(DHT11PIN); Serial.print("Read sensor: "); switch (chk) { case DHTLIB_OK: Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; } Serial.print("Humidity (%): "); Serial.println((float)DHT11.humidity, 2); Serial.print("Temperature (oC): "); Serial.println((float)DHT11.temperature, 2); Serial.print("Temperature (oF): "); Serial.println(Fahrenheit(DHT11.temperature), 2); Serial.print("Temperature (K): "); Serial.println(Kelvin(DHT11.temperature), 2); Serial.print("Dew Point (oC): "); Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); Serial.print("Dew PointFast (oC): "); Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); delay(2000); } // // END OF FILE // |
double Fahrenheit(double celsius) { return 1.8 * celsius + 32; } double Kelvin(double celsius) { return celsius + 273.15; } double dewPoint(double celsius, double humidity) { double RATIO = 373.15 / (273.15 + celsius); // RATIO was originally named A0, possibly confusing in Arduino context double SUM = -7.90298 * (RATIO - 1); SUM += 5.02808 * log10(RATIO); SUM += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ; SUM += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ; SUM += log10(1013.246); double VP = pow(10, SUM - 3) * humidity; double T = log(VP/0.61078); // temp var return (241.88 * T) / (17.558 - T); } double dewPointFast(double celsius, double humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(humidity/100); double Td = (b * temp) / (a - temp); return Td; } #include <DHT11.h> dht11 DHT11; #define DHT11PIN 14 #include <Arduino.h> #include <Wire.h> #include <MultiLCD.h> LCD_SSD1306 lcd; void setup() { lcd.begin(); } void loop() { lcd.clear(); int chk = DHT11.read(DHT11PIN); lcd.setCursor(0, 0); Serial.print("Read sensor: "); switch (chk) { case DHTLIB_OK: lcd.print("OK"); break; case DHTLIB_ERROR_CHECKSUM: lcd.print("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: lcd.print("Time out error"); break; default: lcd.print("Unknown error"); break; } lcd.setCursor(0, 1); lcd.print("Humidity: "); lcd.print(DHT11.humidity); lcd.print("%"); lcd.setCursor(0, 2); lcd.print("Temperature: "); lcd.print(DHT11.temperature); lcd.print(" C"); delay(2000); } |
打开Serial Monitor观察显示的内容,如下图所示:
5. 串口获取温湿度值
器材:温湿度传感器、basra控制板,BigFish扩展板。
环境:Basra主控板,Bigfish扩展板,超声测距传感器,Arduino IDE等等。
如果尚未安装DHT11扩展库,请将“通识-【U009】如何使用探索者传感器-温湿度-资料附件\DHT11\libraries”中的DHT11文件夹拷贝到Arduino的libraries文件夹中。
将温湿度传感器接在Bigfish的A0接口上,启动Arduino IDE, 可以发现,在“文件→示例”中增加了一组DHT11的例程,其中一个例程就是DHT11,上传该例程至Basra控制板中。
6. OLED屏幕显示温湿度值
将温湿度传感器安装在Bigfish的A0/A1接口上,将OLED模块安装在A4/A5接口上。本项目需要用到OLED模块,请将OLED模块的函数库拷贝到Arduino的libraries文件夹中。
打开“文件-示例-DHT11”选择DHT11_OLED,将例程uploading到控制板中。
显示效果如下:
7. 应用前景
· 暖通空调 测试及检测设备
· 汽车 数据记录器
· 消费品 自动控制
· 气象站 家电
· 湿度调节器 医疗
· 除湿器
8. 注意事项
· 避免结露情况下使用。
· 长期保存条件:温度10-40℃,湿度60%以下
· DHT11采用单总线方式与cpu进行数据传输,对时序的要求比较高,写程序的时候数据的采集必须间隔1s以上,不然采集会失败。
9. 参考资料
【DHT11教程】http://www.arduino.cn/forum.php?mod=viewthread&tid=1429&fromuid=971
10. 资料清单
序号 | 内容 |
1 | 温湿度传感器电路原理图等 |
2 | DHT11函数库 |
3 | OLED函数库 |
【整体打包】-【U009】如何使用探索者传感器-温湿度-资料附件.zip | 16.48MB | 下载13次 | 下载 |
1. 简介
“探索者”摇杆模块采用原装优质金属PS2摇杆电位器制作,具有(X,Y)2轴模拟输出,1路按钮数字输出。配合控制板可以制作遥控器等互动作品。
2. 参数
· 电源要求:+3.3-5V
· 2轴模拟输出(X,Y)
· 1个数字按键输出(Button)
轴材质 | 树脂 | ||
操纵杆复位机构 | 有 | ||
可变电阻器部 | 最高使用电压 | 50V AC, 5V DC | |
阻抗变化性能 | B (0B) | ||
总电阻值 | 10kΩ | ||
中央按动部 | 中心按动 | 有 | |
最大额定 | 50mA 12V DC | ||
行程 | 0.5(+0.5, -0.4)mm | ||
使用温度范围 | -10℃ to +70℃ | ||
电性能 | 方向分辨率 | 连续 | |
绝缘电阻 | 100MΩ min. 250V DC | ||
耐电压 | 250V AC for 1 minute | ||
额定功率 | 0.0125W | ||
机械性能 | 方向动作力 | 17±10mN·m | |
按动作力 | 6.4(+3.4, -2.6)N | ||
耐环境性能 | 耐寒性能 | -30±2℃ for 96h | |
耐热性能 | 80±2℃ for 96h | ||
耐湿性能 | 60±2℃, 90 to 95%RH for 96h | ||
焊接耐热性能 | 手工焊接 | 300℃ max. 3s max. | |
浸焊 | 260±5℃, 5±1s | ||
滑动噪音 | 300mV max. by JIS method | ||
操纵杆的活动性 | 5° max. | ||
操纵强度 | 98N min. (Push), 50N min. (Pull) | ||
耐久性能 | 操作寿命 | 方向 | 2,000,000 cycles |
中心按动 | 1,000,000 cycles |
3. 实物图片与接口
· Button --- 按键输出
· ←→ --- X轴模拟输出
· ↑↓ --- Y轴模拟输出
· DC5V
· GND地
4. 获取数据
环境:Basra主控板,Bigfish扩展板,摇杆模块,Arduino IDE等等。
将摇杆模块按下图所示的方法连接到bigfish的A0/A1以及A2传感器接口上。摇杆的数据由A0和A1接口来获取,按键的数据由A2接口来获取。
烧录如下程序:
void setup() { Serial.begin(9600); } void loop() { Serial.print(analogRead(A0)); Serial.println(); Serial.print(analogRead(A1)); Serial.println(); Serial.print(digitalRead(A2)); Serial.println(); Serial.print("-------------------------------"); Serial.println(); delay( 1000 ); } |
void setup() { pinMode( 10, OUTPUT); pinMode( 9, OUTPUT); pinMode( 10 , OUTPUT); pinMode( 9 , OUTPUT); } void loop() { if (( ( analogRead(A0) ) > ( 600 ) )) { analogWrite(9 , map ( analogRead(A0) , 600 , 1023 , 0 , 255 ) ); digitalWrite( 10 , LOW ); } if (( ( analogRead(A0) ) < ( 400 ) )) { analogWrite(10 , map ( analogRead(A0) , 400 , 0 , 0 , 255 ) ); digitalWrite( 9 , LOW ); } } |
#include <Servo.h> Servo servo_pin_4; void setup() { servo_pin_4.attach(4); } void loop() { servo_pin_4.write( map ( analogRead(A0) , 0 , 1023 , 0 , 180 ) ); } |
#include "LedControl.h" #include <stdio.h> #include <stdlib.h> typedef struct node { int x; int y; struct node *next; } snake; typedef struct food { int x; int y; } Food; snake *head = NULL; Food *food; int flag = 3; int x_tmp1 = 0, y_tmp1 = 0, x_tmp2 = 0, y_tmp2 = 0; LedControl lc=LedControl(12,11,13,1); //config 8*8 led const int X_input = A0; //set PAD port const int Y_input = A1; void setup() { Serial.begin(9600); lc.shutdown(0,false); //start the 8*8 led lc.setIntensity(0,1); //0~15 lc.clearDisplay(0); snake *Snake = snake_create(0, 0); head = Snake; snake_dispaly(); food_init(5, 5); food_display(); } void loop() { flag = rocker_deal(); if(eat_test()){ snake_eat(); snake_copy(); snake_head(); snake_error(); food_display(); snake_dispaly(); delay(500); } else { lc.clearDisplay(0); snake_eat(); snake_copy(); snake_head(); snake_error(); food_display(); snake_dispaly(); delay(500); } } int eat_test() { snake_head(); if(snake_eat()) { snake_back(); return 1; } snake_back(); return 0; } void snake_error() { for(snake *p = head->next; p; p = p->next) { if((head->x == p->x) && (head->y == p->y)) { lcd_clear(); snake_destroy(); break; } } } void lcd_clear() { for(int i=0; i<8; i++){ for(int j=0; j<8; j++){ lc.setLed(0, i, j, true); } } delay(500); for(int i=0; i<8; i++){ for(int j=0; j<8; j++){ lc.setLed(0, i, j, false); } } delay(500); } void snake_destroy() { snake *p, *q; for(p = head; p; p = q) { q = p->next; free(p); } head = NULL; snake *Snake = snake_create(0, 0); head = Snake; food_init(5, 5); } int snake_eat() { if((head->x == food->x) && (head->y == food->y)) { snake *p = snake_create(x_tmp2, y_tmp2); snake_insert(p); food_set(); return 1; } else return 0; } snake *snake_create(int x, int y) { snake *p = (snake *)malloc(sizeof(snake)); p->x = x; p->y = y; p->next = NULL; return p; } void snake_insert(snake *p) { snake *q; for(q = head; q->next; q = q->next) {} q->next = p; } void snake_back() { switch(flag) { case 2: head->x --; if(head->x < 0){ head->x = 7; }break;//上 case 1: head->x ++; if(head->x > 7){ head->x = 0; } break;//下 case 4: head->y --; if(head->y < 0){ head->y = 7; } break;//左 case 3: head->y ++; if(head->y > 7){ head->y = 0; } break;//右 default: break; } } void snake_head() { switch(flag) { case 1: head->x --; if(head->x < 0){ head->x = 7; }break;//上 case 2: head->x ++; if(head->x > 7){ head->x = 0; } break;//下 case 3: head->y --; if(head->y < 0){ head->y = 7; } break;//左 case 4: head->y ++; if(head->y > 7){ head->y = 0; } break;//右 default: break; } } void snake_copy() { x_tmp1 = head->x; y_tmp1 = head->y; snake *q = head->next; for(snake *p = head; q; p = q, q = q->next) { x_tmp2 = q->x; y_tmp2 = q->y; q->x = x_tmp1; q->y = y_tmp1; x_tmp1 = x_tmp2; y_tmp1 = y_tmp2; } } void snake_dispaly() { for(snake *p = head; p; p = p->next) { lc.setLed(0, p->x, p->y, true); } } void food_init(int x, int y) { food = (Food *)malloc(sizeof(Food)); food->x = x; food->y = y; } void food_set() { int x_flag = 1, y_flag = 1; while(x_flag || y_flag) { food->x = (int)random(0, 7); food->y = (int)random(0, 7); for(snake *q = head; q; q = q->next) { if ((food->x == q->x) || (food->y == q->y)) { x_flag = 1; y_flag = 1; } else { x_flag = 0; y_flag = 0; } } } } void food_display() { lc.setLed(0, food->x, food->y, true); } int rocker_deal() { int x_value, y_value; x_value = analogRead(A0); y_value = analogRead(A1); if(x_value > 700){ if(flag == 2){ return 2; } return 1; } else if(x_value < 500){ if(flag == 1){ return 1; } return 2; } else if(y_value < 400){ if(flag == 4){ return 4; } return 3; } else if(y_value > 600){ if(flag == 3){ return 3; } return 4; } else return flag; } |
打开“串口监视器”,摇动摇杆,观察数据的变化,寻找对应规律。
5. 摇杆控制直流电机
环境:Basra主控板,Bigfish扩展板,摇杆模块,直流电机,Arduino IDE等等。
将摇杆模块连接到bigfish的A0/A1接口上。烧录以下程序:
左右拉动摇杆即可操作直流电机正反转。
6. 摇杆控制舵机
环境:Basra主控板,Bigfish扩展板,摇杆模块,舵机,Arduino IDE等等。
将摇杆模块连接到bigfish的A0/A1接口上。烧录以下程序:
左右拉动摇杆即可操作舵机左右摆动。
7. 贪吃蛇游戏
按下图所示连接电路:
将摇杆模块连接到bigfish的A0/A1接口上。烧录以下程序(snake2.ino):
执行效果:
有兴趣的朋友可以在例程snake2.ino的基础上,继续完善这个贪吃蛇的游戏,增加游戏开始、游戏失败、游戏成功的功能,使其成为一个完整的游戏。
8. 应用前景
· 游戏手柄
· 机器人操作杆
· 工业示教作业平台
9. 资料清单
序号 | 内容 |
1 | 摇杆模块电路原理图等 |
2 | 例程-串口获取摇杆数值 |
3 | 例程-摇杆控制直流电机 |
4 | 例程-摇杆控制舵机 |
5 | 例程-贪食蛇游戏 |
【整体打包】-【U009】如何使用探索者传感器-摇杆模块-资料附件.zip | 56.59KB | 下载0次 | 下载 |
1. 简介
本模块是基于 TCS34725 彩色光数字转换器为芯片设计的颜色识别传感器,传感器提供红色, 绿色,蓝色(RGB )和清晰光感应值的数字输出。集成红外阻挡滤光片,可最大限度地减少入射光的红外光谱成分,并可精确地进行颜色测量。具有高灵敏度、宽动态范围,且配置红外阻隔滤波器。最小化 IR 和 UV 光谱分量效应,以产生准 确的颜色测量。带有环境光强检测和可屏蔽中断。通过 l2C 接口通信。
本模块增加 M12 镜头,有效增加检测距离。并设置有 4 个高亮 LED 灯进行补光,可通过红外检测头自主控制 LED 亮灭。 内置一个定位器,可通过定位器旋钮调节检测距离 (最大为常量, 最小为常闭) 。
2. 特点
· 采用原装进口芯片 TCS34725FN
· 供电电源 5v
· 抗光干扰
· 白色 LED ,可自主控制亮/灭。
· 可检测不发光物体颜色
· 防反插接口设计
· 可调 M12 镜头
3. 参数
· 工作电压:5V
· 通信接口:IIC
· 检测距离:1cm- 10cm
· 输出值:RGB ,红色 R 、绿色 G 、蓝色 B
4. 通信协议
I2C通信:一条数据线,一条时钟线。
I2C 设备地址:0X29
注意:0X29 这个设备地址是 7 位的,8 位设备地址需要向高位移一位变成 0X52。
5. 实物图片与接口
6. 获取数据
环境:IIC 颜色识别模块、Basra控制板、BigFish 扩展板。
将IIC 颜色识别模块连接到bigfish的A4/A5接口上,如下图所示。
引脚对应关系如下:
IIC颜色识别模块引脚 | Ardunio_UNO/Basra引脚 |
VIN | 5V |
GND | GND |
SCL | A5 |
SDA | A4 |
/*********************接线方式 TCS3473x Arduino_Uno SDA A4 SCL A5 VIN 5V GND GND *************************/ #include <Wire.h> //调用IIC库函数 #include "MH_TCS34725.h" //调用颜色识别传感器库函数 #ifdef __AVR__ #include <avr/power.h> #endif //颜色传感器不同通道值设置 MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X); //设置颜色传感器采样周期50毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);//设置颜色传感器采样周期700毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_60X);//设置颜色传感器采样周期50毫秒(不推荐) //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_16X);//设置颜色传感器采样周期50毫秒(不推荐) void setup() { Serial.begin(115200); //开启串口,并设置串口波特率位115200 Serial.println("Color View Test!"); //串口打印:Color View Test! //检测是否有颜色传感器模块 if (tcs.begin()) { //如果检测到颜色传感器模块 Serial.println("Found sensor"); //串口打印 Found sensor } else { //如果没有检测到颜色传感器模块 Serial.println("No TCS34725 found ... check your connections");//串口打印:没有找到颜色识别传感器模块 while (1); // halt! //程序陷入死循环 } } //串口打印Red、Green、Blue三色值 void loop() { uint16_t clear, red, green, blue; //分别定义用于存储红、绿、蓝三色值变量 tcs.getRGBC(&red, &green, &blue, &clear); //将原始R/G/B值转换为色温(以度为单位) tcs.lock(); //禁用中断(可省略)
uint32_t sum = clear; //=========== float r, g, b; // 计算红 r = red; r /= sum; // 绿、蓝 g = green; g /= sum; // 三色数 b = blue; b /= sum; // 值 r *= 256; g *= 256; b *= 256; //=========== Serial.print("\t");//////////////////////////////////////////// Serial.print((int)r); Serial.print("\t"); // 在串口中分别打印 Serial.print((int)g); Serial.print("\t"); // 红、绿、蓝三色 Serial.print((int)b); // 值 Serial.println();////////////////////////////////////////////// } |
/*********************接线方式 TCS3473x Arduino_Uno SDA A4 SCL A5 VIN 5V GND GND *************************/ #include <Wire.h> //调用IIC库函数 #include "MH_TCS34725.h" //调用颜色识别传感器库函数 #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>//调用oled屏幕库函数 #ifdef __AVR__ #include <avr/power.h> #endif #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); //颜色传感器不同通道值设置 MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X); //设置颜色传感器采样周期50毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);//设置颜色传感器采样周期700毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_60X);//设置颜色传感器采样周期50毫秒(不推荐) //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_16X);//设置颜色传感器采样周期50毫秒(不推荐) enum{Forward=1,Back,Left,Right,Stop};//定义小车状态 void setup() { Serial.begin(115200); //开启串口,并设置串口波特率位115200 Serial.println("Color View Test!"); //串口打印:Color View Test! //检测是否有颜色传感器模块 if (tcs.begin()) { //如果检测到颜色传感器模块 Serial.println("Found sensor"); //串口打印 Found sensor } else { //如果没有检测到颜色传感器模块 Serial.println("No TCS34725 found ... check your connections");//串口打印:没有找到颜色识别传感器模块 while (1); // halt! //程序陷入死循环 } Motor_pin_init();//直流电机引脚初始化 delay(500); Oled_Init(); //oled屏幕初始化 delay(500); } //oled屏幕显示颜色传感器读取的物体颜色 void loop() { Get_Color_Data(); } |
#define Motor_Count 4 //定义直流电机数量 int motor_pin[4] = {5,6,9,10}; //定义直流电机引脚 void Motor_pin_init() //初始化直流电机引脚 { for(int i=0;i<Motor_Count;i++) { pinMode(motor_pin[i],OUTPUT); digitalWrite(motor_pin[i],LOW); } } void Motor_Go(int mode, int speeds) //定义小车状态。mode表示小车模式,speeds表示小车速度 { switch(mode) { case Forward: { analogWrite(motor_pin[0],speeds); analogWrite(motor_pin[1],0); analogWrite(motor_pin[2],speeds); analogWrite(motor_pin[3],0); }break; case Back: { analogWrite(motor_pin[0],0); analogWrite(motor_pin[1],speeds); analogWrite(motor_pin[2],0); analogWrite(motor_pin[3],speeds); }break; case Left: { analogWrite(motor_pin[0],speeds); analogWrite(motor_pin[1],0); analogWrite(motor_pin[2],0); analogWrite(motor_pin[3],speeds); }break; case Right: { analogWrite(motor_pin[0],0); analogWrite(motor_pin[1],speeds); analogWrite(motor_pin[2],speeds); analogWrite(motor_pin[3],0); }break; case Stop: { analogWrite(motor_pin[0],speeds); analogWrite(motor_pin[1],speeds); analogWrite(motor_pin[2],speeds); analogWrite(motor_pin[3],speeds); }break; default: break; } } |
void Oled_Init() //oled屏幕初始化 { display.begin(SSD1306_SWITCHCAPVCC, 0x3c); // initialize with the I2C addr 0x3C (for the 128x64) // init done
display.display(); // show splashscreen delay(2000); display.clearDisplay(); // clears the screen and buffer } void Get_Color_Data() { display.clearDisplay(); //清屏 String color_data = ""; uint16_t clear, red, green, blue; //分别定义用于存储红、绿、蓝三色值变量 tcs.getRGBC(&red, &green, &blue, &clear); //将原始R/G/B值转换为色温(以度为单位) tcs.lock(); //禁用中断(可省略)
uint32_t sum = clear; //=========== float r, g, b; // 计算红 r = red; r /= sum; // 绿、蓝 g = green; g /= sum; // 三色数 b = blue; b /= sum; // 值 r *= 256; g *= 256; b *= 256; //=========== // Serial.print("\t");//////////////////////////////////////////// // Serial.print((int)r); Serial.print("\t"); // 在串口中分别打印 // Serial.print((int)g); Serial.print("\t"); // 红、绿、蓝三色 // Serial.print((int)b); // 值 // Serial.println();////////////////////////////////////////////// if( (r > 0) && (g>0) && (b>0) && (r>g) && (r>b) ) //如果检测到红色,小车前进,oled屏幕显示red { color_data = "red"; Motor_Go(Forward, 100); } else if( (r > 0) && (g>0) && (b>0) && (r<g) && (b<g) ) //如果检测到绿色,小车后退,oled屏幕显示green { color_data = "green"; Motor_Go(Back, 100); }
else if( (r > 0) && (g>0) && (b>0) && (r<b) && (g<b) ) //如果检测到蓝色,小车左转,oled屏幕显示blue { color_data = "blue"; Motor_Go(Left, 100); } else{ //否则,小车停止,oled屏幕显示none color_data = "none"; Motor_Go(Stop, 0); } display.setTextSize(3); //修改字体大小 display.setTextColor(WHITE); //修改字体颜色 display.setCursor(20,24); //修改字体位置 display.println(color_data); //显示内容 display.display(); delay(20); } |
/*********************接线方式 TCS3473x Arduino_Uno SDA A4 SCL A5 VIN 5V GND GND *************************/ #include <Wire.h> //调用IIC库函数 #include "MH_TCS34725.h" //调用颜色识别传感器库函数 #ifdef __AVR__ #include <avr/power.h> #endif
//颜色传感器不同通道值设置 MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X); //设置颜色传感器采样周期50毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X);//设置颜色传感器采样周期700毫秒 //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_60X);//设置颜色传感器采样周期50毫秒(不推荐) //MH_TCS34725 tcs = MH_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_16X);//设置颜色传感器采样周期50毫秒(不推荐)
void setup() { Serial.begin(115200); //开启串口,并设置串口波特率位115200 Serial.println("Color View Test!"); //串口打印:Color View Test! //检测是否有颜色传感器模块 if (tcs.begin()) { //如果检测到颜色传感器模块 Serial.println("Found sensor"); //串口打印 Found sensor } else { //如果没有检测到颜色传感器模块 Serial.println("No TCS34725 found ... check your connections");//串口打印:没有找到颜色识别传感器模块 while (1); // halt! //程序陷入死循环 } }
//串口打印Red、Green、Blue三色值 void loop() { uint16_t clear, red, green, blue; //分别定义用于存储红、绿、蓝三色值变量 tcs.getRGBC(&red, &green, &blue, &clear); //将原始R/G/B值转换为色温(以度为单位) tcs.lock(); //禁用中断(可省略)
uint32_t sum = clear; //=========== float r, g, b; // 计算红 r = red; r /= sum; // 绿、蓝 g = green; g /= sum; // 三色数 b = blue; b /= sum; // 值 r *= 256; g *= 256; b *= 256; //=========== Serial.print("\t");//////////////////////////////////////////// Serial.print((int)r); Serial.print("\t"); // 在串口中分别打印 Serial.print((int)g); Serial.print("\t"); // 红、绿、蓝三色 Serial.print((int)b); // 值 Serial.println();////////////////////////////////////////////// |
波特率设为 115200。
将IIC颜色识别模块的Arduino函数库拷贝到Arduino 软件的libraries文件夹中,共包含“Adafruit_GFX”、“Adafruit_NeoPixel”、“MH_TCS34725”、“Adafruit_SSD1306“四个文件夹。启动Arduino IDE,可以发现,在 Example 中增加了一个名为MH_TCS34725 的例程库,包含4个例程文件。
编写下面的代码(Tcs3472x_Clour_RGBLED),并uploading到控制板中。
将颜色传感器贴近红色色卡,运行SerialMonitor 查看颜色传感器得出的颜色值,如下图所示:
重新 uploading 程序,把放置在 IIC 颜色传感器之下红色物体拿走,放上另一个蓝色物体,在 Arduino IDE 串口监视器可以观察到这个蓝色物体 RGB 值为,如下图所示:
打开电脑 Windows 操作系统自带的画图板,点击菜单栏“颜色”--->“编辑颜色”--->“规定自定 义颜色”-->右下角输入 RGB 值,查看对应的颜色与实际测试的颜色是否相符。实际测试结果是测 得的物体颜色与实际颜色有些偏色,但并不影响区分出被测物体是哪种颜色的物体。
7. 识别颜色控制直流电机转动
接下来我们来实现这样一套功能:识别颜色后,电机会运动,并在OLED屏幕中显示颜色名称;若没有识别到颜色,则电机静止,同时OLED屏幕中会显示none。
这套功能需要用到3个程序,程序文件需要放到同一个文件夹下。
主程序(Color_Motor_Oled_Test.ino)代码:
电机控制程序(Motor.ino)代码:
OLED控制程序(OLED.ino)代码:
10. 资料清单
序号 | 内容 |
1 | IIC颜色传感器电路原理图等 |
2 | 函数库-Arduino-IIC颜色识别模块 |
3 | 例程-Arduino-IIC颜色识别模块-串口显示RGB值 |
4 | 例程-Arduino-IIC颜色识别模块-识别颜色并在OLED上显示 |
5 | 例程-STM32-IIC颜色识别模块-串口显示RGB值 |
8. 通过拧镜头旋钮调整识别距离
IIC颜色传感器的检测距离是1cm-10cm,IIC颜色传感器的镜头旋钮可以调整检测距离【推测顺时针拧镜头旋钮检测距离会变短,逆时针拧镜头旋钮检测距离会变长】。
实验环境与配置
Basra主控板、Bigfish2.1扩展板、锂电池供电。
软件:Arduino 1.8.19 系统:Win10
实验过程
① 将IIc颜色识别模块连接到Bigfish的A4/A5接口上,如下图所示。
② 将下列程序下载到控制板中。
③ 将颜色传感器的镜头逆时针拧到底(镜头长0.3cm),距离红色卡片大概是1cm。
运行SerialMonitor 查看颜色传感器得出的颜色值,如下图所示:
和实物的颜色值几乎相同。
④ 将颜色传感器的镜头逆时针拧到底,距离红色卡片大概是7cm。
运行SerialMonitor 查看颜色传感器得出的颜色值,如下图所示:
串口输出值RGU和实物的颜色的RGU值相差较大。
因此可以说明因为距离太大导致IIC颜色传感器检测到实物的颜色有误差。
⑤ 通过顺时针旋镜头将镜头旋转到最大值(镜头伸长约1cm左右)。
运行SerialMonitor 查看颜色传感器得出的颜色值,如下图所示:
串口输出值RGU和实物的颜色的RGU值相差不大。
因此可以说明在IIC颜色传感器离检测物较远时,通过调节调节镜头旋钮可以减小被检测物的颜色误差,提高颜色检测的准确度。
9. 通过拧定位器旋钮调节补光灯的触发距离
IIC颜色传感器有4个高亮LED灯进行补光,可通过红外检测头自主控制LED亮灭。内置一个定位器,可通过定位器旋钮调节检测距离 (最大为常亮, 最小为常闭)【推测定位器旋钮向减号(-)方向旋转补光灯的触发距离变短,定位器旋钮向加号(+)方向旋转补光灯的触发距离变长】。
实验环境与配置
Basra主控板、Bigfish2.1扩展板、锂电池供电。
软件:Arduino 1.8.19 系统:Win10
实验过程
① 将IIc颜色识别模块连接到Bigfish的A4/A5接口上,如下图所示。
② 将定时器旋钮向减号方向(-)旋转直到锁死为长灭,补光灯不补光。
③ 将定时器旋钮向加号方向(+)大约旋转180°(半圈),补光灯的触发距离是6cm以内。
超出6cm补光灯不亮。
④ 将定时器旋钮向加号方向(+)大约旋转270°(大半圈),补光灯的触发距离是大约是在10cm以内。
超出10cm补光灯不亮。
⑤ 将定时器旋钮向加号方向(+)旋转大约超过270°为长亮,不管检测距离有多远,LED灯不灭。
由此可知定位器旋钮向减号(-)方向旋转,补光灯的触发距离变短;定位器旋钮向加号(+)方向旋转,补光灯的触发距离变长。
【整体打包】-【U009】如何使用探索者传感器-IIC颜色识别模块-资料附件.zip | 7.42MB | 下载282次 | 下载 |
1. 简介
本模块为TT马达专用红外编码器。采用槽型对射光电,只要在非透明物体通过槽型即可触发(配合码盘使用)输出5V TTL电平。采用施密特触发器去抖动脉冲,非常稳定,可用于TT马达测转速,测转动行程等等应用。
2. 特点
· 具有信号输出指示。
· 单路信号输出。
· 输出有效信号为低电平。
· 灵敏度不可调。
· 可用于工件计数、电机测速。
3. 参数
· 工作电压:DC 3.3V-5.5V(最佳电压为5V)
· 工作电流:7mA至17mA
· 工作温度:-10℃—+50℃
· 安装孔径:M3螺丝
· 对管宽度:10mm
· 输出信号:TTL电平(可直接连接单片机I/0号,有挡碍物时,指示灯亮输出高电平,无挡碍物时,指示灯不亮输出底电平)
4. 工作原理
模块中的红外对管一边是发射一边是接收,模块工作时发射管不断发出红外光,当没有障碍物挡住红外发射管发送给接收管的信号时,接收管接收到信号模块输出低电平;指示灯不亮,当有障碍物挡住红外发射管发送给接收管的信号时,接收管接收不到信号模块输出高电平~指示灯亮。
5. 实物图片与接口
6. 获取数据
环境:红外编码器、摇杆模块、直流电机、Basra控制板、BigFish扩展板、Arduino IDE
按下图所示连接电路:
编写下面的代码(Encoder.ino)并上传到控制板中,使用摇杆调整直流电机的转速。
#include <MsTimer2.h> //使用定时器,查在1000ms中的电平变化次数,即上升沿和下降沿的总数; int encoder_count=0; //计数; int nowaday_Value=0; //当前编码器电平; int last_Value=0; //上一次编码器电平; int sensor; //摇杆模块中值; /*通过编码器计算电机的转速*/ void EncoderDeal() { int speedd; speedd = encoder_count * 2; //编码器一圈为15个孔,30个边沿,1min=60s,60/30=2; Serial.println(speedd); encoder_count = 0;
} void setup() { Serial.begin(9600); //打开串口 encoder_count = 0; //计数清零 nowaday_Value = analogRead(A3); //先读取一次编码器的初始电平状态; nowaday_Value = compare(nowaday_Value);//判断其电平高低; last_Value = nowaday_Value; //记录; sensor = analogRead(A0); //读取摇杆传感器中值; delay(100); MsTimer2::set(1000, EncoderDeal); // 1000ms 定时器; MsTimer2::start(); } void loop() { nowaday_Value = analogRead(A3); //读取编码器当前电平; nowaday_Value = compare(nowaday_Value); //判断其电平高低; if(last_Value!=nowaday_Value) //如果电平变化,即遇到上升沿或者下降沿; { encoder_count++; //计数一次; last_Value=nowaday_Value; //更新上一次电平状态; } int Output=analogRead(A0); //读取摇杆模块电平,并映射输出给电机; analogWrite(9,map(Output,sensor,1023,0,255)); } int compare(int value) //防止因电路问题导致的高低电平噪声,比较电平高低; { if( value>=300 ) value=1; else value=0; return(value); } |
#include <MsTimer2.h> //使用定时器,查在1000ms中的电平变化次数,即上升沿和下降沿的总数; #include <PID_v1.h> //使用PID库; int encoder_count=0; //计数; int nowaday_Value=0; //当前编码器电平; int last_Value=0; //上一次编码器电平; int sensor; //摇杆模块中值; int speedd=0; //实际速度; /*PID设置*/ double Setpoint, Input, Output; PID myPID(&Input, &Output, &Setpoint,1.6,1,0,DIRECT ); //设置PID参数,输入输出,目标值,Kp,Ki,Kd,方向DIRECT//REVERSE /*通过编码器计算电机的转速*/ void EncoderDeal() { speedd = encoder_count * 2; //编码器一圈为15个孔,30个边沿,1min=60s,60/30=2; //Serial.println(Output); Serial.print(speedd); Serial.println("r"); encoder_count = 0; } void setup() { Serial.begin(9600); //打开串口 encoder_count = 0; //计数清零 nowaday_Value = analogRead(A3); //先读取一次编码器的初始电平状态; nowaday_Value = compare(nowaday_Value);//判断其电平高低; last_Value = nowaday_Value; //记录; sensor = analogRead(A4); //读取摇杆传感器中值; myPID.SetMode(AUTOMATIC); //设置PID自动调节模式; MsTimer2::set(1000, EncoderDeal); // 1000ms 定时器; MsTimer2::start(); } void loop() { nowaday_Value = analogRead(A3); //读取编码器当前电平; nowaday_Value = compare(nowaday_Value); //判断其电平高低; if(last_Value!=nowaday_Value) //如果电平变化,即遇到上升沿或者下降沿; { encoder_count++; //计数一次; last_Value=nowaday_Value; //更新上一次电平状态; } int control=analogRead(A0); //读取摇杆电平,以更新PID目标值; Setpoint = map(control,sensor,1023,0,150); //电平映射至速度,并赋给PID目标值; Input = speedd; //更新”速度“值; myPID.Compute(); //PID计算; analogWrite(9,Output); //输出PID计算结果至电机; } int compare(int value) //防止因电路问题导致的高低电平噪声,比较电平高低; { if( value>=300 ) value=1; else value=0; return(value); } |
/*为使同学们学习到编码器测速知识,所以此程序是在编码器测速实验基础上修改而成的,路程计算较简单,故误差较大,有兴趣的同学可以利用累加方式精确计算. #include <MsTimer2.h> //使用定时器2,查在1000ms中的电平变化次数,即上升沿和下降沿的总数; #include <Wire.h> //调用IIC函数库; #include <MultiLCD.h> //调用LED屏函数库 LCD_SSD1306 lcd; //定义一个LED屏对象; int encoder_count=0; //计数; int nowaday_Value=0; //当前编码器电平; int last_Value=0; //上一次编码器电平; int speedd=0; //实际速度; int timerNum=0; bool dis=true; /*通过编码器计算电机的转速*/ void EncoderDeal() { speedd = encoder_count; //编码器一圈为15个孔,30个边沿; encoder_count = 0; timerNum++; dis=true; } void setup() { lcd.begin(); //LED屏显示; analogWrite(5,150); //设置电机速度; Serial.begin(9600); //打开串口 encoder_count = 0; //计数清零 nowaday_Value = analogRead(A0); //先读取一次编码器的初始电平状态; nowaday_Value = compare(nowaday_Value);//判断其电平高低; last_Value = nowaday_Value; //记录; MsTimer2::set(2000, EncoderDeal); // 2000ms 定时器; MsTimer2::start(); //定时器开始计时; } void loop() { if(dis) //如果速度更新,刷新LED屏数据; {display(); dis=false;} nowaday_Value = analogRead(A0); //读取编码器当前电平; nowaday_Value = compare(nowaday_Value); //判断其电平高低; if(last_Value!=nowaday_Value) //如果电平变化,即遇到上升沿或者下降沿; { encoder_count++; //计数一次; last_Value=nowaday_Value; //更新上一次电平状态; } } int compare(int value) //防止因电路问题导致的高低电平噪声,比较电平高低; { if( value>=300 ) value=1; else value=0; return(value); } void display() //LED屏显示函数; { lcd.clear(); //清屏; Serial.print(speedd); //串口显示; Serial.print("r/min"); lcd.setCursor(0, 2); //设置LED屏光标位置; lcd.printLong(speedd, FONT_SIZE_LARGE);.//设置字体大小; lcd.setCursor(50, 3); lcd.print("r/min"); int distance=timerNum*speedd/60*5*3; //在整个程序中只设置过一次速度(150),故默认小车匀速行驶,speedd恒定;车轮直径5cm,为了显示方便,π取3; Serial.print(distance); Serial.println("cm"); lcd.setCursor(0, 5); lcd.printLong(distance, FONT_SIZE_LARGE); lcd.setCursor(50, 6); lcd.print("cm"); } |
打开Serial Monitor,观察数据随速度变化的情况,如下图所示:
7. PID控制
PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。其输入e (t)与输出u (t)的关系为:
u(t)=kp[e(t)+1/TI∫e(t)dt+TD*de(t)/dt] 式中积分的上下限分别是0和t
因此它的传递函数为:G(s)=U(s)/E(s)=kp[1+1/(TI*s)+TD*s]
其中kp为比例系数; TI为积分时间常数; TD为微分时间常数
使用中只需设定三个参数(Kp, Ti和Td)即可。在很多情况下,并不一定需要全部三个单元,可以取其中的一到两个单元,但比例控制单元是必不可少的。
如果我们给双轮差速小车(如023号机构)的两个直流电机安装红外编码器,并设计PID算法,就可以让小车的双轮转速保持一致,使得小车在行进过程中保持直线。
代码如下:(需要Arduino1.6以上版本IDE)
8. 监测行驶里程
车仪表板中最显眼的是车速里程表,它表示汽车的时速,单位是km/h(公里/小时)。汽车里程表实际上由两个表组成,一个是车速表,另一个是里程表。
如果我们在小车的合适位置安装一个编码器,那么就可以记录小车行驶的速度和里程。
电子器件:Arduino UNO(Basra)控制板、Bigfish扩展板、红外编码器、OLED显示屏
设计并组装一个小车,将编码器安装到合适的位置,正确连接电路。
将下列代码(cesu.ino)输入到C语言界面中:
10. 应用前景
· 电机转速检测
· 脉冲计数
· 位置限位
11. 资料清单
序号 | 内容 |
1 | 红外编码器电路原理图等 |
2 | 红外编码器PID函数库 |
3 | 例程-红外编码器获取数据 |
4 | 例程-不用定时器函数库的编码器测速程序 |
5 | 例程-PID控制 |
6 | 例程-小车里程表 |
请仔细检查输入的程序,确保没有错误后进行烧录。运行效果如下面的视频所示,其中速度单位为r/min,距离单位为cm。
可以试着换一些其他的轮子,计算出新轮子的周长,试着改变程序中关于轮子直径的参数,重新烧录新的程序到控制板中,观察里程变化。
9. 原理图
【整体打包】-【U009】如何使用探索者传感器-红外编码器-资料附件.zip | 462.07KB | 下载13次 | 下载 |
新版红外编码器
本模块为智能小车测速模块!采用槽型对射光电,只要在非透明物体通过槽型即可触发输出5V TTL电平。配合码盘,可用于小车测转速,测距离等等应用!
使用进口槽型光耦传感器,槽宽度 4mm。
有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。
有遮挡,输出高电平;无遮挡,输出低电平。
比较器输出,信号干净,波形好,驱动能力强,超过 15mA。
工作电压 3.3V-5V。
输出形式 :数字开关量输出,模拟量输出。
设有固定螺栓孔,方便安装。
使用宽电压 LM393 比较器。
工作电压:DC 3.3V-5.5V(最佳电压为5V)
工作电流:7mA至17mA
工作温度:-10℃—+50℃
安装孔径:M3螺丝
输出信号:TTL电平(可直接连接单片机I/0引脚)
模块工作时发射管不断发出红外光,当没有障碍物挡住红外发射管发送给接收管的信号时,接收管接收到信号模块输出低电平;指示灯不亮,当有障碍物挡住红外发射管发送给接收管的信号时,接收管接收不到信号模块输出高电平指示灯亮。
原理图:
环境:红外编码器、直流电机、basra控制板、BigFish扩展板、miniUSB数据线、锂电池。
按下图所示连接电路:
编写下面的代码(EncoderSensorPInD.ino)并上传到控制板中,具体程序如下:
/************************************* 电机转动一圈,编码器D0口进行中断触发次数测试 接线: 编码器 Arduino UNO GND--------------- GND 5V--------------- 5V D0--------------- A0 A0 直流电机接D9,D10 *************************************/ #include "PinChangeInterrupt.h" #define encoder_pina A0 //编码器D0口对应的引脚 #define MOTOR_PIN1 9 #define MOTOR_PIN2 10 #define TIME_DELAY 2000 volatile long encoder_positiona = 0; //用于计数 unsigned long time_save = millis(); void read_a(){ encoder_positiona ++; //记录触发次数 } void setup() { delay(1000);Serial.begin(115200); pinMode(encoder_pina, INPUT_PULLUP); pinMode(MOTOR_PIN1, OUTPUT); pinMode(MOTOR_PIN2, OUTPUT); attachPCINT(digitalPinToPCINT(encoder_pina), read_a, CHANGE); time_save = millis(); motor_stop();delay(1000); } void loop() { //正转一圈 motor_go(); while((millis()-time_save) < TIME_DELAY ){ //Serial.println(encoder_positiona); Serial.print("正向触发: "); Serial.print(encoder_positiona); Serial.println("次"); } data_clear(); //反转一圈 motor_back(); while((millis()-time_save) < TIME_DELAY ){ //Serial.println(encoder_positiona); Serial.print("反向触发: "); Serial.print(encoder_positiona); Serial.println("次"); } data_clear(); } void motor_go(){ analogWrite(MOTOR_PIN1, 90);analogWrite(MOTOR_PIN2, 0); } void motor_back(){ analogWrite(MOTOR_PIN1, 0);analogWrite(MOTOR_PIN2, 90); } void motor_stop(){ digitalWrite(MOTOR_PIN1, HIGH);digitalWrite(MOTOR_PIN2, HIGH); } void data_clear(){ time_save = millis(); encoder_positiona = 0; motor_stop();delay(1000); } |
打开Serial Monitor,观察数据随速度变化的情况,如下图所示:
运行演示效果如图:
序号 | 名称 | |
1 | 红外编码器电路原理图等 | |
2 | 函数库-Arduino-新版红外编码器 | |
3 | Arduino例程源码 |
电机转速检测
脉冲计数
位置限位
8.资料清单
Q&A-【U009】如何使用探索者传感器-新版红外编码器-下载资料清单.zip | 965.44KB | 下载1次 | 下载 |
1. 简介
QMC5883L源于霍尼韦尔 HMC5883L , 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X 系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在1°~2°的12 位模数转换器、简易的I2C 系列总线接口。
2. 特点
· 三轴磁阻传感器和ASIC 都被封装在3.0×3.0×0.9mm LCC 表面装配中
· 12-bit ADC 与低干扰AMR 传感器,能在±8 高斯的磁场中实现5 毫高斯分辨率
· 内置自检功能
· 低电压工作(2.16-3.6V) 和超低功耗(100uA)
· 内置驱动电路
· I2C 数字接口
· 无引线封装结构
· 磁场范围广(+/-8Oe)
· 有相应软件及算法支持
· 最大输出频率可达160Hz
3. 参数
特性 | 条件 | 最小 | 标准 | 最大 | 单位 |
供电电压 | VDD 参考AGND VDDIO 参考 DGND | 2.16 1.71 | 1.8 | 3.6 VDD+0.1 | V V |
平均电流损耗 | 闲置模式 测量模式(7.5Hz ODR) 没有应用测量平均值, 即设置 MA1:MA0=00) VDD = 2.5V,V DDIO = 1.8V |
- - |
2 100 |
- - | μA μA |
磁场范围 | 满量程(FS) – 全部施加磁场(典型) | -8 | +8 | 高斯 | |
磁动态范围 | 3-bit 增益控制 | ±1 | ±8 | 高斯 | |
线性 | ±2.0 高斯输入范围 | 0.1 | ±%满量程 | ||
解析度 | VDD=3.0V, GN=2 | 5 | 毫高斯 | ||
启动时间 | I2C 控制准备时间 | 200 | μs | ||
磁滞 | ±2.0 高斯输入范围 | ±25 | ppm | ||
纵向灵敏度 | 测试条件:纵向区域=0.5gauss, Happlied=±3gauss | ±2% | %FS/Gauss | ||
输出速率 | 持续测量模式 单一测量模式 | 0.75 | 75 160 | Hz Hz | |
开关时间 | I2C 指令等待 | 200 | us | ||
测量周期 | 从接收指令到数据准备 | 6 | ms | ||
增益公差 | 所有增益/动态范围设置 | ±5 | % | ||
I2C 地址 | 7-bit 地址 8-bit 读取地址 8-bit 写入地址 | 0x1E 0x3D 0x3C | hex hex hex | ||
I2C 率 | 由I2C 主机控制 | 400 | kHz | ||
I2C 滞后性 | 施密特触发器脉冲输入在SCL和 SDA 上的滞后性- 下降 (VDDIO=1.8V) 上升(VDDIO=1.8V) | 0.2*VDDIO 0.8*VDDIO | V V | ||
自测试 | X&Y 轴 Z 轴 | ±1.16 ±1.08 | 高斯 | ||
X&Y 轴(GN=100) Z 轴(GN=100) | 510 | LSb |
4. 实物图片与接口
名称 | 功能 |
VCC | 模块电源,3.3V |
GND | 地线 |
SCL | I2C时钟线 |
SDA | I2C数据线 |
DRDY | 数据准备,中断引脚 |
#include <Wire.h> #include <MechaQMC5883.h> MechaQMC5883 qmc; void setup() { Wire.begin(); Serial.begin(9600); qmc.init(); //qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256); } void loop() { int x,y,z; qmc.read(&x,&y,&z); Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.print(y); Serial.print(" z: "); Serial.print(z); Serial.println(); delay(100); } |
5. 硬件连接
使用杜邦线,按如图所示的线序,将电子罗盘与Bigfish扩展板上的相应端口连接上。
6. 获取数据
环境:电子罗盘、Basra控制板、BigFish扩展板、杜邦线、Arduino IDE等。
安装电子罗盘扩展库,然后编写如下代码:
将程序上传到主控板中。打开串口监视器,转动电子罗盘,可以看到角度数值的变化,如下图所示:
7. 应用前景
手机、笔记本、电脑、消费类电子、汽车导航系统和个人导航系统
8. 参考资料
https://blog.csdn.net/yedongnan001/article/details/78894358
https://www.yiboard.com/thread-1018-1-1.html
9. 资料清单
序号 | 内容 |
1 | 函数库-Arduino-电子罗盘 |
2 | 例程-Arduino-电子罗盘获取数据 |
3 | 例程-Arduino-电子罗盘计算旋转角 |
【整体打包】-【U009】如何使用探索者传感器-电子罗盘-资料附件.zip | 12.25KB | 下载2次 | 下载 |
1. 简介
探索者六轴陀螺仪使用的是MPU6050陀螺仪模块,内部集成了姿态解算器,配合动态卡尔曼滤波算法,能够在动态环境下准确输出模块的当前姿态,姿态测量精度0.01度,稳定性极高,性能甚至优于某些专业的倾角仪!
说明:请区别使用探索者的MPU6050模块(另有一片单片机)和其他厂家的MPU6050模块(只有一片MPU6050),如图所示。
2. 特点
· 采用高精度的陀螺加速度计MPU6050,处理器读取MPU6050的测量数据然后通过串口输出,免去了用户自己去开发MPU6050复杂的I2C协议,同时精心的PCB布局和工艺保证了MPU6050收到外接的干扰最小,测量的精度最高。
· 模块内部自带电压稳定电路,可以兼容3.3V/5V的嵌入式系统,连接方便。
· 模块保留了MPU6050的I2C接口,以满足高级用户希望访问底层测量数据的需求。
· 采用先进的数字滤波技术,能有效降低测量噪声,提高测量精度。
3. 参数
1、电压:3V~6V
2、电流:<10mA
3、体积:15.24mm X 15.24mm X 2mm
4、测量维度:加速度:3维;角速度:3维;姿态角:3维
5、量程:加速度:±16g,角速度:±2000°/s。
6、分辨率:加速度:6.1e-5g,角速度:7.6e-3°/s。
7、稳定性:加速度:0.01g,角速度0.05°/s。
8、姿态测量稳定度:0.01°。
9、数据输出频率100Hz(波特率115200)/20Hz(波特率9600)。
10、数据接口:串口(TTL电平),I2C(直接连MPU6050,无姿态输出)
11、波特率115200kps/9600kps。
4. 注意事项
注:本模块不含磁场计,没有磁场的观测量对偏航角进行滤波,所以偏航角度是通过纯积分计算出来的,不可避免地会有漂移现象,只能实现短时间内的旋转角度测量。而X,Y轴角度可以通过重力场进行滤波修正,不会出现漂移现象。
5. 实物图片与接口
名称 | 功能 |
VCC | 模块电源,3.3V或5V输入 |
RX | 串行数据输入,TTL电平 |
TX | 串行数据输出,TTL电平 |
GND | 地线 |
SCL | I2C时钟线 |
SDA | I2C数据线 |
unsigned char Re_buf[11],counter=0; unsigned char sign=0; float a[3],w[3],angle[3],T; void setup() { // initialize serial: Serial.begin(115200); } void loop() { if(sign) { sign=0; if(Re_buf[0]==0x55) //检查帧头 { switch(Re_buf [1]) { case 0x51: a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16; a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16; a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16; T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25; break; case 0x52: w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000; w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000; w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000; T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25; break; case 0x53: angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180; angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180; angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180; T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25; Serial.print("a:"); Serial.print(a[0]);Serial.print(" "); Serial.print(a[1]);Serial.print(" "); Serial.print(a[2]);Serial.print(" "); Serial.print("w:"); Serial.print(w[0]);Serial.print(" "); Serial.print(w[1]);Serial.print(" "); Serial.print(w[2]);Serial.print(" "); Serial.print("angle:"); Serial.print(angle[0]);Serial.print(" "); Serial.print(angle[1]);Serial.print(" "); Serial.print(angle[2]);Serial.print(" "); Serial.print("T:"); Serial.println(T); break; } } } } void serialEvent() { while (Serial.available()) {
//char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code
Re_buf[counter]=(unsigned char)Serial.read(); if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头 counter++; if(counter==11) //接收到11个数据 { counter=0; //重新赋值,准备下一帧数据的接收 sign=1; }
} } |
6. 硬件连接
使用杜邦线,将MPU6050模块按下图接线顺序与bigfish扩展板上的相应端口连接上,这些串口TX、RX可以在2×5座坞上找到。
7. 获取MPU6050模块的姿态数据
环境:MPU6050陀螺仪、Basra控制板、BigFish扩展板、Arduino IDE等。
编写以下代码(MPU6050.ino)并上传到主控板中:
可在arduino串口调试界面观察数据波形与传感器姿态的关系。如下图所示:
8. 应用前景
四轴飞行器、倒立摆、手持云台、平衡车。
9. 资料清单
序号 | 内容 |
1 | 六轴陀螺仪电路原理图等 |
2 | 函数库-六轴陀螺仪 |
3 | 例程-获取陀螺仪数据 |
【整体打包】-【U009】如何使用探索者传感器-六轴陀螺仪-附件资料.zip | 4.55MB | 下载100次 | 下载 |
1. 简介
语音处理技术是下一代多模式交互的人机界面设计中的核心技术之一。随着消费类电子产品中对于高性能、高稳健性的语音接口需求的快速增加,嵌入式语音处理技术快速发展。
根据市场对嵌入式语音识别系统的需求,探索者推出了新的语音识别模块。该模块采用了基于helios-adsp新一代中大词汇语音识别协处理方案的语音识别专用芯片HBR640,非特定人语音识别技术可对用户的语音进行识别,支持中文音素识别,可任意指定中文识别词条(小于8 个汉字),单次识别可支持1000 条以上的语音命令,安静环境下,标准普通话,识别率大于95%,可自动检测环境噪声,噪声环境下也能保证较好的识别率。
2. 特点
(1)硬件特性
· 增强型 16 位 nDSP 内核,工作频率 50MHz,内建 32K SRAM。
· 带有麦克风放大器的 16 位 ADC,用于语音录制。
· 带有 16 位高精度 DAC 及喇叭驱动电路,用于语音播放。
· 通过 SPI 接口读取 Flash 中的语音指令。
· 采用标准 UART 接口与主机进行通讯。
· 工作电压 3.3V-5.5V,工作电流小于 30mA,休眠电流小于 10uA。
(2)识别引擎
· 采用非特定人语音识别技术,可对用户的语音进行识别。
· 支持中文音素识别,可任意指定中文识别词条(小于 8 个汉字)。
· 单次识别可支持最大 100 条的语音命令,并支持识别命令分组,最大支持 1200 条语音命令。
· 可对 0.2 秒~3.2 秒的语音命令进行响应,响应时间约 0.4 秒~1.2 秒。
· 安静环境下,标准普通话,识别率大于 95%。
· 可自动检测环境噪声,噪声环境下也能保证较好的识别率。
(3)放音引擎
· 支持 SBC 编码算法,提供高音质的语音播放效果。
· 可配置放音音量,适应不同场景。
· 最多支持 500 段语音提示。
(4)PC 工具
· 可以很方便的编辑语音命令,并进行下载、测试。支持语音命令分组, 支持多音字处理。
· 可以很方便的编辑提示语音,并进行下载、测试。
3. 参数
· 高性能32 位RISC 内核,工作频率120MHz,内建96K SRAM
· 带有麦克风放大器的16 位ADC,信噪比>85dB,外围电路简单
· 通过SPI 接口读取Flash 中的语音指令
· 采用标准UART 接口与主机进行通讯
· 工作电压3.3V-5.5V,工作电流小于50mA,休眠电流小于80uA
4. HBR640 通信接口
(1) 通信接口
HBR640芯片/模块,与PC/主芯片采用RS232串口进行通讯。
· 标准3线UART口,RX/TX/GND
· 波特率配置为9600,19200,38400,57600,115200(默认)
· 9bit格式,1bit起始位,8bit数据位
(2)通讯协议
主机向从机发送3字节命令,从机返回3字节数据。
命令 | 主机---> 从机 | 主机<--- 从机 | 备注 |
初始化 | 0xA0 0xA0 0xA0 | 0x50 0x50 0x11 | 重新初始化0xLL为芯片版本 |
配置灵敏度 | 0xA1 0xLL 0xHH | 0x51 0xLL 0xHH | 配置麦克风灵敏度,0xLL(0x00-0x3F),HH(0x00-0x0F). |
配置输入语音音量 | 0xA2 0xLL 0xHH | 0x52 0xLL 0xHH | 配置噪声和语音音量门限,0xLL(0x16-0x28),0xHH(0x19-0x30) |
配置识别组 | 0xA9 0xLL 0xHH | 0x59 0xLL 0xHH | 配置当前识别组为0xHHLL,返回0xHHLL,若不相等则错误 |
启动一次识别 | 0xAA 0xLL 0x00 | 0x5A 0xLL 0xHH | 在0xLL(0x00不超时)秒内进行识别,返回识别结果0xHHLL(0x7FFF表示超时,0xffff表示有语音输入但无正确结果),等待命令。 |
启动连续识别 | 0xAB 0xAB 0x00 | 0x5B 0xLL 0xHH | 返回识别结果0xHHLL后(0xffff表示有语音输入,但无正确结果)后,继续进行识别(PC测试使用) |
退出识别 | 0xAC 0xAC 0x00 | 0x5C 0x00 0x00 | 退出识别,等待命令 |
进入休眠 | 0xAE 0xAE 0x00 | 0x5E 0x00 0x00 | 进入低功耗模式 |
读取候选结果 | 0XAF 0XLL 0X00 | 0X5F 0XLL 0XHH | 返回第0XLL(0-7)个候选词条的序号0xhhll(0xffff表示无此候选) |
播放语音 | 0XC8 0XLL 0XHH | 0X78 0X00 0X00 0X78 0X01 0X00 0X79 0X01 0X00 | 播放第0XHHLL段语音。启动播放返回 0X78 0X01 0X00,错误文件返回0X78 0X00 0X00。播放完成返回0X79 0X01 0X00. |
停止播放 | 0XC9 0X00 0X00 | ||
配置放音音量 | 0XCA 0XLL 0X00 | 0X7A 0XLL 0X00 | 配置放音音量为0XLL(0X00-0X0F),0XLL返回当前音量。 |
注:返回识别结果0XHHLL,播放第0XHHLL段语音,都是以0X0000为开始。
可以使用串口测试工具配合USB转串口模块进行通讯测试,如下图所示。
(3)工作流程
A. 上电,等待HBR640初始化完成(约0.5秒)
B. 发送初始化命令,等待回传数据,握手成功
C. 根据需要配置麦克风灵敏度(不配置则为默认的0X2F,0X0B)
D. 根据需要配置噪声门限(不配置则为默认的0X0C)
E. 根据需要配置放音音量(不配置则为默认的0X0C)
F. 配置识别命令组(复位后默认为第一组,无此步骤则保持上次分组)
G. 启动一次识别,等待识别结果(可配置超时时间)
H. 根据识别结果进行处理,或者读取候选识别结果进行处理
I. 根据需要播放指定的语音段
J. 重复f-i或g-i步骤,实现语音互动
K. 退出识别
L. 进入低功耗模式
5. 实物图片与接口
通过改变跳线帽的位置,可以将模块在“配置模式”和“运行模式”之间切换。
6. Arduino上的用法
6.1 配置识别词条控制LED模块
环境:HBR640模块,Basra控制板,Bigfish扩展板,LED模块,识别词条生成工具,Arduino IDE等。
(1)将一个红绿双色LED模块连接到Bigfish扩展板的A0,A1上;HBR640模块插到BigFish扩展板的扩展坞上。
(2)将HBR640模块安装到Bigfish上,跳线位置设为配置模式。
然后用一根USB线将Basra主控板连接至电脑上,将一段空程序烧录至主控板中,如下图所示。
(3)打开语音命令&提示生成工具SRTool.exe。
(4)新建/打开工程
在任意位置新建一个“HBR640对话工程”文件夹,然后在软件中点击“新建”,选择“HBR640对话工程”文件夹后,再创建一个文件名“Lamp”,点击“保存”。
/******************************************************************************************************* 实现功能: 用语音640实现语音台灯的打开和关闭; 实现思路: 将语音640安装好后,如果接收到命令为“开灯”,LED灯亮; 如果接收到命令为“关灯”,台灯关闭; 实验接线: LED模块的输入线接到Bigfish扩展板的A0,A1; 语音640模块接到BigFish扩展板的扩展坞上; *******************************************************************************************************/ #include "HBR640.h" //语音640需要的函数库 HBR640 hbr640; //实例化一个语音识别模块 void setup(){ hbr640.open(); //开始进行语音识别 pinMode( 14 , OUTPUT); pinMode( 15 ,OUTPUT);//将A0,A1针脚设置为输出模式; delay(1000); } void loop(){ if(hbr640.isHeard()) //如果监测到识别语句 { int value = hbr640.getSentence(); //获得识别语句的序号 switch (value) { case 0x00: LampMode(1); break;//如果接收到命令为“开灯”,灯打开; case 0x01: LampMode(2); break;//如果接收到命令为“关灯”,灯关闭; default: break; } } } void LampMode(int mode) //台灯模式; { switch(mode) { case 1: Open(); break; case 2: Close(); break; } } void Open() //台灯打开 { digitalWrite(14,LOW);digitalWrite(15,HIGH); } void Close() //台灯关闭 { digitalWrite(14,LOW);digitalWrite(15,LOW);
} void serialEvent() //程序会自动调用该程序; { hbr640.lisen(); //在串口接收事件中调用语音识别的监听指令 } |
(6)在下图所示位置添加“开灯”命令,然后点击“增加”按钮,即可将“开灯”命令添加至左侧的词条列表中。
(7)在下图所示位置再添加“关灯”命令,然后点击“增加”按钮,即可将“关灯”命令添加至左侧的词条列表中。
(8)点击“保存词条”。
(9)点击“生成”按钮。
(10)选择端口号(主控板在设备管理器中的COM号),并点击“连接”,显示连接成功即可。
(11)点击“烧录”并选择“全部”。在烧录过程中尽量不要移动主控板,显示烧录成功即可。
(12)点击“测试”按钮,会在左侧的词条列表下面出现“候选命令”区。
(13)对着语音识别模块分别说出刚刚编辑的命令“开灯”、“关灯”时,会在候选命令区出现对应的识别结果。
(14)测试成功后,点击“停止”按钮,并“断开”连接,此时语音库即已配置完成。
(15)编写并烧录以下程序,效果为:当人说出“开灯”时,LED灯显示红灯亮;当人说出“关灯”时,LED灯显示红灯灭。
(注意:执行时应将语音640模块的跳线帽更改为运行模式)。
代码如下(Lamp_hbr640.ino):
6.2 配置识别词条控制直流电机
将直流电机线接到D9,D10;HBR640模块连接到BigFish扩展板的扩展坞上。
我们假设这个直流电机是一台电风扇上的电机。参照6.1中的步骤配置语音库,我们只设置开、关两个命令,效果如下图所示:
编写并烧录以下程序(Fan_hbr640.ino):
#include "sys.h" #include "led.h" #include "motor.h" #include "hbr640.h" #include "hbr_uart5.h" #include "string.h" #include "stdlib.h" #include "stdio.h" void forward(void); void back(void); void left(void); void right(void); int main(void) { delay_init(168);//初始化延时,168为CPU运行频率 usart_init(115200); //串口初始化 UART5_INIT(); LED_Init();//初始化LED灯 MOTOR_Init();//电机初始化 HBR640_INIT(); open(); while(1) { delay_ms(100); printf("%s\n",_receiveBuf); if(isHeard()){ int value = getSentence(); printf("%d\n",value); switch(value){ case 0 : forward(); delay_ms(1000); break; case 1 : back(); delay_ms(1000); break; case 2 : left(); delay_ms(1000); break; case 3 : right(); delay_ms(1000); break; default: delay_ms(1000); break; } } UART5_RX_CONUT=0;//清除接收计数 for(int i=0;i<USART_REC_LEN;i++) { UART5_RX_BUF[i]=0;//清空接收BUF } for(int i=0;i<3;i++) { _receiveBuf[i]=0;//清空接收BUF } } } void forward(void) { PDout(14) = 0;//左 PDout(13) = 1; PCout(9) = 0;//右 PDout(12) = 1; } void back(void) { PDout(14) = 1;//左 PDout(13) = 0; PCout(9) = 1;//右 PDout(12) = 0; } void left(void) { PDout(14) = 1;//左 PDout(13) = 1; PCout(9) = 0;//右 PDout(12) = 1; } void right(void) { PDout(14) = 0;//左 PDout(13) = 1; PCout(9) = 1;//右 PDout(12) = 1; } |
/********************** 实现功能:用语音HBR640和近红外传感器实现小狗识别陌生人; 实现思路:将语音模块Hbr640和近红外安装好后,如果近红外触发(说明此时有陌生人靠近小狗),语音模块开始说“汪汪汪”; ***********************/ #include "HBR640.h" //使用hbr640模块需要的函数库; HBR640 hbr640; //实例化一个语音识别模块; #define Numbers_of_Voece 20 //定义的语音库数量(根据实际情况更改); #define Voice_Time 1500 //语音命令延时时间; #define Near_Infrared_Sensor A0//定义近红外传感器引脚; #define Left_Speed 65 //小车左侧轮子的速度 #define Right_Speed 95 //小车右侧轮子的速度 #define Motor_num 4 //定义的直流电机引脚数 #define MaxSpeed 255 //定义直流电机最大速度; unsigned char b = 0xC8; unsigned char c = 0x00; unsigned char a[Numbers_of_Voece] = {0x00, 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //定义的语音库相关词条序号 int Motor_Pin[4] = {5,6,9,10}; //定义直流电机引脚 void setup() { // put your setup code here, to run once: hbr640.open(); //开始进行语音识别 for(int i=0;i<Motor_num;i++){ pinMode(Motor_Pin[i] , OUTPUT); //将直流电机引脚设置为输出模式 } pinMode(Near_Infrared_Sensor,INPUT); //设置近红外传感器为输入模式; delay(2000); } void Get_Mode(byte character[] ,unsigned char s,unsigned char d,int Num) { //将烧写好的语音命令发送给hbr640模块 unsigned char _YuYin[3]; _YuYin[0] = s; _YuYin[1] = character[0]; _YuYin[2] =d; for(int i=0;i<Num;i++){ Serial.write(_YuYin,3); delay(Voice_Time); } } void loop() { // put your main code here, to run repeatedly: unsigned long t = millis(); while(millis()-t<1000){ Motor_Go(); Dog(); } unsigned long s = millis(); while(millis()-s<1000){ Motor_Back(); Dog(); } } void Dog() //检测是否有陌生人靠近 { if(ReadSensor(Near_Infrared_Sensor)){ Motor_Stop(); Get_Mode( a, b , c ,1); //如果近红外传感器触发,语音模块执行相对应的语音; } } int ReadSensor(int which) //读取传感器的监测状态; { int Data = ! digitalRead(Near_Infrared_Sensor); return Data; } void Motor_Go() //前进 { analogWrite(Motor_Pin[0],Right_Speed); analogWrite(Motor_Pin[1],0); analogWrite(Motor_Pin[2],Left_Speed); analogWrite(Motor_Pin[3],0); } void Motor_Left() //左转 { analogWrite(Motor_Pin[0],Right_Speed); analogWrite(Motor_Pin[1],0); analogWrite(Motor_Pin[2],0); analogWrite(Motor_Pin[3],Left_Speed); } void Motor_Right() //右转 { analogWrite(Motor_Pin[0],0); analogWrite(Motor_Pin[1],Right_Speed); analogWrite(Motor_Pin[2],Left_Speed); analogWrite(Motor_Pin[3],0); } void Motor_Back() //后退 { analogWrite(Motor_Pin[0],0); analogWrite(Motor_Pin[1],Right_Speed); analogWrite(Motor_Pin[2],0); analogWrite(Motor_Pin[3],Left_Speed); } void Motor_Stop() //停止 { analogWrite(Motor_Pin[0],MaxSpeed); analogWrite(Motor_Pin[1],MaxSpeed); analogWrite(Motor_Pin[2],MaxSpeed); analogWrite(Motor_Pin[3],MaxSpeed); } |
/********************** 实现功能:用语音640实现语音说话; 实现思路:将语音模块Hbr640和近红外安装好后,如果近红外触发(说明此时有人靠近鹦鹉),语音模块开始说“主人下班了,注意休息”; 实验接线: 近红外模块接到A0; 语音640模块接到BigFish扩展板的扩展坞上; ****************************/ #include "HBR640.h" //使用hbr640模块需要的函数库; HBR640 hbr640; //实例化一个语音识别模块; #define Numbers_of_Voece 20 //定义的语音库数量(根据实际情况更改); #define Voice_Time 2700 //语音命令延时时间; #define Near_Infrared_Sensor A0//定义近红外传感器引脚; unsigned char b = 0xC8; unsigned char c = 0x00; unsigned char a[Numbers_of_Voece] = {0x00, 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //定义的语音库相关词条序号 void setup() { // put your setup code here, to run once: hbr640.open(); //开始进行语音识别 pinMode(Near_Infrared_Sensor,INPUT); //设置近红外传感器为输入模式; delay(2000); } void Get_Mode(byte character[] ,unsigned char s,unsigned char d,int Num) { //将烧写好的语音命令发送给hbr640模块 unsigned char _YuYin[3]; _YuYin[0] = s; _YuYin[1] = character[0]; _YuYin[2] =d; for(int i=0;i<Num;i++){ Serial.write(_YuYin,3); delay(Voice_Time); } } void loop() { // put your main code here, to run repeatedly: if(ReadSensor(Near_Infrared_Sensor)){ Get_Mode( a+2, b , c ,1);//如果近红外传感器触发,语音模块执行相对应的语音; } else delay(2);//如果近红外传感器没有触发,不动作; } int ReadSensor(int which)//读取传感器的监测状态; { int Data = ! digitalRead(Near_Infrared_Sensor); if(Data) { delay(20); //防止传感器误触发 if(!digitalRead(Near_Infrared_Sensor)) return Data; } else return Data; } |
/******************************************************************************************************* 实现功能: 用语音640实现语音风扇的打开和关闭; 实现思路: 将语音640安装好后,如果接收到命令为“风扇打开”,风扇开始转动; 如果接收到命令为“风扇关闭”,风扇停止转动; 实验接线: 风扇的直流电机线接到D9,D10; 语音640模块接到BigFish扩展板的扩展坞上; *******************************************************************************************************/ #include "HBR640.h" //语音640需要的函数库 HBR640 hbr640; //实例化一个语音识别模块 void setup(){ hbr640.open(); //开始进行语音识别 pinMode( 9 , OUTPUT); pinMode( 10 ,OUTPUT);//将直流电机设置为输出模式; delay(1000); } void loop(){ if(hbr640.isHeard()) //如果监测到识别语句 { int value = hbr640.getSentence(); //获得识别语句的序号 switch (value) { case 0x00: FanMode(1); break;//如果接收到命令为“风扇打开”,风扇开始转动; case 0x01: FanMode(2); break;//如果接收到命令为“风扇关闭”,风扇停止转动; default: break; } } } void FanMode(int mode) //风扇模式; { switch(mode) { case 1: Open(); break; case 2: Close(); break; } } void Open() //风扇打开 { digitalWrite(10,LOW);digitalWrite(9,HIGH); } void Close() //风扇关闭 { digitalWrite(10,LOW);digitalWrite(9,LOW);
} void serialEvent() //程序会自动调用该程序; { hbr640.lisen(); //在串口接收事件中调用语音识别的监听指令 } |
/********************** 实现功能:用HBR640实现语音控制小车; 实现思路:将HBR640安装好后,如果接收到命令为“前进”,小车前进1秒后停止;如果接收到命令为“后退”,小车后退1秒后停止;如果接收到命令为“左转”,小车左转1秒后停止;如果接收到命令为“右转”,小车右转1秒后停止;如果接收到命令为“停止”,小车停止;否则,没有接收到命令,小车停止; **************************/ #include "HBR640.h" //HBR640需要的函数库 #define DelayTime 1000//小车执行相关动作的时间; HBR640 hbr640; //实例化一个语音识别模块 void setup(){ hbr640.open(); //开始进行语音识别 pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); pinMode( 9 , OUTPUT); pinMode( 10 , OUTPUT);//将直流电机设置为输出模式; } void loop(){ if(hbr640.isHeard()) //如果监测到识别语句 { int value = hbr640.getSentence(); //获得识别语句的序号 switch (value) { case 0x00: MotorMode(1,DelayTime); break;//如果接收到命令为“前进”,小车前进1秒后停止; case 0x01: MotorMode(2,DelayTime); break;//如果接收到命令为“后退”,小车后退1秒后停止; case 0x02: MotorMode(3,DelayTime); break;//如果接收到命令为“左转”,小车左转1秒后停止; case 0x03: MotorMode(4,DelayTime); break;//如果接收到命令为“右转”,小车右转1秒后停止; case 0x04: MotorMode(5,DelayTime); break;//如果接收到命令为“停止”,小车停止; default: break; } } } void MotorMode(int mode,int t) //直流电机模式; { switch(mode) { case 1: Forward(t); break; case 2: Back(t); break; case 3: Left(t); break; case 4: Right(t); break; case 5: Stop(t); break; } } void Forward(int t) //前进 { digitalWrite(10,LOW);digitalWrite(9,HIGH); digitalWrite(5,HIGH);digitalWrite(6,LOW); delay(t); Stop(2); } void Back(int t) //后退 { digitalWrite(10,HIGH);digitalWrite(9,LOW); digitalWrite(5,LOW);digitalWrite(6,HIGH); delay(t); Stop(2); } void Left(int t) //左转 { digitalWrite(5,HIGH);digitalWrite(6,LOW); digitalWrite(9,LOW);digitalWrite(10,HIGH); delay(t); Stop(2); } void Right(int t) //右转 { digitalWrite(5,LOW);digitalWrite(6,HIGH); digitalWrite(9,HIGH);digitalWrite(10,LOW); delay(t); Stop(2); } void Stop(int t) //停止 { digitalWrite(5,LOW);digitalWrite(6,LOW); digitalWrite(9,LOW);digitalWrite(10,LOW); delay(t); } void serialEvent() //程序会自动调用该程序; { hbr640.lisen(); //在串口接收事件中调用语音识别的监听指令 } |
#include "HBR640.h" #include <Servo.h> HBR640 hbr640; //实例化一个语音识别模块 void setup(){ hbr640.open(); //开始进行语音识别 servo_pin_4.attach(4); } void loop(){ if(hbr640.isHeard()) //如果监测到识别语句 { int value = hbr640.getSentence(); //获得识别语句的序号 switch (value) { case 0: servo_pin_4.write( 50 ); break; case 1: servo_pin_4.write( 90 ); break; default: break; } } } void serialEvent() { hbr640.lisen(); //在串口接收事件中调用语音识别的监听指令 } |
编写并烧录以下代码(Voice_Controled_Gripper.ino):
(5)在下图中的“未命名”区增加“台灯”分组。
6.3 配置识别词条控制小车
接下来让我们使用语音识别模块控制直流电机,并实现用语音命令控制一个小车运动。
环境:HBR640模块、Basra控制板、miniUSB数据线、026号机构、Arduino IDE等。
词条配置如下:
编写并烧录以下代码(Tank_hbr640.ino):
6.4 配置识别词条控制伺服舵机
环境:HBR640模块、Basra控制板、M006号模组、Arduino IDE等。
配置词条如下:
6.5 语音提示功能
语音识别HBR640配套的语音命令&提示配置工具软件主要包括语音命令区、语音提示区两大功能区(见下图)。
语音提示功能主要在语音提示区进行配置。语音提示功能,需要先使用录音软件,录制.wav格式的文件;然后把其放入工程文件中,点“生成”按钮,烧录到语音识别HBR640模块里;最后,编程控制实现语音提示的功能。详细步骤如下:
(1)录制.wav文件
首先,我们需要一款录音软件,如【小毅】语音合成工具。打开【小毅】语音合成工具.exe,界面如下:
点击“开始合成”后,可得到合成的语音文件,如下图所示:
将录制完成的语音文件重命名后(下左图,为一些例子),将它们保存在wav文件夹。
至此就完成了语音录制的功能。
(2)下面将把这些.wav文件导入工程,生成工程,并烧录。打开软件SRTool.exe,如下图所示:
在电脑桌面创建一个新的空文件夹,如Voice.
接着点击SRTool.exe软件中的“新建”,找到之前创建的空文件夹(Voice),自己拟定一个语音工程名(本例拟定工程名为:Voice),最后点击“保存”。如下图所示:
此时,我们打开文件夹“Voice”,发现SRTool.exe自动创建了工程文件
把wav文件夹复制到Voice文件夹下,见下图:
点击“生成”按钮,生成输出文件。
下面将把工程文件烧录到语音识别模块中。这里需要先选择端口,点击“连接”;连接成功后,点击“烧录”。详细步骤如下:
第一步: 烧写一段空的程序到Basra主控板中。
注意:烧录空程序时,先把语音识别模块拔下来(见下图);因为下载空程序和语音识别模块共占用一个串口。
第二步: 将HBR640模块安装到BigFish上,条线位置设置为配置模式
第三步:将Hbr640模块连接与BigFish扩展板的扩展坞相连,上电,按下图提示操作。如果连接失败,重复该操作(注意:该软件提供的串口号最大到COM24,如果串口号大于24,在“设备管理器”->“端口”中更改串口号即可)
烧录成功后,见下图
(3)编程控制访问
模拟鹦鹉学舌的过程;当主人回来时,说“主人下班了,休息休息”。
请按下图连接电路, 近红外模块接到A0;语音640模块接到BigFish扩展板的扩展坞上;蜂鸣器接线见下图:
参考程序(HBR640_Parrot.ino)如下:(注意,语音识别模块会占用串口,因此烧录程序时,需要把语音识别模块拔下来再烧录)
6.6 语音命令机器狗
用小车模拟一只机器狗,小狗在院子里悠闲的行走;当遇到障碍时,停下来并汪汪叫。
环境:HBR640模块、Basra控制板、023号机构改装的机器小狗、近红外传感器、无源蜂鸣器、Arduino IDE等
电路连接:近红外传感器接到Bigfish扩展板的A0口;HBR640模块接到BigFish扩展板的扩展坞上,将蜂鸣器接在HBR640模块上。
(1)将语音640模块更改为“配置模式”,并用一个USB线将BASRA主控板连接至电脑上,将下图中的空程序烧录至主控板中。
(2)打开语音合成工具软件,如下图所示。
(3)输入需要执行的命令,勾选“保存语音文件”,并点击“开始合成”,便会生成一个合成语音.wav文件。
(4)在桌面新建一个wav文件夹,并将合成语音.wav文件更名为“汪汪汪.wav”存放至wav文件夹中,至此完成了语音录制的功能。
(5)打开SRTool.exe,如下图所示。
(6)先新建一个“HBR640对话工程”文件夹,然后在软件中点击“新建”,选择“HBR640对话工程”文件夹后,再创建一个文件名“dog”,点击“保存”。
(7)在下图中的“未命名”区增加“狗”分组。
(7)将“wav文件夹”移动至“HBR640对话工程”文件夹中,并点击“打开”选择“dog.Hsr文件”,最后点击“打开(0)”按钮,便会创建一个汪汪汪.wav的语音提示区。
(9)先点击“保存词条”,再点击“生成”按钮。
(10)选择端口号,并点击“连接”,显示连接成功即可。
(11)点击“烧录”并选择“全部”。在烧录过程中尽量不要移动主控板,显示烧录成功即可。
(12)点击“测试”按钮,然后“双击”语音提示区内的汪汪汪.wav,便可测试语音效果。
(13)测试成功后,点击“停止”按钮,并“断开”连接,此时语音库即已配置完成。
编写并烧录以下程序(Voice_Dog.ino):
7. 在STM32上的应用
7.1 配置识别词条
环境:HBR640模块、控制板、识别词条生成工具、Keil等。
(1)烧写一段空的程序到控制板中
(2)将HBR640模块安装到通信底座上,跳线位置设为配置模式
(3)打开..\HBR640语音识别模块\HBR640开发工具\识别词条生成工具\SRTool.exe。
①新建/打开工程
可以【新建】工程来增加分组、词条。也可以【打开】工程进行编辑。
②进行词条编辑
可通过导入词条或手工输入/编辑词条的方法来进行编辑词条,编辑词条时,要特别注意对于多音字的词条,应在拼音列表中选择正确的读音,避免造成选择了错误的读音不能正确识别。
③提示语音编辑
工具自动将工程目录的wav文件夹下的所有*.wav文件载入工程;注意wav文件要求是单声道,支持8K至22K的采样率。
④生成Flash烧录文档
点击【生成】按钮将在工程Output目录输出Flash烧录文档。
⑤进行烧录
可用SRTool.exe来更新HBR640模块的识别词条。将HBR640模块通过PC端USB转串口通讯模块连接到电脑的USB口,并安装Driver目录下的驱动。
请尽量采购支持Win 10的USB转串口线。旧版本的USB转串口线,在Win10下,会因为自动更新而不能正常工作,请参考驱动目录下的《PL230驱动安装说明.pdf》
选择正确的串口号,并配置波特率,然后点击【连接】,PC程序与HBR640模块建立连接。点击【烧录】,即可将当前工程的词条列表&语音列表下载到Flash中。烧录时请注意不要移动HBR640模块或者USB转串口模块,防止干扰造成烧录失败。
⑥进行测试
点击【测试】,即可对当前工程的词条列表进行测试。可通过切换分组来测试没一组识别词条,检测识别效果。
对识别效果不好的词条,可通过编辑,生成、烧录、测试的流程,配置最佳的识别效果。
双击语音列表中的语音,可测试语音播放效果,注意播放语音后,会自动停止语音识别测试,请点击【测试】继续测试识别功能。
7.2 配置识别词条控制直流电机
实验目的:熟悉HBR640的识别词条生成工具的使用,使用语音模块控制直流电机小车
实验性质:基础实验
实验学时:2学时
实验器材:HBR640模块、控制板、miniUSB数据线、023号机构。
词条配置如下:
实验例程如下:
序号 | 内容 |
1 | 语音识别模块HBR640电路原理图等 |
2 | 函数库-HBR640语音识别模块 |
3 | 例程-Arduino-语音控制机械手爪 |
4 | 例程-Arduino-语音控制小车 |
5 | 例程-Arduino-语音提示 |
6 | 例程-STM32-语音识别例程 |
7 | 软件-HBR640语音识别模块 |
8 | 例程-Arduino-语音控制LED灯 |
9 | 例程-Arduino-语音控制电风扇 |
10 | 例程-Arduino-语音控制机器狗 |
8. 其他说明
8.1 识别相关
(1)HBR640芯片采用非特定人语音识别算法,使用前不需要进行录音和训练,不论男女,要求用户使用标准普通话,可以得到最好的识别效果。
(2)开发工具中,可自动去除汉字相同的重复命令。对于汉语拼音相同的命令,没有进行处理,比如“古诗”和‘故事’。请在编辑词条时,使用近义词或者改变说法来替代。
(3)对同一命令词条,可以设置若干相近的词条来识别,增强识别效果。例如‘唱首歌吧’,可增加‘我要听歌’,‘你给我唱首歌’等词条。
(4)可以在每一组词条中,加入若干非命令词作为‘吸收词条’,用于在实际系统中,避免非命令词条的干扰。比如,有效命令30条,可加入70条无效命令(如‘一二三四五’,‘啦啦啦’等)作为吸收词条,主控端接收到大于30的返回结果都认为是无效令。
(5)可以通过分组设置来实现关键词识别,例如,第一组词条为‘小白兔’,加若干吸收 词条,第二组为命令词,如‘唱首歌吧’,‘讲故事吧’等。可配置为只有识别到第一组 的“小白兔”,才能进入第二组的命令识别,达到防治噪声干扰的效果。
(6)当前系统仅支持中文普通话识别。当需要进行方言或者外文的识别,如果对识别效果要求不是特别严格,则可以通过汉字拼音模拟的方式来实现。例如英文“Hello”可以用“哈喽”来替代。
(7)麦克风灵敏度可以通过命令来调节,以支持不同的场景。配置灵敏度命令OXA1,0XLL,0XHH,其中OXLL是麦克风增益,OXHH无效。复位/唤醒后,未配置则默认为0X28,0X0C。HBR640模块默认使用-48dB灵敏度的麦克风,实际选用时应尽量与之相同,否则将造成增益可调范围缩小。
【麦克风增益】麦克风直接感应到的声音是很小的,HBR640芯片内置一个放大单元进行放大。放大的倍数被称为增益。对于近距离的使用,比如安静的室内,麦克风只需要设置在60-80倍之间,(默认0X28对应70倍)。如果用户的声音小,或者离得远,则可以设置得大些。反之,若在一个嘈杂的环境下,使用头戴式麦克风,则可以设置得小些(如0X10,对应28倍),请根据实际使用环境,使用方式进行配置。
识别词条生成工具SRTool.exe V1.5版以上支持增益调节测试。通过滑块选择不同增益,测试则以当前增益配置进行识别,可根据不同产品应用,配置适当的增益等级,主控芯片按此等级配置增益。
共5档增益可调,默认第4档。每档麦克风和ADC增益分别为1-(OxOx,0x02),2-(0x17,0x05),3-(0x23,0x08),4-(0x2f,0x0b),5-(0x3b,0x0e)。
噪音门限可以通过命令来调节,以支持不同的场景。配置噪声门限命令0xA2,0xLL,0xHH,其中0xLL是噪声最大音量,0xHH是语音最小音量。复位/唤醒后,未配置则默认为0x16,0x19。噪声最大音量表示小于该音量的声音将会被认为是噪声,取值范围为0x16-0x28。语音最小音量则表示只有大于改音量的声音才被认为是语音命令,取值范围为0x19-0x30,此值应大于噪声最大音量。配置得越大,要求说话声音越大,识别距离越近。
可通过识别词条生成工具SRTool.exe,进行调节测试,共5档“音量”可调,其中3档位系统默认值。每档(噪声最大音量,语音最小音量)取值如下:1-(0x0c,0x11),2-(0x12,0x15),3-(0x16,0x19),4-(0x1a,0x1d),5-(0x1e,0x21).
(8)状态指示灯定义如下:
8.2 休眠唤醒
休眠模式也可以通过休眠命令及唤醒流程进行控制,也可以通过控制HBR640模块的系统供电来实现。
通过发送休眠指令0xAE,0xAE,0xAE,使HBR640模块进入休眠状态。
HBR640模块的唤醒流程如下:
(1)通过串口向HBR640模块发送任意串口数据,如0xA0.
(2)延时200ms,等待HBR640模块被唤醒并进行初始化。
(3)发送握手命令0xA0,0xA0,0xA0。
(4)等待BR640返回值。如返回握手状态0x50,0x50,0xll,则表示唤醒成功,可进行操作。如20ms无返回值,则重复c)步操作。
(5)进行正常工作。
8.3 固件版本
HBR640的芯片程序不支持升级,当前固件为V2.-180103。
8.4 波特率配置
请按以下方式配置波特率
(1)打开工程,修改PC工具波特率,生成Rom档。
(2)将PC工具波特率修改为HBR640模块实际的波特率,下载
(3)下载完成,断开HBR640的USB接口,重新连接。
(4)修改PC工具波特率为工程指定波特率,进行测试
8.5 读取候选结果
(1)读取候选结果,主要用于有人机交互的情况,比如有屏幕可显示识别结果,则可将候选结果都罗列出来,供用户选择。候选结果按语音命令相似度进行排序,越相似的命令,排位越靠前,第0条候选命令序号,与直接返回的命令序号相同。
(2)读取候选结果,也可用于词条生成工具中,测试哪些词条过于相似,易出现混淆。可根据候选命令来调整识别命令。
(3)候选结果最多可读取4个,可根据实际需要读取。
(4)若候选结果返回0xffff,表示此候选位置无相似的结果。
9. HBR640 潜在应用领域
HBR640 可以很简便的配置语音命令&语音提示,实现语音交互功能。用户可根据应用场景的不同自主配置语音命令列表和语音提示,因此极大拓展了其应用领域。其潜在的应用领域主要包括:
· 智能语音玩具、故事机
· 智能家电
· 智能家居系统
· 车载设备
· 手持终端、导游机
· 物联网系统
· 医疗领域
10. 资料清单
【整体打包】-【U009】如何使用探索者传感器-语音识别模块HBR640-资料附件.zip | 16.46MB | 下载31次 | 下载 |
TCS3200颜色识别
TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。每6种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系。
l 供电电源 3-5v
l 抗光干扰
l 白色LED,可控制亮,灭。
l 可检测不发光物体颜色
l 接口:TTL数字接口
l 光强度的高精度分辨率转换成频率
l 可编程颜色和全面的输出频率
l 电源中断特征
l 直接和微控制器交互
4. 工作原理
通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个光强值,就可以分析出反射到TCS3200传感器上的光的颜色。
TCS3200颜色传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2和S3的高低电平来选择滤波器模式,如下表:
S2 | S3 | 颜色类别 |
LOW | LOW | 红 |
LOW | HIGH | 蓝 |
HIGH | LOW | 清除,无脉冲 |
HIGH | HIGH | 绿 |
S0 | S1 | 输出频率 |
LOW | LOW | 不上电 |
LOW | HIGH | 2% |
HIGH | LOW | 20% |
HIGH | HIGH | 100% |
#include <TimerOne.h> //把TCS3200颜色传感器各控制引脚连到Arduino数字端口 #define S0 A0 #define S1 A1 //S0和S1的组合决定输出信号频率比率因子,,比例因子为2% #define S2 A2 //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器 #define S3 0 #define OUT 2 //输出信号输入到Arduino中断0引脚,并引发脉冲信号中断 //在中断函数中记录TCS3200输出信号的脉冲个数 #define LED A3 //控制TCS3200颜色传感器是否点亮 int g_count = 0; // 计算与反射光强相对应TCS3200颜色传感器输出信号的脉冲数 int g_array[3]; // 数组存储在1s内脉冲数,乘以RGB比例因子就是RGB标准值 int g_flag = 0; //滤波器模式选择顺序标志 float g_SF[3]; // 存储RGB比例因子
// 初始化TSC3200各控制引脚的输入输出模式 //设置TCS3002D的内置振荡器方波频率与其输出信号频率的比例因子为2% void TSC_Init() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(OUT, INPUT); pinMode(LED, OUTPUT); digitalWrite(S0, LOW); digitalWrite(S1, HIGH); } //选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器 void TSC_FilterColor(int Level01, int Level02) { if(Level01 != 0) Level01 = HIGH; if(Level02 != 0) Level02 = HIGH; digitalWrite(S2, Level01); digitalWrite(S3, Level02); } //中断函数,计算TCS3200输出信号的脉冲数 void TSC_Count() { g_count ++ ; } //定时器中断函数,每1s中断后,把该时间内的红、绿、蓝三种光线通过滤波器时, //TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中 void TSC_Callback() { switch(g_flag) { case 0: Serial.println("->WB Start"); TSC_WB(LOW, LOW); //选择让红色光线通过滤波器的模式 break; case 1: Serial.print("->Frequency R="); Serial.println(g_count); // g_array[0] = g_count; //1s内的红光脉冲个数 TSC_WB(HIGH, HIGH); //选择让绿色光线通过滤波器的模式 break; case 2: Serial.print("->Frequency G="); Serial.println(g_count); g_array[1] = g_count; //1s内的绿光脉冲个数 TSC_WB(LOW, HIGH); //选择让蓝色光线通过滤波器的模式 break; case 3: Serial.print("->Frequency B="); Serial.println(g_count); Serial.println("->WB End"); g_array[2] = g_count; //1s内的蓝光脉冲个数 TSC_WB(HIGH, LOW); //选择无滤波器的模式 break; default: g_count = 0; //计数值清零 break; } } //设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志 //该函数被TSC_Callback( )调用 void TSC_WB(int Level0, int Level1) { g_count = 0; //计数值清零 g_flag ++; //输出信号计数标志 TSC_FilterColor(Level0, Level1); //滤波器模式 Timer1.setPeriod(1000000); //设置输出信号脉冲计数时长1s } //初始化 void setup() { TSC_Init(); Serial.begin(9600); //启动串行通信 Timer1.initialize(); // defaulte is 1s Timer1.attachInterrupt(TSC_Callback); //定时器1的中断,中断函数为TSC_Callback() //设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count() attachInterrupt(0, TSC_Count, RISING); digitalWrite(LED, HIGH);//点亮LED灯 delay(4000); //延时4s,等待被测物体红绿蓝在1s内的TCS3200输出信号脉冲计数 //白平衡测试,计算得到白色RGB值255与1s内三色光脉冲数的RGB比例因子 g_SF[0] = 255.0/ g_array[0]; //红色光比例因子 g_SF[1] = 255.0/ g_array[1] ; //绿色光比例因子 g_SF[2] = 255.0/ g_array[2] ; //蓝色光比例因子 //打印白平衡后的红、绿、蓝三色的RGB比例因子 Serial.println(g_SF[0],5); Serial.println(g_SF[1],5); Serial.println(g_SF[2],5); //红绿蓝三色光对应1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值 //打印被测物体的RGB值 for(int i=0; i<3; i++) Serial.println(int(g_array[i] * g_SF[i])); } //主程序 void loop() { g_flag = 0; //每获得一次被测物体RGB颜色值需时4s delay(4000); //打印出被测物体RGB颜色值 for(int i=0; i<3; i++) Serial.println(int(g_array[i] * g_SF[i])); } |
TCS3200有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOS TCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0和S1的高低电平来选择,如下表:
有了输出频率比例因子,但是如何通过OUT引脚输出信号频率来换算出被测物体由三原色光强组成的RGB颜色值呢?这还需进行白平衡校正来得到RGB比例因子才行!
白平衡校正方法是:把一个白色物体放置在TCS3200颜色传感器之下,两者相距10mm左右,点亮传感器上的4个白光LED灯,用控制器的定时器设置一固定时间1s,然后选通三原色的滤波器,让被测物体反射光中红、绿、蓝三色光分别通过滤波器,计算1s时间内三色光对应的
TCS3200传感器OUT输出信号脉冲数(单位时间的脉冲数包含了输出信号的频率信息),再通过正比算式得到白色物体RGB值255与三色光脉冲数的比例因子。有了白平衡校正得到的RGB比例因子,则其它颜色物体反射光中红、绿、蓝三色光对应的TCS3200输出信号1s内脉冲数乘以R、G、B比例因子,就可换算出了被测物体的RGB标准值了。
色度计测量应用领域
l 彩色打印
l 医疗诊断
l 计算机彩色监视器校准以及油漆
l 纺织品、化妆品和印刷材料的过程控制
l 测试条阅读
l 颜色排序
l 感应和校准环境光
l 颜色匹配和命名等
每次使用前,或使用过程中环境光发生变化了,都需要重新进行白平衡校正。
实验性质:基础实验
实验学时:2学时
实验器材:TCS3200颜色传感器、连接线3条、控制板、BigFish扩展板、miniUSB数据线。
按下图所示连接电路:
将TCS3200扩展库TimerOne拷贝到arduino的libraries中,启动arduino, 可以发现,在File→Examples中增加了TimerOne的例程,打开File-Examples-Timerone-Color_test,将例程uploading到控制板中。将颜色传感器贴近白色色卡,运行Serial Monitor查看颜色传感器得出的颜色值,如下图所示:
将例程中setup()函数内的g_SF[i]的值改为比例因子赋值
重新uploading程序,把白平衡时放置在TCS3200颜色传感器之下白色物体拿走,放上另一个黄色物体,在Arduino IDE串口监视器看到的这个黄色物体RGB值为233、157、56,如下图所示:
打开电脑Windows操作系统自带的画图板,点击菜单栏“颜色”--->“编辑颜色”--->“规定自定义颜色”-->右下角输入RGB值,查看对应的颜色与实际测试的颜色是否相符。实际测试结果是测得的物体颜色与实际颜色有些偏色,但并不影响区分出被测物体是哪种颜色的物体。
本实验例程源代码如下:
序号 | 内容 |
1 | TCS3200函数库 |
2 | 程序源文件 |
3 | TCS3200电路原理文件 |
4 | TCS3200芯片参考资料 |
5 | 色卡 |
【整体打包】-【U009】如何使用探索者传感器-TCS3200颜色识别-资料附件.zip | 216.86KB | 下载55次 | 下载 |
|