物联网开发112 - Micropython ESP32 C3连接PAJ7620手势识别传感器

一、目的

        这一节我们来学习如何使用合宙ESP32 C3,连接0.96寸ssd1306屏幕、PAJ7620手势传感器,进行一个小实验。

二、环境

        ESP32 C3开发板(MicroPython v1.19.1 on 2022-06-18)+ I2C 0.96寸ssd1306屏幕模块+ PAJ7620手势传感器  + 几根杜邦线 + Win10商业版

        ESP32 C3和各个模块接线方法:


三、演示示例代码

        PAJ7620_example:

from machine import Pin,I2C
from ssd1306 import SSD1306_I2C
from paj7260 import PAJ7260
from ufont import BMFont
import time

font = BMFont("fonts/unifont-14-12888-16.v3.bmf")

i2c  = I2C(0,scl = Pin(5),sda = Pin(4),freq = 400_000)
oled = SSD1306_I2C(128,64,i2c,0X3C)

led = Pin(12,Pin.OUT)
paj = PAJ7260(i2c)

def PAJ7260():
    Gesture = [" ","Forward-前","Backward-后","Right-右","Left-左","Up-上","Down-下","Clockwise-顺","anti-clockwise-逆","Wave-波浪"]
    
    get = paj.return_gesture()
    
    if get != 0:
        font.text(oled,"%s"%(Gesture[get]),int((128 - len(Gesture[get]*8))/2),24,color=1,font_size=16,reverse=False,clear=True,show=True,half_char=True,auto_wrap=True)
        print("%s"%(Gesture[get]))
        
        if Gesture[get] == Gesture[9]:
            led.value(not led.value())
        else:
            led.value(0)
        
def main():
    #print("adrr = %#X %#X"%(i2c.scan()[0],i2c.scan()[1]))
    oled.contrast(255)
    oled.clear()
    font.text(oled,"手势传感器",24,24,color=1,font_size=16,reverse=False,clear=False,show=True,half_char=True,auto_wrap=True)
    
    while True:
        PAJ7260()


if __name__ == "__main__":
    main()

演示效果:

 

 Thonny 打印输出:

四、PAJ7620手势传感器驱动

        paj7260.py

import time
import machine

#Registers and variables for the gesture sensor
GES_REACTION_TIME=0.5
# You can adjust the reaction time according to the actual circumstance.
GES_ENTRY_TIME   =0.8
# When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s).
GES_QUIT_TIME    =1.0

BANK0 = 0
BANK1 = 1

PAJ7620_ADDR_BASE=0x00
#REGISTER BANK SELECT
PAJ7620_REGITER_BANK_SEL =(PAJ7620_ADDR_BASE + 0xEF)	#W
#DEVICE ID
PAJ7620_ID=0x73

#REGISTER BANK 0
PAJ7620_ADDR_SUSPEND_CMD	    =(PAJ7620_ADDR_BASE + 0x3)	#W
PAJ7620_ADDR_GES_PS_DET_MASK_0	=(PAJ7620_ADDR_BASE + 0x41)	#RW
PAJ7620_ADDR_GES_PS_DET_MASK_1	=(PAJ7620_ADDR_BASE + 0x42)	#RW
PAJ7620_ADDR_GES_PS_DET_FLAG_0	=(PAJ7620_ADDR_BASE + 0x43)	#R
PAJ7620_ADDR_GES_PS_DET_FLAG_1	=(PAJ7620_ADDR_BASE + 0x44)	#R
PAJ7620_ADDR_STATE_INDICATOR	=(PAJ7620_ADDR_BASE + 0x45)	#R
PAJ7620_ADDR_PS_HIGH_THRESHOLD	=(PAJ7620_ADDR_BASE + 0x69)	#RW
PAJ7620_ADDR_PS_LOW_THRESHOLD	=(PAJ7620_ADDR_BASE + 0x6A)	#RW
PAJ7620_ADDR_PS_APPROACH_STATE	=(PAJ7620_ADDR_BASE + 0x6B)	#R
PAJ7620_ADDR_PS_RAW_DATA	    =(PAJ7620_ADDR_BASE + 0x6C)	#R

#REGISTER BANK 1
PAJ7620_ADDR_PS_GAIN		    =(PAJ7620_ADDR_BASE + 0x44)	#RW
PAJ7620_ADDR_IDLE_S1_STEP_0	    =(PAJ7620_ADDR_BASE + 0x67)	#RW
PAJ7620_ADDR_IDLE_S1_STEP_1	    =(PAJ7620_ADDR_BASE + 0x68)	#RW
PAJ7620_ADDR_IDLE_S2_STEP_0	    =(PAJ7620_ADDR_BASE + 0x69)	#RW
PAJ7620_ADDR_IDLE_S2_STEP_1	    =(PAJ7620_ADDR_BASE + 0x6A)	#RW
PAJ7620_ADDR_OP_TO_S1_STEP_0	=(PAJ7620_ADDR_BASE + 0x6B)	#RW
PAJ7620_ADDR_OP_TO_S1_STEP_1	=(PAJ7620_ADDR_BASE + 0x6C)	#RW
PAJ7620_ADDR_OP_TO_S2_STEP_0	=(PAJ7620_ADDR_BASE + 0x6D)	#RW
PAJ7620_ADDR_OP_TO_S2_STEP_1	=(PAJ7620_ADDR_BASE + 0x6E)	#RW
PAJ7620_ADDR_OPERATION_ENABLE	=(PAJ7620_ADDR_BASE + 0x72)	#RW

#PAJ7620_REGITER_BANK_SEL
PAJ7620_BANK0=0
PAJ7620_BANK1=1

#PAJ7620_ADDR_SUSPEND_CMD
PAJ7620_I2C_WAKEUP	=1
PAJ7620_I2C_SUSPEND	=0

#PAJ7620_ADDR_OPERATION_ENABLE
PAJ7620_ENABLE=1
PAJ7620_DISABLE=0

#ADC, delete
REG_ADDR_RESULT = 0x00
REG_ADDR_ALERT  = 0x01
REG_ADDR_CONFIG = 0x02
REG_ADDR_LIMITL = 0x03
REG_ADDR_LIMITH = 0x04
REG_ADDR_HYST   = 0x05
REG_ADDR_CONVL  = 0x06
REG_ADDR_CONVH  = 0x07

GES_RIGHT_FLAG           =1<<0
GES_LEFT_FLAG            =1<<1
GES_UP_FLAG              =1<<2
GES_DOWN_FLAG            =1<<3
GES_FORWARD_FLAG         =1<<4
GES_BACKWARD_FLAG        =1<<5
GES_CLOCKWISE_FLAG       =1<<6
GES_COUNT_CLOCKWISE_FLAG =1<<7
GES_WAVE_FLAG            =1<<0

#Gesture output
FORWARD 		= 1
BACKWARD 		= 2
RIGHT			= 3
LEFT			= 4
UP			    = 5
DOWN			= 6
CLOCKWISE		= 7
ANTI_CLOCKWISE	= 8
WAVE			= 9

#Initial register state
initRegisterArray=( [0xEF,0x00],[0x32,0x29],[0x33,0x01],[0x34,0x00],[0x35,0x01],[0x36,0x00],
[0x37,0x07],[0x38,0x17],[0x39,0x06],[0x3A,0x12],[0x3F,0x00],[0x40,0x02],[0x41,0xFF],[0x42,0x01],
[0x46,0x2D],[0x47,0x0F],[0x48,0x3C],[0x49,0x00],[0x4A,0x1E],[0x4B,0x00],[0x4C,0x20],[0x4D,0x00],
[0x4E,0x1A],[0x4F,0x14],[0x50,0x00],[0x51,0x10],[0x52,0x00],[0x5C,0x02],[0x5D,0x00],[0x5E,0x10],
[0x5F,0x3F],[0x60,0x27],[0x61,0x28],[0x62,0x00],[0x63,0x03],[0x64,0xF7],[0x65,0x03],[0x66,0xD9],
[0x67,0x03],[0x68,0x01],[0x69,0xC8],[0x6A,0x40],[0x6D,0x04],[0x6E,0x00],[0x6F,0x00],[0x70,0x80],
[0x71,0x00],[0x72,0x00],[0x73,0x00],[0x74,0xF0],[0x75,0x00],[0x80,0x42],[0x81,0x44],[0x82,0x04],
[0x83,0x20],[0x84,0x20],[0x85,0x00],[0x86,0x10],[0x87,0x00],[0x88,0x05],[0x89,0x18],[0x8A,0x10],
[0x8B,0x01],[0x8C,0x37],[0x8D,0x00],[0x8E,0xF0],[0x8F,0x81],[0x90,0x06],[0x91,0x06],[0x92,0x1E],
[0x93,0x0D],[0x94,0x0A],[0x95,0x0A],[0x96,0x0C],[0x97,0x05],[0x98,0x0A],[0x99,0x41],[0x9A,0x14],
[0x9B,0x0A],[0x9C,0x3F],[0x9D,0x33],[0x9E,0xAE],[0x9F,0xF9],[0xA0,0x48],[0xA1,0x13],[0xA2,0x10],
[0xA3,0x08],[0xA4,0x30],[0xA5,0x19],[0xA6,0x10],[0xA7,0x08],[0xA8,0x24],[0xA9,0x04],[0xAA,0x1E],
[0xAB,0x1E],[0xCC,0x19],[0xCD,0x0B],[0xCE,0x13],[0xCF,0x64],[0xD0,0x21],[0xD1,0x0F],[0xD2,0x88],
[0xE0,0x01],[0xE1,0x04],[0xE2,0x41],[0xE3,0xD6],[0xE4,0x00],[0xE5,0x0C],[0xE6,0x0A],[0xE7,0x00],
[0xE8,0x00],[0xE9,0x00],[0xEE,0x07],[0xEF,0x01],[0x00,0x1E],[0x01,0x1E],[0x02,0x0F],[0x03,0x10],
[0x04,0x02],[0x05,0x00],[0x06,0xB0],[0x07,0x04],[0x08,0x0D],[0x09,0x0E],[0x0A,0x9C],[0x0B,0x04],
[0x0C,0x05],[0x0D,0x0F],[0x0E,0x02],[0x0F,0x12],[0x10,0x02],[0x11,0x02],[0x12,0x00],[0x13,0x01],
[0x14,0x05],[0x15,0x07],[0x16,0x05],[0x17,0x07],[0x18,0x01],[0x19,0x04],[0x1A,0x05],[0x1B,0x0C],
[0x1C,0x2A],[0x1D,0x01],[0x1E,0x00],[0x21,0x00],[0x22,0x00],[0x23,0x00],[0x25,0x01],[0x26,0x00],
[0x27,0x39],[0x28,0x7F],[0x29,0x08],[0x30,0x03],[0x31,0x00],[0x32,0x1A],[0x33,0x1A],[0x34,0x07],
[0x35,0x07],[0x36,0x01],[0x37,0xFF],[0x38,0x36],[0x39,0x07],[0x3A,0x00],[0x3E,0xFF],[0x3F,0x00],
[0x40,0x77],[0x41,0x40],[0x42,0x00],[0x43,0x30],[0x44,0xA0],[0x45,0x5C],[0x46,0x00],[0x47,0x00],
[0x48,0x58],[0x4A,0x1E],[0x4B,0x1E],[0x4C,0x00],[0x4D,0x00],[0x4E,0xA0],[0x4F,0x80],[0x50,0x00],
[0x51,0x00],[0x52,0x00],[0x53,0x00],[0x54,0x00],[0x57,0x80],[0x59,0x10],[0x5A,0x08],[0x5B,0x94],
[0x5C,0xE8],[0x5D,0x08],[0x5E,0x3D],[0x5F,0x99],[0x60,0x45],[0x61,0x40],[0x63,0x2D],[0x64,0x02],
[0x65,0x96],[0x66,0x00],[0x67,0x97],[0x68,0x01],[0x69,0xCD],[0x6A,0x01],[0x6B,0xB0],[0x6C,0x04],
[0x6D,0x2C],[0x6E,0x01],[0x6F,0x32],[0x71,0x00],[0x72,0x01],[0x73,0x35],[0x74,0x00],[0x75,0x33],
[0x76,0x31],[0x77,0x01],[0x7C,0x84],[0x7D,0x03],[0x7E,0x01])

class PAJ7260(object):
	"""initialize the sensor"""
	def __init__(self, i2c=None,address=PAJ7620_ID):
		self.i2c = i2c
		self.address=address
		time.sleep(0.001)
		self.paj7620SelectBank(BANK0)
		self.paj7620SelectBank(BANK0)
		data0=self.paj7620ReadReg(0,1)[0]
		data1=self.paj7620ReadReg(1,1)[0]
		if data0!=0x20:
			print("Error with sensor")
		print("paj7260 initialize register finished")
		for i in range(len(initRegisterArray)):
			self.paj7620WriteReg(initRegisterArray[i][0],initRegisterArray[i][1])
		self.paj7620SelectBank(BANK0)

	# Write a byte to a register on the Gesture sensor
	def paj7620WriteReg(self,addr,cmd):
		buf=bytearray(1)
		buf[0]=cmd
		self.i2c.writeto_mem(self.address,addr,buf)
	# Select a register bank on the Gesture sensor
	def paj7620SelectBank(self,bank):
		if bank==BANK0:
			self.paj7620WriteReg(PAJ7620_REGITER_BANK_SEL,PAJ7620_BANK0)
	# Read a block of bytes of length "qty" starting at address "addr" from the Gesture sensor
	def paj7620ReadReg(self,addr,qty):
		return self.i2c.readfrom_mem(self.address,addr,qty)

	#Print the values from the gesture sensor
	def print_gesture(self):
		data=self.paj7620ReadReg(0x43,1)[0]
		if data==GES_RIGHT_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				print("Forward")
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				print("Backward")
				time.sleep(GES_QUIT_TIME)
			else:
				print("Right")

		elif data==GES_LEFT_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				print("Forward")
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				print("Backward")
				time.sleep(GES_QUIT_TIME)
			else:
				print("Left")

		elif data==GES_UP_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				print("Forward")
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				print("Backward")
				time.sleep(GES_QUIT_TIME)
			else:
				print("Up")

		elif data==GES_DOWN_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				print("Forward")
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				print("Backward")
				time.sleep(GES_QUIT_TIME)
			else:
				print("Down")

		elif data==GES_FORWARD_FLAG:
			print("Forward")
			time.sleep(GES_QUIT_TIME)

		elif data==GES_BACKWARD_FLAG:
			print("Backward")
			time.sleep(GES_QUIT_TIME)

		elif data==GES_CLOCKWISE_FLAG:
			print("Clockwise")

		elif data==GES_COUNT_CLOCKWISE_FLAG:
			print("anti-clockwise")

		else:
			data1=self.paj7620ReadReg(0x44, 1)[0]
			if (data1 == GES_WAVE_FLAG):
				print("wave")
	#Return a vlaue from the gestire sensor which can be used in a program
	# 	0:nothing
	# 	1:Forward
	# 	2:Backward
	# 	3:Right
	# 	4:Left
	# 	5:Up
	# 	6:Down
	# 	7:Clockwise
	# 	8:anti-clockwise
	# 	9:wave
	def return_gesture(self):

		data=self.paj7620ReadReg(0x43,1)[0]
		if data==GES_RIGHT_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				return 1
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				return 2
				time.sleep(GES_QUIT_TIME)
			else:
				return 3

		elif data==GES_LEFT_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				return 1
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				return 2
				time.sleep(GES_QUIT_TIME)
			else:
				return 4

		elif data==GES_UP_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				return 1
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				return 2
				time.sleep(GES_QUIT_TIME)
			else:
				return 5

		elif data==GES_DOWN_FLAG:
			time.sleep(GES_ENTRY_TIME)
			data=self.paj7620ReadReg(0x43, 1)[0]
			if data == GES_FORWARD_FLAG:
				return 1
				time.sleep(GES_QUIT_TIME)
			elif data == GES_BACKWARD_FLAG:
				return 2
				time.sleep(GES_QUIT_TIME)
			else:
				return 6

		elif data==GES_FORWARD_FLAG:
			return 1
			time.sleep(GES_QUIT_TIME)

		elif data==GES_BACKWARD_FLAG:
			return 2
			time.sleep(GES_QUIT_TIME)

		elif data==GES_CLOCKWISE_FLAG:
			return 7

		elif data==GES_COUNT_CLOCKWISE_FLAG:
			return 8

		else:
			data1=self.paj7620ReadReg(0x44, 1)[0]
			if (data1 == GES_WAVE_FLAG):
				return 9
		return 0

五、ssd1306 oled 屏幕驱动和字库

        请查看这个文章获取:

物联网开发107 - Micropython ESP32 C3接DS1307时钟模块在SSD1306屏幕上显示时间_魔都飘雪的博客-CSDN博客Micropython ESP32 C3连接DS1307时钟模块在SSD1306屏幕上显示时间https://blog.csdn.net/zhusongziye/article/details/130535482?spm=1001.2014.3001.5502六、PAJ7620手势传感器购买

https://item.taobao.com/item.htm?spm=a1z09.8149145.0.0.359f53c04BND78&id=624223706187&_u=jp01rch3f3dicon-default.png?t=N4HBhttps://item.taobao.com/item.htm?spm=a1z09.8149145.0.0.359f53c04BND78&id=624223706187&_u=jp01rch3f3d

  • 品牌:BEGKTOTH

资料下载:https://pan.baidu.com/s/1qFek4bvCLyvvf-eywhjy5A 提取码:f7ng 
 

产品简介:
           本产品基于PAJ7620U2手势识别传感器,它可以识别9种不同方向的手势,包括上、下左、右、前、后、顺时针、逆时针、摇摆。手势识别模块使用II2C接口,使用相应arduino库函数即可编程控制,手势识别模块返回的信号可用作为机器人接收的控制信号,从而实现对机器人的控制。内置的识别算法相当只能,能够把双手从生硬的按键中解放出来。手势识别传感器可用于非接触式控制场景如非接触式鼠标,智能家居,汽车点击设备控制,机器人交互等。

产品特性:
1.9种手势识别

2.接口:IIC接口通讯协议
3.工作电压:3.3V-5.0V
4.手势速度在正常模式下为60°/S至600°/S,游戏模式为60°/S至1200°/S
5.环境光免疫力:<100K Lux
6.工作电流:3mA-10mA
7.模块尺寸:20mm*15mm

接口定义:

1.GND:   电源负极输入口
2.VCC:    电源正极输入口
3.SCL:    I2C时钟端口
4.SDA:    I2C数据端口
5.INT:    中断输出
接线口距:2.54mm(两孔圆形距离)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔都飘雪

您的1毛奖励是我创作的源源动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值