智能家居硬件小制作(含源码)《手势识别控制器》基于PAJ7620手势模块、L298N驱动板、arduino

陌路散爱 提交于 2020-03-07 13:04:22

智能家居硬件小制作(含源码)《手势识别控制器》基于PAJ7620手势模块、L298N驱动板、arduino

介绍

手势识别控制器,基于arduino、PAJ7620传感器,可实现9种手势识别,应用于制作各种智能硬件
控制电视、窗帘、门、计算机、手机、智能车、机器人等各种硬件
以下以控制电机为例子

材料

  1. Arduino uno
  2. PAJ7620手势模块
  3. Base shield扩展板(可选),使接线简单
  4. L298N驱动板
  5. 直流电机
  6. 杜邦线

PAJ7620手势模块👇
在这里插入图片描述
L298N驱动板👇
在这里插入图片描述

PAJ7620手势模块

参数

主板支持:Arduino UNO / Seeeduino / Arduino Mega2560
在这里插入图片描述
模块支持9种手势,如下
在这里插入图片描述

硬件连接

  1. 你可以通过连接Base Shield 将此模块连接到 Base Shield 的 I2C 端口,如下
    在这里插入图片描述
    先把PAJ7620手势模块连接到 Base shield 的 I2C 端口上然后将 Base shield 连接到 Arduino UNO 上,即可

  2. 如果没有 Base Shield ,您也可以通过跳线将PAJ7620手势直接连接到 Arduino,方法如下

Arduino UNO Base Shield PAJ7620手势模块
5V I2C 端口 VCC
GND I2C 端口 GND
SDA I2C 端口 SDA
SCL I2C 端口 SCL
Digit 2 未连接 INT (Reserved pad)

库文件

为了使用使用PAJ7620手势模块,我们需要引入一个库文件
库文件:PAJ7620

  • 从上面链接将库代码的zip文件下载.
  • 打开arduino IDE
  • 点击【项目】----->【加载库】-----> 【添加.ZIP库】
  • 选择刚刚下载的文件,打开即可

使用

官方的简单演示
以下简单的演示将向您展示一个非常简单的应用:当您向上移动时,红色的LED将被打开,反之红色的LED将被关闭。

#include <Wire.h>
#include "paj7620.h"

void setup()
{
  paj7620Init();       //初始化手势传感器芯片PAJ7620
}

void loop()
{
    uint8_t data = 0;  // Read Bank_0_Reg_0x43/0x44 for gesture result.

    paj7620ReadReg(0x43, 1, &data);  // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data).

    if (data == GES_UP_FLAG)        // When up gesture be detected,the variable 'data' will be set to GES_UP_FLAG.
        digitalWrite(4, HIGH);      // turn the LED on (HIGH is the voltage level)
    if (data == GES_DOWN_FLAG)      // When down gesture be detected,the variable 'data' will be set to GES_DOWN_FLAG.
        digitalWrite(4, LOW);       // turn the LED off by making the voltage LOW

您可以自己查看 .h 和 .cpp 文件,以查看所有可用的功能

其他硬件

关于其他硬件有需要可以查看我的其他博客
Arduino小白入门全解,学习笔记

Arduino实践详细说明(三)L298N驱动直流电机

有能力的小伙伴可以考虑自己加上显示功能,我的lcd笔记如下

Arduino实践(二)lcd1602使用说明,源码

制作手势识别控制器

接线

L298N驱动和直流电机接线方法参考我的博客
Arduino实践详细说明(三)L298N驱动直流电机

PAJ7620手势接线方法如上述

这里就不再啰嗦重复,有疑问可评论

源代码

持续更新arduino 树莓派 python linux c语言等等
接到有帮助的话 求点赞👍 求关注❤️ 求分享👥
有问题可以评论
点关注,不迷路
如果有任何错误,如何建议,请批评指教,不胜感激 !

/*手势模块,控制l298n驱动电机*/
#include <Wire.h>
#include "paj7620.h"      //导入库,并调用
#define GES_REACTION_TIME       500
#define GES_ENTRY_TIME          800 
#define GES_QUIT_TIME           1000
 #define IN1 3  //定义IN1为3口
#define IN2 4  //定义IN2为4口
#define  ENA  10 //定义ENA为10口
void setup()
{  
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(ENA,OUTPUT);
    uint8_t error = 0;     
    Serial.begin(9600);      
    Serial.println("\nPAJ7620U2 TEST DEMO: Recognize 9 gestures.");  

    error = paj7620Init();       //初始化手势模块
    if (error)
    {
        Serial.print("INIT ERROR,CODE:");  
        Serial.println(error);
    }
    else
    {
        Serial.println("INIT OK");
    }
    Serial.println("Please input your gestures:\n");
}

void loop()
{
    uint8_t data = 0, data1 = 0, error;

    error = paj7620ReadReg(0x43, 1, &data);             
    {
        switch (data)                       
        {                                    
            case GES_RIGHT_FLAG:             
           { delay(GES_ENTRY_TIME);        
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG)
                {
                    Serial.println("Forward");
                    digitalWrite(IN1,LOW); //控制电机停下
                    digitalWrite(IN2,LOW); 
                    analogWrite(ENA,255); 
                    delay(GES_QUIT_TIME);}
                else if(data == GES_BACKWARD_FLAG)
                {
                    Serial.println("Backward");
                    digitalWrite(IN1,HIGH);  //控制电机正转
                    digitalWrite(IN2,LOW);
                    analogWrite(ENA,200);   //控制电机转速,超过150电机才开始转
                    delay(GES_QUIT_TIME);       
                }
                else
                {
                    Serial.println("Right");
                    digitalWrite(IN1,HIGH);  
                    digitalWrite(IN2,LOW);
                    analogWrite(ENA,200);
                }}
                break;
            case GES_LEFT_FLAG:
            {    delay(GES_ENTRY_TIME);
                 paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG)
                {
                    Serial.println("Forward");
                    digitalWrite(IN1,LOW);     
                    digitalWrite(IN2,LOW);
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG)
                {
                    Serial.println("Backward");
                    digitalWrite(IN1,HIGH);  
                    digitalWrite(IN2,LOW);
                    analogWrite(ENA,200);
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Left");
                    digitalWrite(IN1,LOW);   //电机反转
                    digitalWrite(IN2,HIGH);
                    analogWrite(ENA,200);
                }}
                break;
            case GES_UP_FLAG:
            {    delay(GES_ENTRY_TIME);
                 paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG)
                {
                    Serial.println("Forward");
                    digitalWrite(IN1,LOW); 
                    digitalWrite(IN2,LOW); 
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG)
                {
                    Serial.println("Backward");
                    digitalWrite(IN1,HIGH);  
                    digitalWrite(IN2,LOW);
                    analogWrite(ENA,200);
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Up");
                }}
                break;
            case GES_DOWN_FLAG:
             {   delay(GES_ENTRY_TIME);
                 paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG)
                {
                    Serial.println("Forward");
                    digitalWrite(IN1,LOW); 
                    digitalWrite(IN2,LOW); 
                    delay(GES_QUIT_TIME);}
               
                else if(data == GES_BACKWARD_FLAG)
                {
                    Serial.println("Backward");
                    digitalWrite(IN1,HIGH);  
                    digitalWrite(IN2,LOW);
                    analogWrite(ENA,200);
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Down");
                }}
                break;
            case GES_FORWARD_FLAG:
               { Serial.println("Forward");
                 digitalWrite(IN1,LOW); 
                 digitalWrite(IN2,LOW); 
                 delay(GES_QUIT_TIME);
               }
                break;
            case GES_BACKWARD_FLAG :
             {   Serial.println("Backward");
                 digitalWrite(IN1,HIGH);  
                 digitalWrite(IN2,LOW);
                 analogWrite(ENA,200);
                 delay(GES_QUIT_TIME);
             }
                break;
            case GES_CLOCKWISE_FLAG:
              {  Serial.println("Clockwise");
                 digitalWrite(IN1,HIGH);  
                 digitalWrite(IN2,LOW);
                 analogWrite(ENA,200);
              }
                break;
            case GES_COUNT_CLOCKWISE_FLAG:
               { Serial.println("anti-clockwise");
                 digitalWrite(IN1,HIGH);  
                 digitalWrite(IN2,LOW);
                 analogWrite(ENA,200);
               }
                break;
            default:
                paj7620ReadReg(0x44, 1, &data1);
                if (data1 == GES_WAVE_FLAG)
                {
                    Serial.println("wave");
                }
                break;
        }
    }
   
    delay(100);
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!