久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7422|回復: 11
打印 上一主題 下一主題
收起左側

STM32+PAJ7620手勢識別的智能家居控制系統識別系統程序設計

  [復制鏈接]
跳轉到指定樓層
樓主
項目描述:模塊采用ATK-PAJ7620_V1.2,自帶九種手勢識別,支持上、下、左、右、前、后、順時針旋轉、逆時針旋轉和揮動的手勢動作識別,STM32與模塊之間采用IIC進行通信,識別不同的手勢通過IIC讀取模塊寄存器的值是不相同的,根據識別不同手勢的值控制對應的器件。4個燈的亮滅分別代表4種手勢的識別,STM32通過IO口控制燈亮滅,例如判別為第一種手勢,燈1亮,第二個手勢燈1滅燈2亮,識別不了按照前面的方式亮。風扇控制方面采用PWM波控制,三個PWM波分別為低中高,然后滿占空比對應全開,0占空比對應關,以此對應5種手勢狀態。

項目分為以下幾個部分:
1.基于正點原子的ATK-PAJ7620紅外手勢識別模塊IIC通信與手勢判別
2.基于L298N的PWM電機控制
3.LED燈的控制

硬件部分:
1.STM32最小系統
2.L298N電機驅動模塊及電機和扇葉
3.LED燈模塊
4.ATK-PAJ7620手勢識別模塊
最小系統的原理圖如下所示:



硬件連接為:
1.ATK-PAJ7620 IIC PB10:SCL PB11:SDA
2.L298N PWM控制口:PB5
3.LED接口:PB6 PB7 PB8 PB9

首先是ATK-PAJ7620模塊的IIC初始化
單片機源程序如下:
  1. #include "paj7620u2_iic.h"
  2. #include "paj7620u2.h"
  3. #include "delay.h"

  4. //PAJ2670 I2C初始化
  5. void GS_i2c_init(void)
  6. {
  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB時鐘
  9.          
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;  //端口配置
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;       //推挽輸出
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //50Mhz速度
  13.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  14.         GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);//PB10,PB11 輸出高        
  15.         
  16. }

  17. //產生IIC起始信號
  18. static void GS_IIC_Start(void)
  19. {
  20.         GS_SDA_OUT();//sda線輸出
  21.         GS_IIC_SDA=1;                    
  22.         GS_IIC_SCL=1;
  23.         delay_us(4);
  24.          GS_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  25.         delay_us(4);
  26.         GS_IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據
  27. }

  28. //產生IIC停止信號
  29. static void GS_IIC_Stop(void)
  30. {
  31.         GS_SDA_OUT();//sda線輸出
  32.         GS_IIC_SCL=0;
  33.         GS_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  34.          delay_us(4);
  35.         GS_IIC_SCL=1;
  36.         GS_IIC_SDA=1;//發送I2C總線結束信號
  37.         delay_us(4);                                                                  
  38. }

  39. //等待應答信號到來
  40. //返回值:1,接收應答失敗
  41. //        0,接收應答成功
  42. static u8 GS_IIC_Wait_Ack(void)
  43. {
  44.         u8 ucErrTime=0;
  45.         GS_SDA_IN();  //SDA設置為輸入  
  46.         GS_IIC_SDA=1;delay_us(3);           
  47.         GS_IIC_SCL=1;delay_us(3);         
  48.         while(GS_READ_SDA)
  49.         {
  50.                 ucErrTime++;
  51.                 if(ucErrTime>250)
  52.                 {
  53.                         GS_IIC_Stop();
  54.                         return 1;
  55.                 }
  56.         }
  57.         GS_IIC_SCL=0;//時鐘輸出0            
  58.         return 0;  
  59. }

  60. //產生ACK應答
  61. static void GS_IIC_Ack(void)
  62. {
  63.         GS_IIC_SCL=0;
  64.         GS_SDA_OUT();
  65.         GS_IIC_SDA=0;
  66.         delay_us(3);
  67.         GS_IIC_SCL=1;
  68.         delay_us(3);
  69.         GS_IIC_SCL=0;
  70. }

  71. //不產生ACK應答                    
  72. static void GS_IIC_NAck(void)
  73. {
  74.         GS_IIC_SCL=0;
  75.         GS_SDA_OUT();
  76.         GS_IIC_SDA=1;
  77.         delay_us(2);
  78.         GS_IIC_SCL=1;
  79.         delay_us(2);
  80.         GS_IIC_SCL=0;
  81. }

  82. //IIC發送一個字節
  83. //返回從機有無應答
  84. //1,有應答
  85. //0,無應答                          
  86. static void GS_IIC_Send_Byte(u8 txd)
  87. {                        
  88.     u8 t;   
  89.         GS_SDA_OUT();            
  90.     GS_IIC_SCL=0;//拉低時鐘開始數據傳輸
  91.     for(t=0;t<8;t++)
  92.     {              
  93.                 if((txd&0x80)>>7)
  94.                         GS_IIC_SDA=1;
  95.                 else
  96.                         GS_IIC_SDA=0;
  97.                 txd<<=1;           
  98.                 delay_us(5);  
  99.                 GS_IIC_SCL=1;
  100.                 delay_us(5);
  101.                 GS_IIC_SCL=0;        
  102.                 delay_us(5);
  103.     }         
  104. }

  105. //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK   
  106. static u8 GS_IIC_Read_Byte(u8 ack)
  107. {
  108.         u8 i,receive=0;
  109.         GS_SDA_IN();//SDA設置為輸入
  110.         for(i=0;i<8;i++ )
  111.         {
  112.                 GS_IIC_SCL=0;
  113.                 delay_us(4);
  114.           GS_IIC_SCL=1;
  115.                 receive<<=1;
  116.                 if(GS_READ_SDA)receive++;   
  117.           delay_us(4);
  118.         }                                         
  119.         if (!ack)
  120.                 GS_IIC_NAck();//發送nACK
  121.         else
  122.                 GS_IIC_Ack(); //發送ACK   
  123.         return receive;
  124. }

  125. //PAJ7620U2寫一個字節數據
  126. u8 GS_Write_Byte(u8 REG_Address,u8 REG_data)
  127. {
  128.         GS_IIC_Start();
  129.         GS_IIC_Send_Byte(PAJ7620_ID);
  130.         if(GS_IIC_Wait_Ack())
  131.         {
  132.                 GS_IIC_Stop();//釋放總線
  133.                 return 1;//沒應答則退出

  134.         }
  135.         GS_IIC_Send_Byte(REG_Address);
  136.         GS_IIC_Wait_Ack();        
  137.         GS_IIC_Send_Byte(REG_data);
  138.         GS_IIC_Wait_Ack();        
  139.         GS_IIC_Stop();

  140.         return 0;
  141. }

  142. //PAJ7620U2讀一個字節數據
  143. u8 GS_Read_Byte(u8 REG_Address)
  144. {
  145.         u8 REG_data;
  146.         
  147.         GS_IIC_Start();
  148.         GS_IIC_Send_Byte(PAJ7620_ID);//發寫命令
  149.         if(GS_IIC_Wait_Ack())
  150.         {
  151.                  GS_IIC_Stop();//釋放總線
  152.                  return 0;//沒應答則退出
  153.         }               
  154.         GS_IIC_Send_Byte(REG_Address);
  155.         GS_IIC_Wait_Ack();
  156.         GS_IIC_Start();
  157.         GS_IIC_Send_Byte(PAJ7620_ID|0x01);//發讀命令
  158.         GS_IIC_Wait_Ack();
  159.         REG_data = GS_IIC_Read_Byte(0);
  160.         GS_IIC_Stop();

  161.         return REG_data;
  162. }
  163. //PAJ7620U2讀n個字節數據
  164. u8 GS_Read_nByte(u8 REG_Address,u16 len,u8 *buf)
  165. {
  166.         GS_IIC_Start();
  167.         GS_IIC_Send_Byte(PAJ7620_ID);//發寫命令
  168.         if(GS_IIC_Wait_Ack())
  169.         {
  170.                 GS_IIC_Stop();//釋放總線
  171.                 return 1;//沒應答則退出
  172.         }
  173.         GS_IIC_Send_Byte(REG_Address);
  174.         GS_IIC_Wait_Ack();

  175.         GS_IIC_Start();
  176.         GS_IIC_Send_Byte(PAJ7620_ID|0x01);//發讀命令
  177.         GS_IIC_Wait_Ack();
  178.         while(len)
  179.         {
  180.                 if(len==1)
  181.                 {
  182.                         *buf = GS_IIC_Read_Byte(0);
  183.                 }
  184.                 else
  185.                 {
  186.                         *buf = GS_IIC_Read_Byte(1);
  187.                 }
  188.                 buf++;
  189.                 len--;
  190.         }
  191.         GS_IIC_Stop();//釋放總線

  192.         return 0;
  193.         
  194. }
  195. //PAJ7620U2喚醒
  196. void GS_WakeUp(void)
  197. {
  198.         GS_IIC_Start();
  199.         GS_IIC_Send_Byte(PAJ7620_ID);//發寫命令
  200.         GS_IIC_Stop();//釋放總線
  201. }
復制代碼

PWM初始化:配置TIM3定時器產生PWM頻率為80KHZ
  1. #include "timer.h"
  2. #include "led.h"
  3. #include "usart.h"
  4.             
  5. //通用定時器3中斷初始化
  6. //這里時鐘選擇為APB1的2倍,而APB1為36M
  7. //arr:自動重裝值。
  8. //psc:時鐘預分頻數
  9. //這里使用的是定時器3!
  10. void TIM3_Int_Init(u16 arr,u16 psc)
  11. {
  12.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  13.         NVIC_InitTypeDef NVIC_InitStructure;

  14.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能

  15.         TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值         計數到5000為500ms
  16.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值  10Khz的計數頻率  
  17.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
  18.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
  19.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

  20.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷

  21.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
  22.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優先級0級
  23.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優先級3級
  24.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  25.         NVIC_Init(&NVIC_InitStructure);  //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器

  26.         TIM_Cmd(TIM3, ENABLE);  //使能TIMx外設
  27.                                                          
  28. }
  29. //定時器3中斷服務程序
  30. void TIM3_IRQHandler(void)   //TIM3中斷
  31. {
  32.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源
  33.                 {
  34.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中斷待處理位:TIM 中斷源
  35.                 //LED1=!LED1;
  36.                 }
  37. }




  38. //TIM3 PWM部分初始化
  39. //PWM輸出初始化
  40. //arr:自動重裝值
  41. //psc:時鐘預分頻數
  42. void TIM3_PWM_Init(u16 arr,u16 psc)
  43. {  
  44.         GPIO_InitTypeDef GPIO_InitStructure;
  45.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  46.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  47.         

  48.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定時器3時鐘
  49.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外設和AFIO復用功能模塊時鐘
  50.         
  51.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

  52.    //設置該引腳為復用輸出功能,輸出TIM3 CH2的PWM脈沖波形        GPIOB.5
  53.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  54.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復用推挽輸出
  55.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  57.    //初始化TIM3
  58.         TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
  59.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值
  60.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
  61.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
  62.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
  63.         
  64.         //初始化TIM3 Channel2 PWM模式         
  65.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2
  66.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  67.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  68.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM3 OC2

  69.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預裝載寄存器

  70.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  71.         

  72. }
復制代碼

LED燈初始化不再贅述,ATK-PAJ7620功能函數如下,主要通過IIC通信返回的數據再結合手冊可做判斷模塊識別到為什么手勢進而進行相應的控制
  1. #include "paj7620u2.h"
  2. #include "paj7620u2_cfg.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. #include "led.h"
  6. #include "lcd.h"
  7. #include "key.h"

  8. //選擇PAJ7620U2 BANK區域
  9. void paj7620u2_selectBank(bank_e bank)
  10. {
  11.         switch(bank)
  12.         {
  13.                 case BANK0: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);break;//BANK0寄存器區域
  14.                 case BANK1: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK1);break;//BANK1寄存器區域
  15.         }
  16.                         
  17. }

  18. //PAJ7620U2喚醒
  19. u8 paj7620u2_wakeup(void)
  20. {
  21.         u8 data=0x0a;
  22.         GS_WakeUp();//喚醒PAJ7620U2
  23.         delay_ms(5);//喚醒時間>700us
  24.         GS_WakeUp();//喚醒PAJ7620U2
  25.         delay_ms(5);//喚醒時間>700us
  26.         paj7620u2_selectBank(BANK0);//進入BANK0寄存器區域
  27.         data = GS_Read_Byte(0x00);//讀取狀態
  28.         if(data!=0x20) return 0; //喚醒失敗
  29.         
  30.         return 1;
  31. }

  32. //PAJ7620U2初始化
  33. //返回值:0:失敗 1:成功
  34. u8 paj7620u2_init(void)
  35. {
  36.         u8 i;
  37.         u8 status;
  38.         
  39.         GS_i2c_init();//IIC初始化
  40.         status = paj7620u2_wakeup();//喚醒PAJ7620U2
  41.         if(!status) return 0;
  42.     paj7620u2_selectBank(BANK0);//進入BANK0寄存器區域
  43.         for(i=0;i<INIT_SIZE;i++)
  44.         {
  45.                 GS_Write_Byte(init_Array[i][0],init_Array[i][1]);//初始化PAJ7620U2
  46.         }
  47.     paj7620u2_selectBank(BANK0);//切換回BANK0寄存器區域
  48.         
  49.         return 1;
  50. }

  51. //主菜單
  52. void paj7620u2_test_ui(void)
  53. {
  54.         POINT_COLOR=BLUE;//設置字體為藍色
  55.         LCD_Fill(30,170,300,300,WHITE);
  56.         LCD_ShowString(30,170,200,16,16,"KEY1:   Gesrure test");//手勢識別測試
  57.         LCD_ShowString(30,190,200,16,16,"KEY0:   Ps test     ");//接近距離測試
  58.         
  59. }

  60. //手勢識別測試
  61. void Gesrure_test(void)
  62. {
  63.         u8 i;
  64.     u8 status;
  65.         u8 key;
  66.         u8 data[2]={0x00};
  67.         u16 gesture_data;
  68.         u8 ledflash=0;
  69.         
  70.         paj7620u2_selectBank(BANK0);//進入BANK0
  71.         for(i=0;i<GESTURE_SIZE;i++)
  72.         {
  73.                 GS_Write_Byte(gesture_arry[i][0],gesture_arry[i][1]);//手勢識別模式初始化
  74.         }
  75.         paj7620u2_selectBank(BANK0);//切換回BANK0
  76.         i=0;
  77.         POINT_COLOR=BLUE;//設置字體為藍色
  78. //        LCD_Fill(30,170,300,300,WHITE);
  79. //        LCD_ShowString(30,180,200,16,16,"KEY_UP: Exit the test");
  80. //        LCD_ShowString(30,210,200,16,16,"Gesrure test");
  81. //        POINT_COLOR=RED;//設置字體為藍色
  82.         while(1)
  83.         {
  84.         key = KEY_Scan(0);
  85.                 if(key==WKUP_PRES)
  86.                 {
  87.                         GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);//關閉手勢識別中斷輸出
  88.                         GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00);
  89.                         break;
  90.                 }                        
  91.         status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//讀取手勢狀態                        
  92.                 if(!status)
  93.                 {   
  94.                         gesture_data =(u16)data[1]<<8 | data[0];
  95.                         if(gesture_data)
  96.                         {
  97.                                 switch(gesture_data)
  98.                                 {
  99.                                         case GES_UP:               GPIO_SetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  100.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);
  101.                                                                    printf("Up\r\n");            ledflash=1;      break; //向上
  102.                                         case GES_DOWM:             GPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_ResetBits(GPIOB,GPIO_Pin_6);
  103.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);     
  104.                                                                           printf("Dowm\r\n");          ledflash=1;      break; //向下
  105.                                         case GES_LEFT:             GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  106.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);         
  107.                                                                          printf("Left\r\n");          ledflash=1;      break; //向左
  108.                                         case GES_RIGHT:            GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  109.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_6);TIM_SetCompare2(TIM3,1000);      
  110.                                                                        printf("Right\r\n");         ledflash=1;      break; //向右
  111.                                         case GES_FORWARD:        GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  112.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,1000);        
  113.                                                                        printf("Forward\r\n");       ledflash=1;      break; //向前
  114.                                         case GES_BACKWARD:        GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  115.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,0);   
  116.                                                                        printf("Backward\r\n");      ledflash=1;      break; //向后
  117.                                         case GES_CLOCKWISE:        GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  118.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,50);     
  119.                                                                        printf("Clockwise\r\n");     ledflash=1;      break; //順時針
  120.                                         case GES_COUNT_CLOCKWISE:  GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  121.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,200);  
  122.                                                                           printf("AntiClockwise\r\n"); ledflash=1;      break; //逆時針
  123.                                         case GES_WAVE:             GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  124.                                                                    GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);TIM_SetCompare2(TIM3,550);   
  125.                                                                        printf("Wave\r\n");          ledflash=1;      break; //揮動
  126.                                         default:  ledflash=0; break;
  127.                                        
  128.                                 }        
  129.                 if(ledflash)//DS1閃爍
  130.                                 {   
  131. //                                        LED1=0;delay_ms(80);LED1=1;delay_ms(80);
  132. //                                        LED1=0;delay_ms(80);LED1=1;delay_ms(80);
  133.                                         delay_ms(300);
  134.                                         //LCD_ShowString(40,250,200,16,24,"                        ");
  135.                                         ledflash=0;
  136.                                 }                                                
  137.                         }
  138.                         
  139.                 }
  140.                 delay_ms(50);
  141. //                i++;
  142. //                if(i==5)
  143. //                {
  144. //                        LED0=!LED0;//提示系統正在運行        
  145. //                        i=0;
  146. //                }                  
  147.         }
  148. }

  149. //接近檢測測試
  150. void Ps_test(void)
  151. {
  152.         u8 i;
  153.         u8 key;
  154.         u8 data[2]={0x00};
  155.         u8 obj_brightness=0;
  156.         u16 obj_size=0;
  157.         
  158.         paj7620u2_selectBank(BANK0);//進入BANK0
  159.         for(i=0;i<PROXIM_SIZE;i++)
  160.         {
  161.                 GS_Write_Byte(proximity_arry[i][0],proximity_arry[i][1]);//接近檢測模式初始化
  162.         }
  163.         paj7620u2_selectBank(BANK0);//切換回BANK0
  164.         i=0;
  165.         POINT_COLOR=BLUE;//設置字體為藍色
  166.         LCD_Fill(30,170,300,300,WHITE);
  167.         LCD_ShowString(30,180,200,16,16,"KEY_UP: Exit the test");
  168.         LCD_ShowString(30,210,200,16,16,"Ps test");
  169.         LCD_ShowString(30,240,200,16,16,"Brightness");
  170.         LCD_ShowString(160,240,200,16,16,"Size");
  171.         POINT_COLOR=RED;//設置字體為藍色        
  172.         
  173.         while(1)
  174.         {        
  175.                 key = KEY_Scan(0);
  176.                 if(key==WKUP_PRES) break;
  177.                
  178.                 obj_brightness = GS_Read_Byte(PAJ_GET_OBJECT_BRIGHTNESS);//讀取物體亮度
  179.                 data[0] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_1);//讀取物體大小
  180.                 data[1] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_2);
  181.                 obj_size = ((u16)data[1] & 0x0f)<<8 | data[0];
  182.                 LCD_ShowxNum(50,270,obj_brightness,3,24,0);
  183.                 LCD_ShowxNum(152,270,obj_size,3,24,0);
  184.                 printf("obj_brightness: %d\r\n",obj_brightness);
  185.         printf("obj_size: %d\r\n",obj_size);
  186.                
  187.                 delay_ms(100);
  188. //                i++;
  189. //                if(i==5)
  190. //                {
  191. //                    LED0=!LED0;//提示系統正在運行        
  192. //                        i=0;
  193. //                }
  194.         }
  195.         
  196. }
  197. //PAJ7620U2傳感器測試
  198. void paj7620u2_sensor_test(void)
  199. {   
  200.          u8 i=0;
  201.          u8 key;
  202.         
  203.    paj7620u2_test_ui();//主菜單顯示
  204.          while(1)
  205.          {
  206.                  key = KEY_Scan(0);//按鍵掃描
  207.                  if(key)
  208.                  {
  209.                          switch(key)
  210.                          {
  211.                                  case KEY1_PRES:  Gesrure_test();   break;//手勢檢測模式
  212.                                  case KEY0_PRES:  Ps_test();        break;//接近檢測模式  
  213.                          }
  214.                          paj7620u2_test_ui();
  215.                  }
  216.                 delay_ms(50);
  217.                 i++;
  218.                 if(i==5)
  219.                 {
  220.                     //LED0=!LED0;//提示系統正在運行        
  221.                         i=0;
  222.                 }
  223.                  
  224.          }
  225. }
復制代碼
代碼工程與pdf資料51hei附件下載:
手勢識別.7z (252.15 KB, 下載次數: 193)
ATK-PAJ7620手勢識別模塊用戶手冊_V1.0.pdf (1.13 MB, 下載次數: 98)

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:116773 發表于 2021-9-3 08:41 | 只看該作者
不錯的應用,那天也買一個模塊來實驗。
回復

使用道具 舉報

板凳
ID:1004236 發表于 2022-2-7 02:03 | 只看該作者
值得一試
回復

使用道具 舉報

地板
ID:310441 發表于 2022-2-7 17:34 來自手機 | 只看該作者
這個手勢識別模塊屬于圖像識別范疇么?
回復

使用道具 舉報

5#
ID:327295 發表于 2022-3-31 23:09 | 只看該作者
DoneDone 發表于 2022-2-7 17:34
這個手勢識別模塊屬于圖像識別范疇么?

不屬于,只是紅外感知
回復

使用道具 舉報

6#
ID:842688 發表于 2022-4-2 00:50 來自手機 | 只看該作者
寫的很詳細,很有參考價值
回復

使用道具 舉報

7#
ID:310441 發表于 2022-4-2 20:48 來自手機 | 只看該作者
感覺這個手勢識別錯誤率有點高哦!
回復

使用道具 舉報

8#
ID:77589 發表于 2022-10-26 17:32 | 只看該作者
空了來試試,謝謝分享!
回復

使用道具 舉報

9#
ID:900479 發表于 2023-2-13 21:47 | 只看該作者
謝謝分享,先移植看看
回復

使用道具 舉報

10#
ID:756400 發表于 2023-3-5 17:45 | 只看該作者
反手給你個贊,實測,程序可用。
回復

使用道具 舉報

11#
ID:77589 發表于 2023-4-26 15:27 | 只看該作者
寫的可以,支持!!!
回復

使用道具 舉報

12#
ID:1145225 發表于 2025-3-10 21:30 | 只看該作者
DoneDone 發表于 2022-4-2 20:48
感覺這個手勢識別錯誤率有點高哦!

改良后應該可以提高準確率
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级毛片免费 | 蜜桃视频在线观看www社区 | 九九热这里 | 中文天堂在线观看 | 日韩免费av一区二区 | 一区二区不卡 | 四虎在线播放 | 九九热精品在线视频 | 一级视频在线免费观看 | 亚洲精品欧美一区二区三区 | 日韩国产一区 | 久草青青 | 国产视频在线观看一区二区三区 | 亚洲乱码国产乱码精品精的特点 | 波多野结衣一二三区 | 日本a v在线播放 | 日韩精品在线观看一区二区三区 | 九九九久久国产免费 | 欧美成人一区二免费视频软件 | 日韩在线观看中文字幕 | 日韩在线不卡视频 | 精品久久中文字幕 | 日韩在线观看中文字幕 | 在线āv视频 | 97国产精品视频人人做人人爱 | 看一级黄色毛片 | 黄色毛片在线观看 | 久久婷婷麻豆国产91天堂 | 国产精品美女久久久久久免费 | 国产成人精品免费视频大全最热 | 中文字幕一区二区三区四区五区 | 国产成人在线一区 | 成人在线免费视频观看 | 国产欧美日韩精品一区 | 亚洲免费一区二区 | 亚洲欧美久久 | 韩日在线观看视频 | 天堂一区二区三区 | 欧美日韩精品专区 | 91久久综合亚洲鲁鲁五月天 | 国产精品无码永久免费888 |