admin 管理员组

文章数量: 1086019

用TFmini

用TFmini-Plus实现体前屈自动测量

本系统利用TFmini Plus、Arduino-UNO板、0.91寸OLED显示模块、BY8301-16P语音模块、喇叭以及传统的坐位体前屈测量仪结合设计开发的自动测量装置。

系统作用:实现体前屈自动测量,并显示、播报测量结果,减少人为读数过程,使体育测试过程更智能化、人性化。

本文结构

  • 试验设备及接线
  • 体前屈自动测量原理
  • 系统工作和数据查看
  • 注意事项
  • 附加代码

试验设备

  • Benewake TFmini-Plus 标版
  • Arduino-UNO板
  • 0.91寸OLED液晶屏
    规格:0.91寸OLED屏(如图2.3所示),128*32点阵,IIC控制接口,兼容3.3-5V。
    作用:用来显示测量结果。

  • BY8301-16P语音模块
    规格:语音模块如图2.4所示,其工作电压为DC 3.6-5V,支持MP3/WAV格式,支持UART串口通信控制,自带3W功放/可外接功放。
    作用:用来控制喇叭,播报提示信息和测量结果。

  • BY-90-1W 无源喇叭
    规格:喇叭(如图2.5所示)功率为8Ω1W。
    作用:播报提示信息和测量结果。

  • 电脑
    作为该系统的上位机,用来编写并上传程序到UNO板。

  • 传统坐位体前屈测量仪

  • 连接线
    杜邦线——用于Plus与UNO板连接;
    USB方口数据线——用于UNO板与电脑连接以及供电。

接线

  • TFmini Plus 线序:
    TFmini Plus供电电压为5V,直接连接Arduino板的5V和GND,其他雷达需查阅产品规格书,确保供电正常。

  • 对于Arduino UNO板,串口通信连接需要注意:

(1)TFmini Plus的TX端接板子的pin 4口(软串口Serial2的RX),雷达的RX端接板子的pin 5口(软串口Serial2的TX),
(2)语音模块接UNO板的5V和GND,TX端接板子的pin 2口(软串口Serial1的RX),雷达的RX端接板子的pin 3口(软串口Serial1的TX),软串口1定义在voice库中,语音模块只能按照顺序接UNO板的2、3引脚,否则必须修改voice库文件(支持设置音量0-20);

  • 0.91寸OLED显示屏连接5V(或3.3V)和GND供电, SCL和SDA接UNO板的SCL和SDA;

体前屈自动测量原理


  1. 首先,我们包含voice和oled库文件,定义变量,对串口、语音模块和OLED显示屏进行初始化;读取雷达数据,对系统进行标定,获得start=dist1,zero=dist0;
  2. 然后,读取数据,判断位置初始化状态init_stat和雷达数据与start的关系,如果不满足要求,获取数据再进行判断,如果满足要求(!init_stat(没有初始化)
    && D==start(雷达数据与标定的初始位置相等)),语音模块播报“ready” ,开始测量;
  3. 测量过程中,继续判断位置初始化状态init_stat和雷达数据与start的关系,如果不满足要求,获取数据再进行判断,如果满足要求(init_stat(位置初始完毕)
    && D!=start(挡板离开初始位置));时刻检测挡板是否移动,如果挡板静止,大约经历2.3s,系统测距稳定,播报和显示测量结果;
  4. 最后,判断是否需要进行下一次测试,如果不需要,断电,结束测试。

系统工作和数据查看

  1. 系统安装完成后,供电,上传程序,校准起始点和0位置;
  2. 挡板置于起始点,等语音模块播报“ready”后,开始测量;
  3. 挡板离开起始点后,不能停顿过长时间,一般在2.3s以内,挡板静止后,稳定测量后,播报并在OLED中显示测量结果。

数据查看



注意事项

  • TFmini Plus的测量分辨率为5mm,如果测量精度为mm,会有较大误差,所以只测量到cm,后面可以用精度更高的产品,实现mm级测量。
  • 体前屈自动测量仪在测量过程中,不会播报,但是,不能停顿过长时间(小于2.3s)。
  • 该系统为一次一测,测量完毕后,需要重新归位到起始点。

功能实现代码

##include "voice.h"
#include "oled.h"
#include<SoftwareSerial.h>//软串口头文件
SoftwareSerial Serial2(4,5); //定义软串口名称为Serial2,并把pin2定为RX,pin3定为TX
/*对于有多个串口的arduino板如DUE板,注释掉上面两段代码,直接使用Serial1串口*/
/*雷达基本数据*/
int check;//校验数值存放
int uart[9];//存放雷达测量的数据
int k;
const int HEADER=0x59;//数据包帧头
/*体前屈自动测量数据*/
int D;//雷达实测距离值
int d=0;//上一个距离值
int result=0;
const int zero=40;//标定的0点值,安装完成后需要进行标定设置
int VAR[23]={0};
int var;
int num=0;
const int start=54;//标定的起点值,安装完成后需要进行标定设置
int CHA[15]={0};
int cha=0;
int count=0;
boolean init_stat=false;//判断是否进行位置初始化void setup() 
{Serial.begin(115200);//设置arduino uno与电脑连接串口的波特率Serial2.begin(115200);oled_begin();//OLED显示模块初始化voice_begin();//语音模块初始化voice_setvolume(14);//设置喇叭音量
}
void loop() 
{Serial2.listen();if (Serial2.available())//查看串口是否有数据输入{if(Serial2.read()==HEADER)//判断数据包帧头0x59{uart[0]=HEADER;if(Serial2.read()==HEADER)//判断数据包帧头0x59{uart[1]=HEADER;for(k=2;k<9;k++)//存储数据到数组{uart[k]=Serial2.read();} check=uart[0]+uart[1]+uart[2]+uart[3]+uart[4]+uart[5]+uart[6]+uart[7];if(uart[8]==(check&0xff))//按照协议对收到的数据进行校验{D=uart[2]+uart[3]*256;//计算距离值if(!init_stat && D==start){cha=D-start;for(k=15;k>=1;k--){CHA[k]=CHA[k-1];}CHA[0] = cha;for(k=0;k<15;k++){if(CHA[k]==0){count++;}        } oled_measuring();if(count>=15){voice_ready();init_stat=true;  }} if(D!=0 && D!=start && init_stat){var=abs(D-d);for(k=23;k>=1;k--){    VAR[k]=VAR[k-1];}VAR[0] = var;for(k=0;k<23;k++){if(VAR[k]==0){num++;      } } if(num>=23){result=zero-D;oled_result(result);voice_num(result);Serial2.listen(); init_stat=false;}d=D;num=0;}}}}}
}

北醒(北京)光子科技有限公司

本文标签: 用TFmini