本来按照计划,在完成开发环境的搭建后,是要开发板能挂上显示屏的。有了显示屏,可以很方便地吧中间调试过程显示出来,作为参考,方便调试程序。可是看着那个手势传感器,总感觉不测试下心里不踏实。于是乎,最开始也没用NUCLEO-H503RB开发板来测试,而是选在最快捷的方式,使用Arduino来测试。因为用Arduino是最快捷的方式。如果能找到对应的支持库。就能找到现成的例子,来测试传感器模块是否可用。
在安装支持库之前,首先得确认传感器所用到的芯片的型号才行。在经过各种查找、对比之后,终于确认本次《DigiKey手势翻页笔活动》中所使用的手势传感器,用的是PAJ7620。于是打开Arduino IDE,查找并安装支持库,找到了几个,但经过编译测试,发现RevEng PAJ7620 by Aaron S.Crandall的好用。
测试的时候,只需要按照以下方式做好连接就可以。
ESP8266 PAJ7620
============================
D1 SCL
D2 SDA
============================
实际上传感器也就提供了4跳线,另外两个是VCC和GND。测试程序使用“paj7620_9_gestures.ino”就可以。代码如下:
/*
Example Script: paj7620_9_gestures.ino
Package: RevEng_PAJ7620
Copyright (c) 2020 Aaron S. Crandall
Author : Aaron S. Crandall <crandall@gonzaga.edu>
Modified Time : December 2020
Description: This demo can recognize 9 gestures and output the result,
including move up, move down, move left, move right, move forward,
move backward, circle-clockwise, circle-counter clockwise, and wave.
License: Same as package under MIT License (MIT)
*/
/*
接线方式
-------------------------------------
ESP8266 PAJ7620
============================
D1 SCL
D2 SDA
============================
支持库位置:
C:\Users\HP\Documents\Arduino\libraries\Gesture_PAJ7620
paj7620.cpp
paj7620.h
/*
enum {
// REGISTER 0
GES_RIGHT_FLAG = BIT(0),
GES_LEFT_FLAG = BIT(1),
GES_UP_FLAG = BIT(2),
GES_DOWN_FLAG = BIT(3),
GES_FORWARD_FLAG = BIT(4),
GES_BACKWARD_FLAG = BIT(5),
GES_CLOCKWISE_FLAG = BIT(6),
GES_COUNT_CLOCKWISE_FLAG = BIT(7),
//REGISTER 1
GES_WAVE_FLAG = BIT(0),
};
*/
*/
// Includes enum definition of GES_* return values from readGesture()
#include "RevEng_PAJ7620.h"
// Create gesture sensor driver object
RevEng_PAJ7620 sensor = RevEng_PAJ7620();
// *********************************************************************
void setup() {
Serial.begin(115200);
Serial.println("PAJ7620 sensor demo: Recognizing all 9 gestures.");
// return value of 0 == success
if( !sensor.begin() ) {
Serial.print("PAJ7620 I2C error - halting");
while(true) { }
}
Serial.println("PAJ7620 init: OK");
Serial.println("Please input your gestures:");
}
// *********************************************************************
void loop() {
Gesture gesture; // Gesture is an enum type from RevEng_PAJ7620.h
gesture = sensor.readGesture(); // Read back current gesture (if any) of type Gesture
switch (gesture) {
case GES_FORWARD:
Serial.print("GES_FORWARD");
break;
case GES_BACKWARD:
Serial.print("GES_BACKWARD");
break;
case GES_LEFT:
Serial.print("GES_LEFT");
break;
case GES_RIGHT:
Serial.print("GES_RIGHT");
break;
case GES_UP:
Serial.print("GES_UP");
break;
case GES_DOWN:
Serial.print("GES_DOWN");
break;
case GES_CLOCKWISE:
Serial.print("GES_CLOCKWISE");
break;
case GES_ANTICLOCKWISE:
Serial.print("GES_ANTICLOCKWISE");
break;
case GES_WAVE:
Serial.print("GES_WAVE");
break;
case GES_NONE:
break;
}
if( gesture != GES_NONE ) {
Serial.print(", Code: ");
Serial.println(gesture);
}
delay(100);
}到这里已经确认传感器是可以安心使用的了。paj7620的中文资料我还没有找到,自己英文又不好,大抵上也就是为照猫画虎地拷贝、粘贴、修改,借鉴别人的程序,做出自己想要的。
实际上,把程序移植到STM32 的开发板上,这个过程也不是很容易,查资料、读代码,理解处理过程等,折腾了一两天,才基本上搞通。
传感器使用I2C方式通讯,前面我处理程序时已经预留了两个GPIO口,专门用于手势传感器通讯的,这次刚好用上。使用的是模拟I2C通讯的方式。其实STM32H503本身是提供了I2C通讯接口的。但我以前使用I2C外设通讯时,感觉处理过程很麻烦,不如模拟方式起来的一步到位,不需要考虑通讯过程到了哪一步、通讯状态是什么样子等。另外因为I2C子设备地址的不同,也是可以使用OLED使用同一组总线的。但为了调试方便,最终还是分开来做的。最终通过PC2和PC3模拟I2C实现了对传感器的驱动。

上电测试后的结果看,效果还不错。

传感器反应还挺灵敏,尤其是对上、下、左、右、靠近、远离这几个动作。目前处理结果和调试信息还是通过串口打印出来的。后面还是要用OLED或者TFT显示屏来显示。
我要赚赏金
