模塊資料
當(dāng)活動(dòng)開始的時(shí)候就看模塊的相關(guān)資料了,不過剛開始也沒太在意,所以從RD-03系列從頭開始看。不過后來才發(fā)現(xiàn)RD-03系列的產(chǎn)品有很多,本次活動(dòng)涉及的產(chǎn)品是RD-03E。所以我趕緊去看03E的相關(guān)產(chǎn)品。產(chǎn)品的資料有很多,不過感覺有些文件的內(nèi)容有些重復(fù),上位機(jī)軟件的各個(gè)參數(shù)可能是因?yàn)樯婕暗絻?nèi)部邏輯所以沒有詳細(xì)說明。模塊資料鏈接:Rd-03 系列模組 | 安信可科技 (ai-thinker.com)
模塊應(yīng)用場景
首先官方給的應(yīng)用場景是智能馬桶(手勢識別模式),這在上位機(jī)當(dāng)中也是有體現(xiàn)的,在此就不多說了。其次是本次活動(dòng)要求的是應(yīng)用在智能燈控上,有感應(yīng)開關(guān)燈、距離改變光照模式等。除了智能家居外,該模塊也可以應(yīng)用在智慧城市和工業(yè)控制領(lǐng)域等。
上位機(jī)使用體驗(yàn)
在拿到模塊后,想必大家都會先用官方的例程或軟件體驗(yàn)一下。我也簡單的用上位機(jī)連接模塊看了一下。首先安信可給的模塊是沒有損壞的,在質(zhì)量把控方面上安信可確實(shí)做得很好,至今也沒發(fā)現(xiàn)有質(zhì)量問題。
剛開始時(shí)數(shù)據(jù)波動(dòng)比較大,波動(dòng)范圍有20CM,也不知道大家是否會關(guān)注用戶手冊中寫的探測范圍0.3~2.2M。這可能是數(shù)據(jù)處理不是那么好吧。上位機(jī)軟件距離顯示曲線如下圖
但是我又用串口軟件進(jìn)行測試發(fā)現(xiàn)數(shù)據(jù)是50ms發(fā)一次,這讓我再次懷疑控制芯片處理數(shù)據(jù)的能力,不過看論壇上的文章和群消息后好像官方也在進(jìn)行調(diào)整。但是我覺得在官方給出新的驅(qū)動(dòng)前可能還有其他的解決方法。于是再次盯住這些雜亂無章的曲線,然后自己在前面不停的微動(dòng),這種場景是真的挺搞笑的,但是也沒辦法,研發(fā)就是這樣??戳艘欢螘r(shí)間后,發(fā)現(xiàn)問題可能出現(xiàn)在模塊發(fā)送數(shù)據(jù)的間隔時(shí)間非常短,50ms就發(fā)一次。我們一般是一個(gè)處理芯片會接很多的模塊,對某一個(gè)模塊接收的數(shù)據(jù)也不會這么頻繁,反正是我沒遇見過。所以就想著我1S接收一次是不是就會避免了。在上位機(jī)軟件中也無意發(fā)現(xiàn)有上報(bào)周期這一選項(xiàng),于是就把這個(gè)參數(shù)改成1000及1S后,發(fā)現(xiàn)數(shù)據(jù)波形確實(shí)變平了,但是好像數(shù)據(jù)波動(dòng)還是有,不過沒有之前那么大了。之前看距離數(shù)據(jù)時(shí)也是發(fā)現(xiàn)數(shù)一直在跳變,很難看清數(shù)值是多少。現(xiàn)在是可以看清的。
修改上報(bào)周期后的結(jié)果如下圖。
不過我對此還是不夠滿意,所以就把數(shù)值改成5000及5S,發(fā)現(xiàn)效果和1S的差不多。所以我在后續(xù)的程序是采用1S接收一次數(shù)據(jù)并進(jìn)行處理。也不知道大家是否注意到這一點(diǎn),在此將我注意到的點(diǎn)分享給大家。
除了注意到時(shí)間間隔外,還注意到一點(diǎn)是在采集到的數(shù)據(jù)波形有一段時(shí)間是0。對此我也開始不斷地測試在何種情況下會導(dǎo)致數(shù)據(jù)是0。后來發(fā)現(xiàn)有兩種情況會有這種現(xiàn)象。第一種是你超出他的探測范圍,這一點(diǎn)我確實(shí)沒有注意到,因?yàn)橹翱吹降牡姆秶?.3M~2.2M,也沒想到?jīng)]人的情況下探測距離是多少;第二種是當(dāng)探測的物體沒有晃動(dòng)或移動(dòng),簡單來說就是站在那里一動(dòng)不動(dòng)就會接收到距離是0的情況,這讓我猜到模塊的采集數(shù)據(jù)的方式應(yīng)該是檢測磁場的變化,也就是有物體切割磁感線,模塊就會有數(shù)據(jù),具體的就沒有深究了。
作品功能描述
因?yàn)橐笞髌肥桥c燈有關(guān)的,但是我身邊也沒有與燈相關(guān)的模塊。而是準(zhǔn)備了一個(gè)其他的模塊,這個(gè)在下次的文章中展現(xiàn)給大家。不過好在M61板子上有三個(gè)燈,所以就簡單的模擬上位機(jī)燈泡的顯示效果了。代碼實(shí)現(xiàn)起來非常簡單,就是1S采集一下模塊的數(shù)據(jù),然后判斷數(shù)據(jù)在哪個(gè)階段就亮哪個(gè)燈。為了拍攝效果,所以就沒把數(shù)據(jù)選的那么大。
首先是Rd-03E串口數(shù)據(jù)處理代碼,代碼如下
void RD03E_GetGestDataPoll()
{
unsigned char i = 0;
unsigned char DistTemp = 0;
bflb_uart_get(pstUARTHandle, au8UartReceData, RD03E_GEST_DATA_MAX_LEN);
printf("RD03E Receive Data is:");
for (i = 0; i < RD03E_GEST_DATA_MAX_LEN; i++)
{
printf("%X ",au8UartReceData[i]);
}
printf("rn");
for (i = 0; i < RD03E_GEST_DATA_MAX_LEN; i++)
{
if (RD03E_GEST_DATA_HEAD_MARK == au8UartReceData[i])
{
/* 找到數(shù)據(jù)幀開頭標(biāo)志0xAA */
break;
}
}
if ((i < (RD03E_GEST_DATA_MAX_LEN - RD03E_GEST_DATA_LEN -1))
&& (RD03E_GEST_DATA_TAIL_MARK == au8UartReceData[i + RD03E_GEST_DATA_LEN + 1]))
{
/* 找到數(shù)據(jù)幀 */
DistTemp = au8UartReceData[i + 1] | ((unsigned int)au8UartReceData[i + 2] << 8);
stGestData.GestDist = DistTemp;
stGestData.Gest = au8UartReceData[i + RD03E_GEST_DATA_LEN];
}
}
串口一次性接收10個(gè)字節(jié)的數(shù)據(jù),測試發(fā)現(xiàn)若接收5個(gè)字節(jié)的數(shù)據(jù)的話,后面會出現(xiàn)解析不到數(shù)據(jù)幀的開頭。這也是為了后面1S采集一次數(shù)據(jù)的適配。接收到數(shù)據(jù)后會先找?guī)_頭標(biāo)志0xAA,找到后便判斷后面的第4個(gè)字節(jié)是否為幀結(jié)束標(biāo)志0x55。若是則將中間的3個(gè)數(shù)據(jù)解析出來,分別為手勢識別模式中的距離和手勢數(shù)據(jù)。這樣可以防止數(shù)據(jù)解析有誤。
主函數(shù)主要是獲取串口數(shù)據(jù),然后進(jìn)行處理,邏輯比較簡單,所以不再詳細(xì)講解。代碼如下
int main(void)
{
GestData *RD03EGestDataTemp = {0};
board_init(); /* 板卡初始化 */
LED_Init(); /* 板卡LED引腳I/O初始化 */
UART_Init(); /* RD03E串口初始化 */
while(1)
{
/* 獲取RD03E數(shù)據(jù) */
RD03EGestDataTemp = RD03E_ReadGestData();
if (RD03EGestDataTemp->Gest != RD03EGestData.Gest)
{
RD03EGestData.Gest = RD03EGestDataTemp->Gest;
/* 檢測到有手勢變化 */
if (RD03EGestData.Gest)
{
if (LEDSwitch)
{
LEDSwitch = 0;
/* 關(guān)閉全部燈 */
LED_SetSta(LED_STA_OFF, GREE_LED_PIN);
LED_SetSta(LED_STA_OFF, RED_LED_PIN);
LED_SetSta(LED_STA_OFF, BLUE_LED_PIN);
}
else
{
LEDSwitch = 1;
}
}
}
if (LEDSwitch == 1)
{
/* 當(dāng)燈是開的狀態(tài)再檢測距離數(shù)據(jù)是否發(fā)生變化 */
if (RD03EGestDataTemp->GestDist != RD03EGestData.GestDist)
{
RD03EGestData.GestDist = RD03EGestDataTemp->GestDist;
/* 先關(guān)全部的燈,再亮其中的一個(gè) */
LED_SetSta(LED_STA_OFF, GREE_LED_PIN);
LED_SetSta(LED_STA_OFF, RED_LED_PIN);
LED_SetSta(LED_STA_OFF, BLUE_LED_PIN);
if (RD03EGestData.GestDist < 50)
{
printf("Dist:%d Green LED ONrn",RD03EGestData.GestDist);
LED_SetSta(LED_STA_ON, GREE_LED_PIN);
}
else if (RD03EGestData.GestDist < 100)
{
printf("Dist:%d Red LED ONrn",RD03EGestData.GestDist);
LED_SetSta(LED_STA_ON, RED_LED_PIN);
}
else
{
printf("Dist:%d Blue LED ONrn",RD03EGestData.GestDist);
LED_SetSta(LED_STA_ON, BLUE_LED_PIN);
}
}
}
/* RD03E輪詢不斷更新數(shù)據(jù) */
RD03E_GetGestDataPoll();
/* 設(shè)置1秒已更新,否則燈跳變比較大 */
bflb_mtimer_delay_ms(1000);
}
}
作品展示及工程文件請點(diǎn)擊原貼查看:https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44476&highlight=%E3%80%90%E9%9B%B7%E8%BE%BE%E7%81%AF%E6%8E%A7%E3%80%91%E5%AE%89%E4%BF%A1%E5%8F%AF%2BRd-03E%2B%2B%E7%81%AF%2B%2B%2BAi-M61&_dsign=31a6d697
作品展示
審核編輯 黃宇
-
雷達(dá)
+關(guān)注
關(guān)注
50文章
2951瀏覽量
117742 -
安信可
+關(guān)注
關(guān)注
0文章
154瀏覽量
4017
發(fā)布評論請先 登錄
相關(guān)推薦
評論