模塊資料
當活動開始的時候就看模塊的相關資料了,不過剛開始也沒太在意,所以從RD-03系列從頭開始看。不過后來才發現RD-03系列的產品有很多,本次活動涉及的產品是RD-03E。所以我趕緊去看03E的相關產品。產品的資料有很多,不過感覺有些文件的內容有些重復,上位機軟件的各個參數可能是因為涉及到內部邏輯所以沒有詳細說明。模塊資料鏈接:Rd-03 系列模組 | 安信可科技 (ai-thinker.com)
模塊應用場景
首先官方給的應用場景是智能馬桶(手勢識別模式),這在上位機當中也是有體現的,在此就不多說了。其次是本次活動要求的是應用在智能燈控上,有感應開關燈、距離改變光照模式等。除了智能家居外,該模塊也可以應用在智慧城市和工業控制領域等。
上位機使用體驗
在拿到模塊后,想必大家都會先用官方的例程或軟件體驗一下。我也簡單的用上位機連接模塊看了一下。首先安信可給的模塊是沒有損壞的,在質量把控方面上安信可確實做得很好,至今也沒發現有質量問題。
剛開始時數據波動比較大,波動范圍有20CM,也不知道大家是否會關注用戶手冊中寫的探測范圍0.3~2.2M。這可能是數據處理不是那么好吧。上位機軟件距離顯示曲線如下圖
但是我又用串口軟件進行測試發現數據是50ms發一次,這讓我再次懷疑控制芯片處理數據的能力,不過看論壇上的文章和群消息后好像官方也在進行調整。但是我覺得在官方給出新的驅動前可能還有其他的解決方法。于是再次盯住這些雜亂無章的曲線,然后自己在前面不停的微動,這種場景是真的挺搞笑的,但是也沒辦法,研發就是這樣??戳艘欢螘r間后,發現問題可能出現在模塊發送數據的間隔時間非常短,50ms就發一次。我們一般是一個處理芯片會接很多的模塊,對某一個模塊接收的數據也不會這么頻繁,反正是我沒遇見過。所以就想著我1S接收一次是不是就會避免了。在上位機軟件中也無意發現有上報周期這一選項,于是就把這個參數改成1000及1S后,發現數據波形確實變平了,但是好像數據波動還是有,不過沒有之前那么大了。之前看距離數據時也是發現數一直在跳變,很難看清數值是多少?,F在是可以看清的。
修改上報周期后的結果如下圖。
不過我對此還是不夠滿意,所以就把數值改成5000及5S,發現效果和1S的差不多。所以我在后續的程序是采用1S接收一次數據并進行處理。也不知道大家是否注意到這一點,在此將我注意到的點分享給大家。
除了注意到時間間隔外,還注意到一點是在采集到的數據波形有一段時間是0。對此我也開始不斷地測試在何種情況下會導致數據是0。后來發現有兩種情況會有這種現象。第一種是你超出他的探測范圍,這一點我確實沒有注意到,因為之前看到的的范圍是0.3M~2.2M,也沒想到沒人的情況下探測距離是多少;第二種是當探測的物體沒有晃動或移動,簡單來說就是站在那里一動不動就會接收到距離是0的情況,這讓我猜到模塊的采集數據的方式應該是檢測磁場的變化,也就是有物體切割磁感線,模塊就會有數據,具體的就沒有深究了。
作品功能描述
因為要求作品是與燈有關的,但是我身邊也沒有與燈相關的模塊。而是準備了一個其他的模塊,這個在下次的文章中展現給大家。不過好在M61板子上有三個燈,所以就簡單的模擬上位機燈泡的顯示效果了。代碼實現起來非常簡單,就是1S采集一下模塊的數據,然后判斷數據在哪個階段就亮哪個燈。為了拍攝效果,所以就沒把數據選的那么大。
首先是Rd-03E串口數據處理代碼,代碼如下
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])
{
/* 找到數據幀開頭標志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]))
{
/* 找到數據幀 */
DistTemp = au8UartReceData[i + 1] | ((unsigned int)au8UartReceData[i + 2] << 8);
stGestData.GestDist = DistTemp;
stGestData.Gest = au8UartReceData[i + RD03E_GEST_DATA_LEN];
}
}
串口一次性接收10個字節的數據,測試發現若接收5個字節的數據的話,后面會出現解析不到數據幀的開頭。這也是為了后面1S采集一次數據的適配。接收到數據后會先找幀開頭標志0xAA,找到后便判斷后面的第4個字節是否為幀結束標志0x55。若是則將中間的3個數據解析出來,分別為手勢識別模式中的距離和手勢數據。這樣可以防止數據解析有誤。
主函數主要是獲取串口數據,然后進行處理,邏輯比較簡單,所以不再詳細講解。代碼如下
int main(void)
{
GestData *RD03EGestDataTemp = {0};
board_init(); /* 板卡初始化 */
LED_Init(); /* 板卡LED引腳I/O初始化 */
UART_Init(); /* RD03E串口初始化 */
while(1)
{
/* 獲取RD03E數據 */
RD03EGestDataTemp = RD03E_ReadGestData();
if (RD03EGestDataTemp->Gest != RD03EGestData.Gest)
{
RD03EGestData.Gest = RD03EGestDataTemp->Gest;
/* 檢測到有手勢變化 */
if (RD03EGestData.Gest)
{
if (LEDSwitch)
{
LEDSwitch = 0;
/* 關閉全部燈 */
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)
{
/* 當燈是開的狀態再檢測距離數據是否發生變化 */
if (RD03EGestDataTemp->GestDist != RD03EGestData.GestDist)
{
RD03EGestData.GestDist = RD03EGestDataTemp->GestDist;
/* 先關全部的燈,再亮其中的一個 */
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輪詢不斷更新數據 */
RD03E_GetGestDataPoll();
/* 設置1秒已更新,否則燈跳變比較大 */
bflb_mtimer_delay_ms(1000);
}
}
作品展示及工程文件請點擊原貼查看: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
作品展示
審核編輯 黃宇
-
雷達
+關注
關注
50文章
2966瀏覽量
118014 -
安信可
+關注
關注
0文章
159瀏覽量
4046
發布評論請先 登錄
相關推薦
評論