这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 作品提交:基于TAB5终端显示的FRDM-MCXW72蓝牙信道探测项目

共1条 1/1 1 跳转至页

作品提交:基于TAB5终端显示的FRDM-MCXW72蓝牙信道探测项目

助工
2026-10-22 22:37:49     打赏

【NXP FRDM-MCXW72蓝牙信道探测】历尽千辛万苦,终于跑通ChannelSounding(中文资料首例)  


https://forum.eepw.com.cn/thread/401940/1


接上篇,调通了FRDM-MCXW72蓝牙信道探测,就想着做个项目。

手头刚好有一块TAB5可以做终端显示和控制,这样就可以脱离电脑,测试信道探测成功了。


首先是对官方例程的改造,使得终端显示测距结果 + 蓝牙信号强度。


在frdmmcxw72_loc_reader_bm项目中,对loc_rader.c中的BleApp_PrintRADEResults函数加以改造

首先去除多余提示信息,仅显示距离值,

其次,增加RSSI信号强度显示,并且通过换算,将dBm转换为%,这样显示信号强度更直观


static bool_t BleApp_PrintRADEResults
(
    deviceId_t deviceId,
    localizationAlgoResult_t *pResult
)
{
    bool_t bUIUpdated = FALSE;
    if ((pResult->algorithm & eMciqAlgoEmbedRADE) != 0U)
    {
        int8_t rssiRemoteAverage = (int8_t)gRssiNotAvailable_c;
        if (pResult->rssiInfo.rssiRemoteNo != 0U)
        {
            int16_t rssiSum = 0;
            uint8_t rssiValid = 0U;
            for (uint8_t idx = 0U; idx < pResult->rssiInfo.rssiRemoteNo; idx++)
            {
                if ((idx < gCsMaxStepsPerProcedure_c) &&
                    (pResult->rssiInfo.aRssiRemote[idx] != (int8_t)gRssiNotAvailable_c))
                {
                    rssiSum += (int16_t)pResult->rssiInfo.aRssiRemote[idx];
                    rssiValid++;
                }
            }
            if (rssiValid != 0U)
            {
                rssiRemoteAverage = (int8_t)(rssiSum / (int16_t)rssiValid);
            }
        }

        if (pResult->radeError != 0U)
        {
            shell_write("] RADE Error: ");
            shell_writeDec(pResult->radeError);
            shell_write("!\r\n");
        }
        else if (pResult->resultRADE.dqiIntegerPart == 0U)
        {
            shell_write("] Low Quality data for RADE! Quality indicator is 0! \n\r");
        }
        else if (pResult->resultRADE.distanceIntegerPart > gMaxDistanceMeters_c)
        {
            shell_write("] Outlier RADE distance result - discarded. Check gMaxDistanceMeters_c value. \n\r");
        }
        else
        {
            /* 测距显示*/
            shell_writeDec(pResult->resultRADE.distanceIntegerPart);
            shell_write(".");
            for (uint8_t i = 0U; i < pResult->resultRADE.leadingZeroesDecimalPart; i++)
            {
                shell_write("0");
            }
            shell_writeDec(pResult->resultRADE.distanceDecimalPart);
            shell_write(" m  ");
            if(rssiRemoteAverage != (int8_t)gRssiNotAvailable_c)
            {
                uint8_t rssiPercent;

                // 计算信号百分比
                if (rssiRemoteAverage <= -100)
                {
                    rssiPercent = 0;
                }
                else
                {
                    rssiPercent = ( (int32_t)(rssiRemoteAverage + 100) * 72 ) / 44;
                    if(rssiPercent > 100)
                    {
                        rssiPercent = 100;
                    }
                }

                shell_writeDec(rssiPercent);
                shell_write("%%");
            }
            else
            {
                shell_write("N/A");
            }
            shell_write("\r\n");

            /* Flash LEDs if distance is less than 1m. */
            if ((mPreviousDistance <= (float)1) && (pResult->resultRADE.distanceInMeters <= (float)1))
            {
                LedStartFlashingAllLeds();
                bUIUpdated = TRUE;
            }
            else if ((mPreviousDistance > (float)1) && (pResult->resultRADE.distanceInMeters > (float)1))
            {
                LedStopFlashingAllLeds();
                Led1On();
                bUIUpdated = TRUE;
            }
            else
            {
                /* MISRA */
            }
            mPreviousDistance = pResult->resultRADE.distanceInMeters;
        }
    }
    return bUIUpdated;
}


Rader运行结果如下:

image.png


为了能连续测量,还需要输入loop指令,并输入tdm指令开启测距。

(loop tdm等shell指令都是例程中已预设好,可以直接利用的)


为了能脱离电脑实现测距并显示,我利用TAB5做为测距终端显示和控制设备。


image.png


硬件连接方面,5V-GND接上,TAB5的G38 RXD0 G37 TXD0分别与FRDM-MCXW72的J4-2(发送)、J4-1(接收)连接。

image.png


TAB5的界面和程序,使用非常简洁易用的uiflow2来实现。

左侧是画面设计,就一个简单的label0

右侧是图形化程序设计,在setup里对串口进行端口设置、初始化——》分别发送sb、loop、tdm指令开启循环测距。

在loop里将串口收到的内容显示在label0中。

image.png


运行结果如下:


962e0e05d06409747ee86186196242bf.jpg


视频效果如下,最远测试到5米,效果非常明显。










共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]