龙岗网站建设过程,公司做网站之前要准备什么软件,搜索引擎营销怎么做,做海报挣钱的网站一、模块简介 手势模块PAJ7620主要利用IIC或SPI协议来实现数据的传输#xff0c;本实验用的模块是以IIC来进行信息传输。支持电压从2.8v到3.6v, 正常可以选择3.3v。检测的距离从5到15cm, 可以检测9种手势#xff0c;包括
右#xff1a;编码为 0x01左#xff1a;编码为 0x0…一、模块简介 手势模块PAJ7620主要利用IIC或SPI协议来实现数据的传输本实验用的模块是以IIC来进行信息传输。支持电压从2.8v到3.6v, 正常可以选择3.3v。检测的距离从5到15cm, 可以检测9种手势包括
右编码为 0x01左编码为 0x02上编码为 0x04下编码为 0x08前编码为 0x10后编码为 0x20顺时针编码为 0x40逆时针编码为 0x80挥动编码为 0x0100
1.1、PAJ7620 框图 红色框是实验模块的引脚无SPI其中SDASCL 是IIC协议线INT是手势结果输出引脚输出结果时会触发低电平所以可以利用轮询的方式检测该引脚或者利用外部中断的方式。
1.2、模块原理图 1.3、IIC 协议 这里不过多描述详细可参考51 iic 读写格式如下 PAJ7620的Slave ID 是0x73, 在使用时要左移一位因为IIC中的第一个字节包括SlaveID R/WR/W 确定读或写。
1.4、寄存器 PAJ7620寄存器也挺多都是八位但是每个寄存器功能比较单一。有两个主要的寄存器BANK0和BANK1, 向0xEF 地址写0或写1分别选中BANK0或BANK1。每个BANK下又有好多个8位寄存器。比如
BANK0下包括手势中断的寄存器 BANK1下包括模式选择寄存器手势使用0x00 二、代码
根据上述的IIC读写格式可以对应以下读写代码
uint8_t iic_write_7620(uint8_t devAddress, uint8_t regAddress, uint8_t *data, uint16_t length) {uint16_t cnt;iic_start();iic_send_byte(devAddress 1 | 0);if(iic_wait_ack() NACK){iic_stop();return 1;}iic_send_byte(regAddress);if(iic_wait_ack() NACK) {iic_stop();return 2;}for(cnt 0; cnt length; cnt){iic_send_byte(data[cnt]);if(iic_wait_ack() NACK) {iic_stop();return 3;}}iic_stop();return ACK;
}uint8_t iic_read_7620(uint8_t devAddress, uint8_t regAddress, uint8_t *data, uint16_t length) {uint16_t cnt;iic_start();iic_send_byte(devAddress 1 | 0);if(iic_wait_ack() NACK) {iic_stop();return 1;}iic_send_byte(regAddress);if(iic_wait_ack() NACK) {iic_stop();return 2;}iic_start();iic_send_byte(devAddress 1 | 1);if(iic_wait_ack() NACK) {iic_stop();return 3;}for(cnt 0; cnt length; cnt){data[cnt] iic_read_byte();if(cnt length - 1) {iic_send_ack(NACK);} else {iic_send_ack(ACK);}}iic_stop();return 0;
}
2.1、获取手势的代码
轮询
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(paj7620_getInterrupt()){paj7620_action();}HAL_Delay(20);}
中断记得配置成下降沿触发
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {paj7620_action();
}
手势处理代码
void paj7620_action(void) {uint16_t gCode 0;gCode paj7620_get_gesture();printf(%d》, gCode);switch (gCode) {case 0x01: // uppaj7620_up();break;case 0x02: // downpaj7620_down();break;case 0x04: // leftpaj7620_left();break;case 0x08: // rightpaj7620_right();break;case 0x10: // pushpaj7620_push();break;case 0x20: // poppaj7620_pop();break;case 0x40: // rotate rightpaj7620_rotate_right();break;case 0x80: // rotate leftpaj7620_rotate_left();break;case 0x100:// wavepaj7620_wave();break;case 0x00: // nothingpaj7620_nothing();break;default:paj7620_error();}
}
初始化代码 uint8_t paj_init(void) {uint8_t data 0, rtn 0;uint16_t cnt 0;delay_us(700); //Wait 700us for PAJ7620U2 to stabilizepaj7620_sekect_bank(PAJ7620_BANK0);// 读0x00地址正常会返回0x20rtn iic_read_7620(PAJ7620_ADDRESS, PAJ7620_ADDR_PART_ID_0, data, 1);if(rtn) {return rtn;}if(data ! PAJ7620_PART_ID_0){return 0xff;}// 这一步文档上没有找到说明rtn iic_read_7620(PAJ7620_ADDRESS, PAJ7620_ADDR_PART_ID_1, data, 1);if(rtn){return rtn;}if(data ! PAJ7620_PART_ID_1){return 0xfe;}for (cnt 0; cnt INIT_REG_ARRAY_SIZE; cnt) {rtn iic_write_7620(PAJ7620_ADDRESS, initRegisterArray[cnt][0], initRegisterArray[cnt][1], 1);if(rtn){return rtn;}}paj7620_sekect_bank(PAJ7620_BANK1); //gesture flage reg in Bank1// 这一步文档上没有找到说明//data 0xB7; // far mode 120 fps//data 0x12; // near mode 240 fps//iic_write_7620(PAJ7620_ADDRESS, 0x65, data, 1); paj7620_sekect_bank(PAJ7620_BANK0); //gesture flage reg in Bank0return 0;
}
三、效果 手势小车 手势目前用在了小车上简单操作了小车的左右转向前后进等。
完整版代码评论区留言。