找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2885|回复: 3
收起左侧

电赛FDC2214手势识别装置改进(基于手势识别控制舵机)

[复制链接]
ID:349706 发表于 2018-11-6 14:10 | 显示全部楼层 |阅读模式
2018年电子设计大赛省赛题制作方案改进,变成基于手势识别控制舵机
可用于实现开关锁之类的小活动
剪刀模拟识别开锁
石头关锁
其他功能详见代码

单片机源程序如下:
  1. #include "stm32f10x.h"                  // Device header
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "myiic.h"
  7. #include "FDC2X2X_CMD.h"
  8. #include "FDC2214.h"
  9. #include "DataScope_DP.h"
  10. #include "OLED.h"
  11. #include "IMG.h"
  12. #include "TIM.h"
  13. #include "LED.h"



  14. #define VOLUME 1000

  15. //接线方式:
  16. //ch0:拇指
  17. //ch1:手掌
  18. //ch2:食指
  19. //ch3:中指
  20. //ch4:无名指
  21. //ch5:小指
  22. u8 STA;
  23. u8 pwm;
  24. u8 STA_num;
  25. u8 STA_num_1;



  26. #define HAND_FORMS_ONE 0x06
  27. #define HAND_FORMS_TWO 0x0e
  28. #define HAND_FORMS_THREE 0x1e
  29. #define HAND_FORMS_FOUR 0x3e
  30. #define HAND_FORMS_FIVE 0x3f
  31. #define HAND_FORMS_SIX 0x23
  32. #define HAND_FORMS_SIVEN 0x0f
  33. #define HAND_FORMS_EIGHT 0x07
  34. #define HAND_FORMS_NINE 0x03
  35. #define HAND_FORMS_TEN 0x02

  36. #define HAND_FORMS_JD 0x0e
  37. #define HAND_FORMS_ST 0x02
  38. #define HAND_FORMS_B 0x3f

  39. #define FINGER_PIANO_1 ((0x03) &0xfd)
  40. #define FINGER_PIANO_2 ((0x06) &0xfd)
  41. #define FINGER_PIANO_3 ((0x0a) &0xfd)
  42. #define FINGER_PIANO_4 ((0x12) &0xfd)
  43. #define FINGER_PIANO_5 ((0x22) &0xfd)

  44. //**特别注意:使用时SDA、SCL要接4.7K上拉电阻,地址线接地**//
  45. //**寄存器值的读取及电容的计算具体在 FDC2214_read_CHx() 中**/

  46. float i;//for循环专用变量
  47. u8 s[100];//sprintf

  48. void Data_BackUp()
  49. {
  50.         BKP->DR1=(u32)FDC_CH0.Threshold;
  51.         BKP->DR2=((u32)FDC_CH0.Threshold>>16);
  52.         BKP->DR3=(u32)FDC_CH1.Threshold;
  53.         BKP->DR4=((u32)FDC_CH1.Threshold>>16);
  54.         BKP->DR5=(u32)FDC_CH2.Threshold;
  55.         BKP->DR6=((u32)FDC_CH2.Threshold>>16);
  56.         BKP->DR7=(u32)FDC_CH3.Threshold;
  57.         BKP->DR8=((u32)FDC_CH3.Threshold>>16);
  58.         BKP->DR9=(u32)FDC_CH4.Threshold;
  59.         BKP->DR10=((u32)FDC_CH4.Threshold>>16);
  60.         BKP->DR11=(u32)FDC_CH5.Threshold;
  61.         BKP->DR12=((u32)FDC_CH5.Threshold>>16);
  62. }

  63. void Data_Load()
  64. {
  65.         FDC_CH0.Threshold = (float)(BKP->DR1 | (BKP->DR2<<16) );
  66.         FDC_CH1.Threshold = (float)(BKP->DR3 | (BKP->DR4<<16) );
  67.         FDC_CH2.Threshold = (float)(BKP->DR5 | (BKP->DR6<<16) );
  68.         FDC_CH3.Threshold = (float)(BKP->DR7 | (BKP->DR8<<16) );
  69.         FDC_CH4.Threshold = (float)(BKP->DR9 | (BKP->DR10<<16) );
  70.         FDC_CH5.Threshold = (float)(BKP->DR11| (BKP->DR12<<16) );

  71. }

  72. int main(void)
  73. {
  74.         pwm=190;
  75.         delay_init();                     //延时函数初始化          
  76.         OLED_Init();
  77.         OLED_ShowString(10,32,"Loading...");OLED_Refresh_Gram();
  78.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  79.         uart_init(256000);                 //串口初始化为9600
  80.         uart5_init(9600);

  81.         KEY_Init();       
  82.         LED_Init();


  83.         //开启后备寄存器
  84.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启后备电源
  85.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);//开启后备寄存器
  86.         PWR->CR|=0x00100;//取消后备寄存器的写保护

  87.         FDC2214_Init();
  88.         FDC2214_Init_2();
  89. //        Read_REG();
  90. //        Read_REG_2();
  91.        
  92.        
  93.         TIM_1_PWM_Init(7199,0);//不分频。PWM频率=72000/(7199+1)=10Khz
  94.         TIM2_PWM_Init(199,7199);//不分频。PWM频率=72000/(7199+1)/(199+1)=50hz

  95.         TIM1->CCR4=0;//比较值,音量设置
  96.         TIM1->PSC=0;  //预分频系数,频率设置
  97. //        delay_ms(10000);

  98.         while(1)
  99.         {
  100.                 static int timer=19;
  101.                 static u8 step=3;
  102.                 static u8 mode=0;//0:划拳//1:猜拳//2:手指琴//3:划拳(扩充)
  103.                 static u8 mode_1=5;
  104.                 static u8 key_sta;
  105.                 delay_ms(10);
  106.                
  107.                 Date_Back(0);//刷新数据并上传给上位机
  108.                
  109.                 switch(STA)
  110.                 {
  111.                         case HAND_FORMS_ONE :        STA_num=1;                break;
  112.                         case HAND_FORMS_TWO :        STA_num=2;                break;
  113.                         case HAND_FORMS_THREE:        STA_num=3;                break;
  114.                         case HAND_FORMS_FOUR :        STA_num=4;                break;
  115.                         case HAND_FORMS_FIVE :        STA_num=5;                break;
  116.                         case HAND_FORMS_SIX :        STA_num=6;                break;
  117.                         case HAND_FORMS_SIVEN:        STA_num=7;                break;
  118.                         case HAND_FORMS_EIGHT:        STA_num=8;                break;
  119.                         case HAND_FORMS_NINE :        STA_num=9;                break;
  120.                         case HAND_FORMS_TEN :        STA_num=10;                break;
  121.                         default :                                STA_num=0;                break;
  122.                 }
  123.                
  124. //                if( (STA_num_1 != STA_num) || (mode_1 != mode) )
  125. //                {
  126.                         while((UART5->SR&0X40)==0);//循环发送,直到发送完毕   
  127.                         UART5->DR = (u8)'*';  
  128.                         while((UART5->SR&0X40)==0);//循环发送,直到发送完毕   
  129.                         UART5->DR = (u8) mode;  
  130.                         while((UART5->SR&0X40)==0);//循环发送,直到发送完毕   
  131.                         UART5->DR = (u8) STA_num;  
  132.                         while((UART5->SR&0X40)==0);//循环发送,直到发送完毕   
  133.                         UART5->DR = (u8) '#';
  134. //                }
  135.                 STA_num_1=STA_num;
  136.                 mode_1=mode;
  137.                
  138.                 switch(step)
  139.                 {
  140.                         case 0://校准Normal值
  141.                                
  142.                                 if(timer<=0)//倒计时时间到
  143.                                 {
  144.                                         FDC_CH0.Normal=From_History_Get_Average(FDC_CH0.History,10);
  145.                                         FDC_CH1.Normal=From_History_Get_Average(FDC_CH1.History,10);
  146.                                         FDC_CH2.Normal=From_History_Get_Average(FDC_CH2.History,10);
  147.                                         FDC_CH3.Normal=From_History_Get_Average(FDC_CH3.History,10);
  148.                                         FDC_CH4.Normal=From_History_Get_Average(FDC_CH4.History,10);
  149.                                         FDC_CH5.Normal=From_History_Get_Average(FDC_CH5.History,10);
  150.                                         OLED_Clear();OLED_Refresh_Gram();
  151.                                         step=1;timer=39;
  152.                                 }
  153.                                 else //倒计时未到
  154.                                 {
  155.                                         timer--;       
  156.                                         OLED_SHOW_Imag(0,0,32,32,(u8*)gImage_qing,2,0);
  157.                                         OLED_SHOW_Imag(32,0,32,32,(u8*)gImage_wu,2,0);
  158.                                         OLED_SHOW_Imag(64,0,32,32,(u8*)gImage_chu,2,0);
  159.                                         OLED_SHOW_Imag(96,0,32,32,(u8*)gImage_peng,2,0);
  160.                                         OLED_SHOW_Imag(0,32,24,24,(u8*)gImage_xun,2,0);
  161.                                         OLED_SHOW_Imag(24,32,24,24,(u8*)gImage_lian,2,0);

  162.                                         OLED_Refresh_Gram();
  163.                                 }       
  164.                                 break;
  165.                         case 1://校准Put值
  166.                                 if(timer<=0)//倒计时时间到
  167.                                 {
  168.                                         FDC_CH0.Put=From_History_Get_Average(FDC_CH0.History,10);
  169.                                         FDC_CH1.Put=From_History_Get_Average(FDC_CH1.History,10);
  170.                                         FDC_CH2.Put=From_History_Get_Average(FDC_CH2.History,10);
  171.                                         FDC_CH3.Put=From_History_Get_Average(FDC_CH3.History,10);
  172.                                         FDC_CH4.Put=From_History_Get_Average(FDC_CH4.History,10);
  173.                                         FDC_CH5.Put=From_History_Get_Average(FDC_CH5.History,10);
  174.                                         step=2;timer=39;
  175.                                 }
  176.                                 else //倒计时时间未到
  177.                                 {
  178.                                         timer--;       
  179.                                         OLED_SHOW_Imag(0,0,32,32,(u8*)gImage_fang,2,0);
  180.                                         OLED_SHOW_Imag(32,0,32,32,(u8*)gImage_zhi,2,0);
  181.                                         OLED_SHOW_Imag(64,0,32,32,(u8*)gImage_shou,2,0);
  182.                                         OLED_SHOW_Imag(96,0,32,32,(u8*)gImage_zhang,2,0);
  183.                                         sprintf((char *)s,"Counter:%d",timer/10);
  184.                                         OLED_ShowString(0,32,s);
  185.                                         OLED_Refresh_Gram();
  186.                                 }
  187.                         break;
  188.                         case 2://计算阈值
  189.                                         FDC_CH0.Threshold=(FDC_CH0.Put+FDC_CH0.Normal)/2;
  190.                                         FDC_CH1.Threshold=(FDC_CH1.Put+FDC_CH1.Normal)/2;
  191.                                         FDC_CH2.Threshold=(FDC_CH2.Put+FDC_CH2.Normal)/2;
  192.                                         FDC_CH3.Threshold=(FDC_CH3.Put+FDC_CH3.Normal)/2;
  193.                                         FDC_CH4.Threshold=(FDC_CH4.Put+FDC_CH4.Normal)/2;
  194.                                         FDC_CH5.Threshold=(FDC_CH5.Put+FDC_CH5.Normal)/2;
  195.                                         Data_BackUp();
  196.                                         OLED_Clear();
  197.                                         step=4;
  198.                         break;
  199.                         case 3://读取数据
  200.                                 Data_Load();
  201.                                 step=4;
  202.                         break;
  203.                         case 4://清屏
  204.                                         OLED_Clear();
  205.                                         step=5;
  206.                         break;
  207.                         case 5://状态解算
  208.                                         FDC_CH0.STA<<=1;
  209.                                         FDC_CH1.STA<<=1;
  210.                                         FDC_CH2.STA<<=1;
  211.                                         FDC_CH3.STA<<=1;
  212.                                         FDC_CH4.STA<<=1;
  213.                                         FDC_CH5.STA<<=1;
  214.                                        
  215.                                         if( FDC_CH0.Now < FDC_CH0.Threshold )
  216.                                                         FDC_CH0.STA|=0x01;
  217.                                                 else
  218.                                                         FDC_CH0.STA&=0xfe;
  219.                                         if( FDC_CH1.Now < FDC_CH1.Threshold )
  220.                                                         FDC_CH1.STA|=0x01;
  221.                                                 else
  222.                                                         FDC_CH1.STA&=0xfe;
  223.                                         if( FDC_CH2.Now < FDC_CH2.Threshold )
  224.                                                         FDC_CH2.STA|=0x01;
  225.                                                 else
  226.                                                         FDC_CH2.STA&=0xfe;
  227.                                         if( FDC_CH3.Now < FDC_CH3.Threshold )
  228.                                                         FDC_CH3.STA|=0x01;
  229.                                                 else
  230.                                                         FDC_CH3.STA&=0xfe;
  231.                                         if( FDC_CH4.Now < FDC_CH4.Threshold )
  232.                                                         FDC_CH4.STA|=0x01;
  233.                                                 else
  234.                                                         FDC_CH4.STA&=0xfe;
  235.                                         if( FDC_CH5.Now < FDC_CH5.Threshold )
  236.                                                         FDC_CH5.STA|=0x01;
  237.                                                 else
  238.                                                         FDC_CH5.STA&=0xfe;
  239.                                                
  240.                                         STA = ((FDC_CH5.STA&0x01)<<5) | ((FDC_CH4.STA&0x01)<<4) | ((FDC_CH3.STA&0x01)<<3) | ((FDC_CH2.STA&0x01)<<2) | ((FDC_CH1.STA&0x01)<<1) | (FDC_CH0.STA&0x01);
  241.                                        
  242.                                         key_sta = KEY_Scan(0);
  243.                                         if(key_sta != 0)
  244.                                                         OLED_Clear(),timer=19;
  245.                                         if( key_sta ==  KEY0_PRES)//换模式
  246.                                                 mode=!mode;
  247.                                         if( key_sta ==  WKUP_PRES)//换模式,附加模式
  248.                                         {
  249.                                                 if(mode == 2)
  250.                                                         mode=3;
  251.                                                 else
  252.                                                         mode=2;
  253.                                         }
  254.                                        
  255.                                         switch(mode)
  256.                                         {
  257.                                                 case 0:step=7;break;
  258.                                                 case 1:step=8;break;
  259.                                                 case 2:step=9;break;
  260.                                                 case 3:step=10;break;
  261.                                         }
  262.                                        
  263.                                         if(key_sta == KEY1_PRES)//去校准
  264.                                         {
  265.                                                 step=0;
  266.                                                 timer=19;
  267.                                         }
  268.                                        
  269.                                        
  270.                         break;
  271.                         case 7://猜拳
  272.                                 if(timer>0)//倒计时时间未到
  273.                                 {
  274.                                         timer--;
  275.                                         OLED_SHOW_Imag(60,16,16,16,(u8*)cai,2,0),OLED_SHOW_Imag(76,16,16,16,(u8*)quan,2,0);
  276.                                         OLED_Refresh_Gram();
  277.                                 }
  278.                                 else //倒计时到
  279.                                 {
  280.                                         switch(STA)
  281.                                         {
  282.                                                 case HAND_FORMS_JD:
  283.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_jiandao,1,0);
  284.                                                 if(pwm>60)
  285.                 {
  286.                                                 TIM_SetCompare3(TIM2,pwm--);
  287.                                                         delay_ms(10);
  288.                 }
  289.                                                                 OLED_Refresh_Gram();
  290.                                                 break;
  291.                                                 case HAND_FORMS_ST:
  292.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_shitou,1,0);
  293.                                         if(pwm==60|pwm<190)
  294.                                                 {
  295.                                                 //        pwm=190;
  296.                                                         TIM_SetCompare3(TIM2,pwm++);
  297.                                                         delay_ms(10);}
  298.                                                 OLED_Refresh_Gram();
  299.                                                 break;
  300.                                                 case HAND_FORMS_B:
  301.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_bu,1,0);
  302. //                                                        TIM_SetCompare3(TIM2,0);
  303.                                                 OLED_Refresh_Gram();
  304.                                                 break;
  305.                                                 default:
  306.                                                         OLED_Fill(30,0,94,64,0);OLED_Refresh_Gram();
  307.                                                 break;
  308.                                                
  309.                                         }
  310.                                         step=5;
  311.                                 }       

  312.                         break;
  313.                         case 8://划拳
  314.                                 if(timer>0)//倒计时时间未到
  315.                                 {
  316.                                         timer--;       
  317.                                         OLED_SHOW_Imag(60,16,16,16,(u8*)hua,2,0),OLED_SHOW_Imag(76,16,16,16,(u8*)quan,2,0);
  318.                                         OLED_Refresh_Gram();
  319.                                 }
  320.                                 else //倒计时到
  321.                                 {
  322.                                        
  323.                                         switch(STA)
  324.                                         {
  325.                                                 case HAND_FORMS_ONE:
  326.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_one,1,0);OLED_Refresh_Gram();                       
  327.                                                 break;
  328.                                                 case HAND_FORMS_TWO:
  329.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_two,1,0);OLED_Refresh_Gram();
  330.                                                 break;
  331.                                                 case HAND_FORMS_THREE:
  332.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_three,1,0);OLED_Refresh_Gram();
  333.                                                 break;
  334.                                                 case HAND_FORMS_FOUR:
  335.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_foul,1,0);OLED_Refresh_Gram();
  336.                                                 break;
  337.                                                 case HAND_FORMS_FIVE:
  338.                                                         OLED_SHOW_Imag(30,0,64,64,(u8 *)gImage_five,1,0);OLED_Refresh_Gram();
  339.                                                 break;
  340.                                                 default:
  341.                                                         OLED_Fill(30,0,94,64,0);OLED_Refresh_Gram();
  342.                                                 break;
  343.                                         }       
  344.                                         step=5;
  345.                                 }       

  346.                         break;       
  347.                         case 9://手指琴
  348.                                 if(timer>0)//倒计时时间未到
  349.                                 {
  350.                                         timer--;       
  351.                                         OLED_ShowString(15,16,(u8*)"Finger Piano");
  352.                                         OLED_Refresh_Gram();
  353.                                 }
  354.                                 else //倒计时到
  355.                                 {
  356.                                        
  357.                                         switch(STA)
  358.                                         {
  359.                                                 case FINGER_PIANO_1:        TIM1->PSC=7;TIM1->CCR4=VOLUME;        break;
  360.                                                 case FINGER_PIANO_2:        TIM1->PSC=6;TIM1->CCR4=VOLUME;        break;
  361.                                                 case FINGER_PIANO_3:        TIM1->PSC=5;TIM1->CCR4=VOLUME;        break;
  362.                                                 case FINGER_PIANO_4:        TIM1->PSC=4;TIM1->CCR4=VOLUME;        break;
  363.                                                 case FINGER_PIANO_5:        TIM1->PSC=3;TIM1->CCR4=VOLUME;        break;
  364.                                                 case FINGER_PIANO_1|FINGER_PIANO_2:        TIM1->PSC=13;TIM1->CCR4=VOLUME;        break;
  365.                                                 case FINGER_PIANO_1|FINGER_PIANO_3:        TIM1->PSC=12;TIM1->CCR4=VOLUME;        break;
  366.                                                 case FINGER_PIANO_1|FINGER_PIANO_4:        TIM1->PSC=11;TIM1->CCR4=VOLUME;        break;
  367.                                                 case FINGER_PIANO_1|FINGER_PIANO_5:        TIM1->PSC=10;TIM1->CCR4=VOLUME;        break;
  368.                                                 case FINGER_PIANO_2|FINGER_PIANO_3:        TIM1->PSC=9;TIM1->CCR4=VOLUME;        break;
  369.                                                 default :TIM1->CCR4=0;//比较值,音量设置
  370.                                                 break;
  371.                                         }

  372. //                                               
  373.                                         step=5;
  374.                                 }       
  375.                         break;
  376.                         case 10://划拳(扩充)
  377.                                         if(timer>0)//倒计时时间未到
  378.                                         {
  379.                                                 timer--;
  380.                                                 OLED_SHOW_Imag(60,16,16,16,(u8*)hua,2,0),OLED_SHOW_Imag(76,16,16,16,(u8*)quan,2,0);
  381.                                                 OLED_ShowString(60,32,(u8*)"plus");
  382.                                                 OLED_Refresh_Gram();
  383.                                         }
  384.                                         else //倒计时到
  385.                                         {
  386.                                                
  387.                                                 switch(STA)
  388.                                                 {
  389.                                                         case HAND_FORMS_ONE:OLED_Fill(64,0,128,64,0);
  390.                                                                 OLED_SHOW_Imag(0,0,64,64,(u8 *)gImage_1,1,1);OLED_Refresh_Gram();                       
  391.                                                         break;
  392.                                                         case HAND_FORMS_TWO:OLED_Fill(64,0,128,64,0);
  393.                                                                 OLED_SHOW_Imag(0,0,64,64,(u8 *)gImage_2,1,1);OLED_Refresh_Gram();
  394.                                                         break;
  395.                                                         case HAND_FORMS_THREE:OLED_Fill(64,0,128,64,0);
  396.                                                                 OLED_SHOW_Imag(0,0,64,64,(u8 *)gImage_3,1,1);OLED_Refresh_Gram();
  397.                                                         break;
  398.                                                         case HAND_FORMS_FOUR:OLED_Fill(64,0,128,64,0);
  399.                                                                 OLED_SHOW_Imag(0,0,64,64,(u8 *)gImage_4,1,1);OLED_Refresh_Gram();
  400.                                                         break;
  401.                                                         case HAND_FORMS_FIVE:OLED_Fill(64,0,128,64,0);
  402.                                                                 OLED_SHOW_Imag(0,0,64,64,(u8 *)gImage_5,1,1);OLED_Refresh_Gram();
  403.                                                         break;
  404.                                                         case HAND_FORMS_SIX:
  405.                                                                 OLED_SHOW_Imag(0,0,96,64,(u8 *)gImage_6,1,0);OLED_Refresh_Gram();                       
  406.                                                         break;
  407.                                                         case HAND_FORMS_SIVEN:
  408.                                                                 OLED_SHOW_Imag(0,0,96,64,(u8 *)gImage_7,1,0);OLED_Refresh_Gram();
  409.                                                         break;
  410.                                                         case HAND_FORMS_EIGHT:
  411.                                                                 OLED_SHOW_Imag(0,0,96,64,(u8 *)gImage_8,1,1);OLED_Refresh_Gram();
  412.                                                         break;
  413.                                                         case HAND_FORMS_NINE:
  414.                                                                 OLED_SHOW_Imag(0,0,96,64,(u8 *)gImage_9,1,1);OLED_Refresh_Gram();
  415.                                                         break;
  416.                                                         case HAND_FORMS_TEN:
  417.                                                                 OLED_SHOW_Imag(0,0,96,64,(u8 *)gImage_10,1,1);OLED_Refresh_Gram();
  418.                                                         break;
  419.                                                         default:
  420.                                                                 OLED_Clear();OLED_Refresh_Gram();
  421.                                                         break;
  422.                                                 }       
  423.                                                 step=5;
  424.                                         }
  425.                         break;
  426.                         default:
  427.                                         OLED_Fill(0,0,128,64,1);OLED_Refresh_Gram();delay_ms(10000);
  428.                         break;
  429.                        
  430.                 }
  431.         }
  432. }
复制代码

所有资料51hei提供下载:
fingers.rar (363.18 KB, 下载次数: 35)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:349706 发表于 2018-11-6 14:11 | 显示全部楼层
除了题目要求以外的拓展功能:
回复

使用道具 举报

ID:349706 发表于 2018-11-6 14:12 | 显示全部楼层
划拳plus:识别6~10特殊手势
拇指琴:利用蜂鸣器发出不同音调的声音
2s快速校准手型,适用于更多人
回复

使用道具 举报

ID:1 发表于 2018-11-9 00:50 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表