本来按照计划,在完成开发环境的搭建后,是要开发板能挂上显示屏的。有了显示屏,可以很方便地吧中间调试过程显示出来,作为参考,方便调试程序。可是看着那个手势传感器,总感觉不测试下心里不踏实。于是乎,最开始也没用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显示屏来显示。