ROS交流群
ROS Group
产品服务
Product Service
开源代码库
Github
官网
Official website
技术交流
Technological exchanges
激光雷达
LIDAR
ROS教程
ROS Tourials
深度学习
Deep Learning
机器视觉
Computer Vision

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



    1.       体前屈自动测量仪
      

    1.1 应用背景
    坐位体前屈(如图1.1所示)是一种体育锻炼项目,也是中国大中小学体质健康测试项目,它的测试目的是测量在静止状态下的躯干、腰、髋等关节可能达到的活动幅度,主要反映这些部位的关节、韧带和肌肉的伸展性和弹性及身体柔韧素质的发展水平,现坐位体前屈是中国体育中考中的必考项目之一。
    2a62c296-1a88-462e-a6ed-f7745a33f299-image.png
    图1.1 坐位体前屈
    1.2 应用简介
    本系统为利用北醒公司TFmini Plus、Arduino-UNO板、0.91寸OLED显示模块、BY8301-16P语音模块、喇叭以及传统的坐位体前屈测量仪结合设计开发的自动测量装置。
    系统作用:实现体前屈自动测量,并显示、播报测量结果,减少人为读数过程,使体育测试过程更智能化、人性化。
    2. 试验设备及接线
    2.1 实验设备
    l Benewake TFmini Plus标版
    f69a5b9c-b245-43cb-93b2-be4108f2d727-image.png
    图2.1 TFmini Plus
    TFmini Plus(如图2.1所示),详细参数见TFmini Plus使用说明。
    l Arduino-UNO板
    a857fc74-0c4d-4f54-82b4-4d90eca95977-image.png
    图2.2 Arduino UNO
    l 0.91寸OLED液晶屏
    09fb98a3-ded5-4214-bb2a-fbd6ca9ad236-image.png
    图2.3 OLED显示屏
    规格:0.91寸OLED屏(如图2.3所示),128*32点阵,IIC控制接口,兼容3.3-5V。
    作用:用来显示测量结果。
    l BY8301-16P语音模块
    b1f50374-40b2-45e5-a8d3-7c307a3c22c3-image.png
    图2.4 BY8301-16P语音模块
    规格:语音模块如图2.4所示,其工作电压为DC 3.6-5V,支持MP3/WAV格式,支持UART串口通信控制,自带3W功放/可外接功放。
    作用:用来控制喇叭,播报提示信息和测量结果。
    l BY-90-1W 无源喇叭
    51980e4c-ff5d-423f-b080-4b1bd8ab66e5-image.png
    图2.5 无源喇叭
    规格:喇叭(如图2.5所示)功率为8Ω1W。
    作用:播报提示信息和测量结果。
    l 电脑
    609994fb-0777-4d88-8c7b-a48152b895dc-image.png
    图2.6 电脑
    如图2.6所示,作为该系统的上位机,用来编写并上传程序到UNO板。
    l 传统坐位体前屈测量仪
    ea11e23f-6120-4def-add7-25eb981cbaff-image.png
    图2.7 体前屈测试仪
    l 连接线
    055d4db8-3628-4a9b-9230-04f1703a83e3-image.png
    图2.8 连接线

    杜邦线——用于Plus与UNO板连接;
    USB方口数据线——用于UNO板与电脑连接以及供电。
    2.2 接线
    0b22ad21-9b2e-4f9b-8d87-3c590dc474f2-image.png
    图2.9 系统接线图
    l TFmini Plus 线序:
    01bbd060-5957-4470-af78-1503dd9a9549-image.png
    图2.10 TFmini Plus线序
    2daaf77f-78e1-4d90-a4d8-0b2ada47aa37-image.png
    TFminiPlus供电电压为5V,直接连接Arduino板的5V和GND,其他雷达需查阅产品规格书,确保供电正常;
    l 对于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);
    l 0.91寸OLED显示屏连接5V(或3.3V)和GND供电, SCL和SDA接UNO板的SCL和SDA;

    1.         体前屈自动测量原理
      

    ba9a164a-76c8-46ac-965f-7965cd659d3c-image.png
    图3.1 体前屈自动测量系统示意图
    fac9cd0a-acb7-419e-9f5a-e34436f3e353-image.png
    图3.2 体前屈自动测量工作原理流程图
    如图3.1和图3.2所示,为体前屈自动测量的系统示意图和工作原理流程图。
    首先,我们包含voice和oled库文件,定义变量,对串口、语音模块和OLED显示屏进行初始化;读取雷达数据,对系统进行标定,获得start=dist1,zero=dist0;
    然后,读取数据,判断位置初始化状态init_stat和雷达数据与start的关系,如果不满足要求,获取数据再进行判断,如果满足要求(!init_stat(没有初始化) && D==start(雷达数据与标定的初始位置相等)),语音模块播报“ready” ,开始测量;
    测量过程中,继续判断位置初始化状态init_stat和雷达数据与start的关系,如果不满足要求,获取数据再进行判断,如果满足要求(init_stat(位置初始完毕) && D!=start(挡板离开初始位置));时刻检测挡板是否移动,如果挡板静止,大约经历2.3s,系统测距稳定,播报和显示测量结果;
    最后,判断是否需要进行下一次测试,如果不需要,断电,结束测试。

    1.         系统程序编写
      

    该例程需要添加OLED的库和自定义的库voice和oled。
    file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image035.jpg
    ##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);//设置arduinouno与电脑连接串口的波特率
    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;
    }
    }
    }
    }
    }
    }
    5. 系统工作流程和数据查看
    5.1 工作流程图
    9ac2285a-b450-4241-8f35-dfa2b6a93815-image.png
    图5.1 系统工作流程图
    l 系统安装完成后,供电,上传程序,校准起始点和0位置;
    l 挡板置于起始点,等语音模块播报“ready”后,开始测量;
    l 挡板离开起始点后,不能停顿过长时间,一般在2.3s以内,挡板静止后,稳定测量后,播报并在OLED中显示测量结果。
    5.2 数据查看
    63d40a3f-3ecc-4298-b53d-551eede37a3a-image.png
    图5.2 工作数据
    6. 注意事项
    l TFmini Plus的测量分辨率为5mm,如果测量精度为mm,会有较大误差,所以只测量到cm,后面可以用精度更高的产品,实现mm级测量。
    l 体前屈自动测量仪在测量过程中,不会播报,但是,不能停顿过长时间(小于2.3s)。
    l 该系统为一次一测,测量完毕后,需要重新归位到起始点。


Log in to reply