原文鏈接:[https://www.yourcee.com/newsinfo/2925937.html]
傳感器簡介
PAJ-7620U2是由原相科技公司開發的一款手勢識別芯片, 內集成了光學數組式傳感器單元,可以快速準確的對輸入信號進行感應和輸出處理。內置光源和環境光抑制濾波器,能在黑暗或低光環境下工作。它支持上、下、左、右、前、后、順時針旋轉、逆時針旋轉和揮動的手勢動作識別,以及支持物體接近檢測等功能。可大致檢測物體體積大小和亮度。使用IIC通信接口可達400KHz通信速率。
傳感器內部自帶 LED 驅動器,傳感器感應陣列、目標信息提取陣列和手勢識別陣列。傳感器工作時通過內部 LED 驅動器,驅動紅外 LED 向外發射紅外線信號,當傳感器陣列在有效的距離中探測到物體時,目標信息提取陣列會對探測目標進行特征原始數據的獲取,獲取的數據被保存在寄存器中,同時手勢識別陣列會對原始數據進行識別處理,最后將手勢結果存到寄存器中,用戶可根據 I2C 接口對原始數據和手勢識別的結果進行讀取。
模塊原理圖

VIN供電輸入3.3-5V,GND供電負極,SDA數據線,SCL時鐘線,INT中斷輸出
手勢方向定義
STM32F407ZGT6開發板與傳感器連接

代碼片
手勢傳感器獲取感應信息,將結果通過開發版 usart1 串口輸給串口調試助手程序顯示出來。
在 main 函數中,首先對 USART 串口與 KEY 按鍵進行初始化配置。然后對傳感器paj7620u2 進行初始化配置。當對傳感器初始化成功后則退出 while 循環,進入第 21 行paj7620u2 傳感器功能測試階段。
int main(void)
{
/*初始化USART 配置模式為 115200 8-N-1,中斷接收*/
Debug_USART_Config();
EXTI_Key_Config();
printf(" 歡迎使用野火開發板rn");
printf(" 手勢識別傳感器實驗rn");
while(!paj7620u2_init()) //PAJ7620U2傳感器初始化
{
printf("PAJ7620U2 初始化失敗!!!rn");
delay_ms(600);
}
printf("PAJ7620U2 初始化成功rn");
while(1)
{
paj7620u2_sensor_test();//PAJ7620U2傳感器測試
}
}
在 test 函數中,第 12 行使用 scanf 函數,使開發板獲取來自串口調試助手發出的控制指令。當開發板接收到的指令字符為“1”時,開發板控制傳感器進入手勢識別工作模式;當接收到的指令字符為“2”時,開發板控制傳感器進入接近檢測工作模式;當接收的字符既不是“1”也不是“2”時,則打印提示用戶輸入合法指令。
/**
* @brief PAJ7620U2傳感器測試
* @param 無
* @retval 無
*/
void paj7620u2_sensor_test(void)
{
uint32_t ch;
Show_Mode_Message();//顯示普通測量模式UI
while(1)
{
scanf("%d",&ch);
printf("接收到字符:%drn",ch);
switch(ch)
{
case 1: Gesrure_test(); break;//手勢檢測模式
case 2: Ps_test(); break;//接近檢測模式
default: printf("請輸入合法指令!rn"); break;
}
Show_Mode_Message();
}
}
手勢識別傳感器可以工作在手勢識別與接近檢測 2 種模式狀態下。為了進行工作模式
的切換,我們采用了 KEY 按鈕外部中端的方式。
- KEY 外部中斷
當我們想退出當前的工作模式時,可通過按住 key1 按鈕,激發產生 EXTI 中斷響應。在 IRQHandler 中斷處理函數中,(第 9 行)當接受到中斷信號時,變量 flag 賦值為 1。
中斷代碼如下
void KEY1_IRQHandler(void)
{
//確保是否產生了EXTI Line中斷
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
flag=1;
//清除中斷標志位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
}
- 手勢識別工作模式
在 Gesrure_test()函數中,首先對 PAJ7620U2 手勢識別檢測進行初始化,(第 14 行代碼)配置其 gesture_arry 數組的參數值。該數組有使能 9 個手勢識別的中斷標志輸出的配置,初始化完畢后,在 while 循環中一直讀取手勢中斷標志寄存器(第 26 行代碼),當識別到相應的手勢,手勢標志會置 1,讀取寄存器標志會自動清 0。根據手勢的標志手勢結果將被打印到串口上。當按下 KEY 按鍵,在中斷處理函數中標志變量 flag 被賦值 1(第 20 行代碼),此時關閉 9 個手勢識別的檢測輸出,退出當前的手勢識別測試模式。
/**
* @brief 手勢識別測試
* @param 無
* @retval 無
*/
void Gesrure_test(void)
{
uint8_t status,i;
uint8_t data[2]={0x00};
uint16_t gesture_data;
paj7620u2_selectBank(BANK0);//進入BANK0
for(i=0;i< GESTURE_SIZE;i++)
{
GS_Write_Byte(gesture_arry[i][0],gesture_arry[i][1]);//手勢識別模式初始化
}
paj7620u2_selectBank(BANK0);//切換回BANK0
printf("按KEY1鍵退出當前模式rn");
while(1)
{
if(flag)
{
flag=0;
GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);//關閉手勢識別中斷輸出
GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00);
break;
}
status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//讀取手勢狀態
if(!status)
{
gesture_data =(uint16_t)data[1]< 8 | data[0];
if(gesture_data)
{
switch(gesture_data)
{
case GES_UP:
printf("Uprn"); break; //向上
case GES_DOWM:
printf("Dowmrn"); break; //向下
case GES_LEFT:
printf("Leftrn"); break; //向左
case GES_RIGHT:
printf("Rightrn"); break; //向右
case GES_FORWARD:
printf("Forwardrn"); break; //向前
case GES_BACKWARD:
printf("Backwardrn"); break; //向后
case GES_CLOCKWISE:
printf("Clockwisern"); break; //順時針
case GES_COUNT_CLOCKWISE:
printf("AntiClockwisern"); break; //逆時針
case GES_WAVE:
printf("Wavern"); break; //揮動
default: break;
}
}
}
}
}
- 接近檢測測試
Ps_test()函數實現接近檢測,獲取接近物體的體積大小和亮度的數據。首先對PAJ7620U2 接近檢測進行初始化,配置其 proximity_arry 的數組參數值(第 16 行代碼),初始化完成后,在 while(1)循環中,讀取獲取體積大小和亮度的寄存器,并將讀取結果打印到串口上。當按下 KEY 按鍵,在中斷處理函數中標志變量 flag 被賦值 1(第 23 行代碼),退出當前的接近檢測測試模式。
/**
* @brief 接近檢測測試
* @param 無
* @retval 無
*/
void Ps_test(void)
{
uint8_t i;
uint8_t data[2]={0x00};
uint8_t obj_brightness=0;
uint16_t obj_size=0;
paj7620u2_selectBank(BANK0);//進入BANK0
for(i=0;i< PROXIM_SIZE;i++)
{
GS_Write_Byte(proximity_arry[i][0],proximity_arry[i][1]);//接近檢測模式初始化
}
paj7620u2_selectBank(BANK0);//切換回BANK0
printf("按KEY1鍵退出當前模式rn");
while(1)
{
if(flag)
{
flag=0;
break;
}
obj_brightness = GS_Read_Byte(PAJ_GET_OBJECT_BRIGHTNESS);//讀取物體亮度
data[0] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_1);//讀取物體大小
data[1] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_2);
obj_size = ((uint16_t)data[1] & 0x0f)< 8 | data[0];
printf("obj_brightness: %drn",obj_brightness);
printf("obj_size: %drn",obj_size);
delay_ms(500);
}
}


總結
本實驗可以通過揮舞手勢直觀的了解傳感器的手勢識別的基本功能以及接近檢測的功能。
審核編輯 黃宇
-
濾波器
+關注
關注
162文章
8424瀏覽量
186013 -
手勢識別傳感器
+關注
關注
0文章
5瀏覽量
4979
發布評論請先 登錄
探索MAX32664:超低功耗生物識別傳感器集線器的卓越性能
MAX32663A:超低功耗心電圖生物識別傳感器集線器的卓越之選
零知IDE——基于零知標準板驅動PAJ7620U2手勢控制L9110風扇模塊和SG90舵機系統
零知IDE——基于STM32F103RBT6的PAJ7620U2手勢控制WS2812 RGB燈帶系統
零知IDE——基于STM32F103RBT6的PAJ7620U2手勢控制WS2812 RGB燈帶系統
基于STMicroelectronics AEK-SNS-2TOFM1手勢檢測系統的技術解析與應用實踐
新品 | Unit Fingerprint2,高性能指紋識別傳感器單元
華怡豐推出ISC-B/C系列圖像識別傳感器
MAX32663A超低功耗ECG生物識別傳感器綜述
MAX32664超低功耗生物識別傳感器集中器技術手冊
MAX32663A超低功耗ECG生物識別傳感器技術手冊
STM32驅動PAJ7620手勢識別傳感器
評論