STM32与PAJ7620手势识别技术在智能家居控制系统中的应用与识别系统程序设计

一、项目描述

        模块采用ATK-PAJ7620_V1.2,自带九种手势识别,支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,STM32与模块之间采用IIC进行通信,识别不同的手势通过IIC读取模块寄存器的值是不相同的,根据识别不同手势的值控制对应的器件。4个灯的亮灭分别代表4种手势的识别,STM32通过IO口控制灯亮灭,例如判别为第一种手势,灯1亮,第二个手势灯1灭灯2亮,识别不了按照前面的方式亮。风扇控制方面采用PWM波控制,三个PWM波分别为低中高,然后满占空比对应全开,0占空比对应关,以此对应5种手势状态。

二、硬件部分

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

三、程序

#include "paj7620u2_iic.h"
#include "paj7620u2.h"
#include "delay.h"

//PAJ2670 I2C初始化
void GS_i2c_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;  //端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;       //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //50Mhz速度
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);//PB10,PB11 输出高        
        
}

//产生IIC起始信号
static void GS_IIC_Start(void)
{
        GS_SDA_OUT();//sda线输出
        GS_IIC_SDA=1;                    
        GS_IIC_SCL=1;
        delay_us(4);
         GS_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        GS_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}

//产生IIC停止信号
static void GS_IIC_Stop(void)
{
        GS_SDA_OUT();//sda线输出
        GS_IIC_SCL=0;
        GS_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
         delay_us(4);
        GS_IIC_SCL=1;
        GS_IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);                                                                  
}

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
static u8 GS_IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        GS_SDA_IN();  //SDA设置为输入  
        GS_IIC_SDA=1;delay_us(3);           
        GS_IIC_SCL=1;delay_us(3);         
        while(GS_READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        GS_IIC_Stop();
                        return 1;
                }
        }
        GS_IIC_SCL=0;//时钟输出0            
        return 0;  
}

//产生ACK应答
static void GS_IIC_Ack(void)
{
        GS_IIC_SCL=0;
        GS_SDA_OUT();
        GS_IIC_SDA=0;
        delay_us(3);
        GS_IIC_SCL=1;
        delay_us(3);
        GS_IIC_SCL=0;
}

//不产生ACK应答                    
static void GS_IIC_NAck(void)
{
        GS_IIC_SCL=0;
        GS_SDA_OUT();
        GS_IIC_SDA=1;
        delay_us(2);
        GS_IIC_SCL=1;
        delay_us(2);
        GS_IIC_SCL=0;
}

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
static void GS_IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        GS_SDA_OUT();            
    GS_IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
                if((txd&0x80)>>7)
                        GS_IIC_SDA=1;
                else
                        GS_IIC_SDA=0;
                txd<<=1;           
                delay_us(5);  
                GS_IIC_SCL=1;
                delay_us(5);
                GS_IIC_SCL=0;        
                delay_us(5);
    }         
}

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
static u8 GS_IIC_Read_Byte(u8 ack)
{
        u8 i,receive=0;
        GS_SDA_IN();//SDA设置为输入
        for(i=0;i<8;i++ )
        {
                GS_IIC_SCL=0;
                delay_us(4);
          GS_IIC_SCL=1;
                receive<<=1;
                if(GS_READ_SDA)receive++;   
          delay_us(4);
        }                                         
        if (!ack)
                GS_IIC_NAck();//发送nACK
        else
                GS_IIC_Ack(); //发送ACK   
        return receive;
}

//PAJ7620U2写一个字节数据
u8 GS_Write_Byte(u8 REG_Address,u8 REG_data)
{
        GS_IIC_Start();
        GS_IIC_Send_Byte(PAJ7620_ID);
        if(GS_IIC_Wait_Ack())
        {
                GS_IIC_Stop();//释放总线
                return 1;//没应答则退出

        }
        GS_IIC_Send_Byte(REG_Address);
        GS_IIC_Wait_Ack();        
        GS_IIC_Send_Byte(REG_data);
        GS_IIC_Wait_Ack();        
        GS_IIC_Stop();

        return 0;
}

//PAJ7620U2读一个字节数据
u8 GS_Read_Byte(u8 REG_Address)
{
        u8 REG_data;
        
        GS_IIC_Start();
        GS_IIC_Send_Byte(PAJ7620_ID);//发写命令
        if(GS_IIC_Wait_Ack())
        {
                 GS_IIC_Stop();//释放总线
                 return 0;//没应答则退出
        }               
        GS_IIC_Send_Byte(REG_Address);
        GS_IIC_Wait_Ack();
        GS_IIC_Start();
        GS_IIC_Send_Byte(PAJ7620_ID|0x01);//发读命令
        GS_IIC_Wait_Ack();
        REG_data = GS_IIC_Read_Byte(0);
        GS_IIC_Stop();

        return REG_data;
}
//PAJ7620U2读n个字节数据
u8 GS_Read_nByte(u8 REG_Address,u16 len,u8 *buf)
{
        GS_IIC_Start();
        GS_IIC_Send_Byte(PAJ7620_ID);//发写命令
        if(GS_IIC_Wait_Ack())
        {
                GS_IIC_Stop();//释放总线
                return 1;//没应答则退出
        }
        GS_IIC_Send_Byte(REG_Address);
        GS_IIC_Wait_Ack();

        GS_IIC_Start();
        GS_IIC_Send_Byte(PAJ7620_ID|0x01);//发读命令
        GS_IIC_Wait_Ack();
        while(len)
        {
                if(len==1)
                {
                        *buf = GS_IIC_Read_Byte(0);
                }
                else
                {
                        *buf = GS_IIC_Read_Byte(1);
                }
                buf++;
                len--;
        }
        GS_IIC_Stop();//释放总线

        return 0;
        
}
//PAJ7620U2唤醒
void GS_WakeUp(void)
{
        GS_IIC_Start();
        GS_IIC_Send_Byte(PAJ7620_ID);//发写命令
        GS_IIC_Stop();//释放总线
}

作者:森旺电子

物联沃分享整理
物联沃-IOTWORD物联网 » STM32与PAJ7620手势识别技术在智能家居控制系统中的应用与识别系统程序设计

发表回复