7626| 1
|
[讨论] 【教程】如何利用Arduino和激光雷达进行人数及身高统计 |
1.方案说明 本方案为利用北醒公司产品TFmini-Plus 和Arduino-UNO 板结合开发出的小设备。 其作用为:统计人数量以及相应目标身高高度。 2.试验设备及接线 Benewake TFmini-Plus 标版 TFmini-Plus 详细参数见TFmini-Plus 使用说明。 Arduino-UNO 板 关于Arduino 的详细介绍和学习请参考以下两个网站: 中文社区:http://www.arduino.cn/ 英文官网:https://www.arduino.cc/ 电脑 电脑作为程序编写上传和数据显示功能。数据显示功能后期可进行升级优化,例如增加显示屏显示当前人流 量和身高数据,用扬声器语音播报“欢迎光临”等问候语。 杜邦线——用于Plus 与UNO 板连接(Plus 端子可拆) USB 方口数据连接线——用于UNO 板与电脑连接 2.2接线 TFmini Plus 产品线序定义为:红色+5V,黑色GND,绿色TX,白色RX;TFmini-Plus 供电电压为5V,所以 直接连接Arduino 板的5V 和GND 即可,其他雷达请查阅产品规格书,确保供电正常; 串口通信连接需要注意,对于Arduino UNO 板雷达的TX 端接板子的pin 2 口(软串口Serial1 的RX),雷 达的RX 端接板子的pin 3 口(软串口Serial1 的TX),这个跟后文中的程序编写有关。 3.人流身高测量原理 雷达启动后,设置安装高度、身高限度、下限值。 当人进入探测区域时,数据会出现上升,输出人数,每出现此情况,人数加1,输出人数。 当人处于探测区域时,数据会在身高限定以上波动,此时比较赋值Height,Height 为人在探测区域内数据 波动的最大值。 当人走出探测区域时,数据会出现下降,输出Height。 4.程序框图 5.程序编写 该例程功能的实现至少需要两个串口,一个接受雷达的数据,另一个用于将数据输出到电脑端显示出来。可以复 制以下代码粘贴到IDE 程序编辑窗口,需要附件的可以联系: bw@benewake.com 也可直接打开相应附件文件。 [mw_shl_code=cpp,false]#include<SoftwareSerial.h>//软串口头文件 SoftwareSerialSerial1(2,3); //定义软串口名称为Serial1,并把pin2 定为RX,pin3 定为TX /*对于有多个串口的arduino 板如DUE 板,注释掉上面两段代码,直接使用Serial1 串口*/ int dist;//雷达实测距离值 int strength;//雷达信号强度,强度在100 以下数据不可信 int IH=230;//雷达安装高度(需设置),需要根据实际黑色物体进行校正 int H;//身高值 int h=0;//上一次身高值 int check;//校验数值存放 int i; int Number=0;//人数 int Height=0;//身高高度最大值 int up=50;//身高限定(需设置),物体身高在此值以上才有效 int down=40;//下限值(需设置),高度在下限值以下突破身高限度才会计数,防止高度处在恰好身高限度时导 致数据波动,产生错误数据 int uart[9];//存放雷达测量的数据 const intHEADER=0x59;//数据包帧头 void setup() { Serial.begin(115200);//设置arduino 与电脑连接串口的波特率 Serial1.begin(115200);//设置雷达与arduino 连接串口的波特率 } void loop() { if(Serial1.available())//查看串口是否有数据输入 { if(Serial1.read()==HEADER)//判断数据包帧头0x59 { uart[0]=HEADER; if(Serial1.read()==HEADER)//判断数据包帧头0x59 { uart[1]=HEADER; for(i=2;i<9;i++)//存储数据到数组 { uart=Serial1.read(); } check=uart[0]+uart[1]+uart[2]+uart[3]+uart[4]+uart[5]+uart[6]+uart[7]; if(uart[8]==(check&0xff))//按照协议对收到的数据进行校验 { dist=uart[2]+uart[3]*256;//计算距离值 strength=uart[4]+uart[5]*256;//计算信号强度值 H=IH-dist;//计算身高值 /*测量人数*/ /*原理:当数据从下限值突破身高限定值则人数加1*/ if(H>=up&h<down)//当人进入测量区域,人数加一 { Number=Number+1; h=H; Height=H; Serial.print("Number= "); Serial.print(Number);//输出数量值 Serial.print('\t'); } if(H>=up&h>=down)//当人处于测量区域内,通过比较得出此期间的最大值 { if(Height<H) { Height=H; } } if(H<down&h>=up)//当人走出测量区域,输出身高最大值,同时将最大值重新置零 { Serial.print("Height= "); Serial.print(Height);//输出身高值 Serial.print('\n'); h=H; Height=0; } //Serial.print("H = "); // Serial.print(H);//输出身高值 //Serial.print('\t'); //Serial.print("dist = "); //Serial.print(dist);//输出雷达测试距离值 //Serial.print('\t'); //Serial.print("strength = "); //Serial.print(strength);//输出信号强度值 //Serial.print('\n');[/mw_shl_code] 6.数据查看 7.注意事项 安装高度需要根据实际黑色物体进行校正,因为不同颜色物体反射率不同雷达接收的信号不同。 当多人并走时,雷达光斑只能打到一个物体,只能计数加1,适用单人出入的场景。 如果光斑未完全打到头顶,身高数据会出错。考虑人行走时身高会浮动,尽量让脚落在光斑左右,探测到最 高值,减小误差。 缓冲区域为“身高限定-下限值”,避免探测高度恰好在“身高限定”的物体时,数据波动产生重复人数加1 的情况。 更多产品信息可咨询北醒官网 |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed