一、原料
STM32H503主控板:用于收集信号、处理信号,控制灯的亮灭。
PAJ7620U2传感器:用于收集手势信息,分辨手势类型。
继电器模块:隔离强弱电。主控板使用的是3V~5V电压,灯使用的是12V电压。继电器模块就负责使用低电压驱动高电压的模块。
卤素灯:驱动电压12V,电流1A。用于照明。震动电机模块:是使用一个微型空心杯直流有刷电机带动一个偏心轮旋转,产生震动,多用于提示作用。
将以上各个模块使用杜邦线进行连接。卤素灯插接在实验板上,与继电器高压部分连接,并接入12V电源。开发板和传感器通过type-c与电脑连接,并通过usb口供电。
二、手势动作映射
玩单片机最大的乐趣就是让单片机服从自己的命令,按自己的要求实现对应的动作。这里PAJ7620U2手势传感器,可以感知到左、右、上、下、旋转等手势动作。我们需要做的事情就是将这些动作对应到两颗卤素灯的亮灭和震动马达模块的动作上去。这里建立映射关系。
手势类型 | 向左滑 | 向右滑 | 向上滑 | 向下滑 | 顺时针旋转 | 逆时针旋转 |
左灯 | 亮 | 灭 | 亮 | 亮 | × | × |
右灯 | 灭 | 亮 | 灭 | 灭 | × | × |
震动模块 | × | × | × | × | 震动 | 停 |
三、实现
首先使用STM32CubeMX添加3个管脚PB6、PB7、PC5,设置为输出,分别起名为SW1、SW2、SW3。分别用来驱动左右卤素灯和震动模块。对应到开发板上,三个管脚是挨着的,方便接线。
配置I2C1,用于连接PAJ7620U2手势传感器。另外配置好USART3,用于通过usb串口调试程序。
代码部分逻辑比较简单,通过编码读取手势传感器获取到的手势,然后驱动对应的GPIO动作。
uint8_t getGesture(void) { uint16_t tmp; eGesture_t _gesture; uint16_t Gesture_Data = DEV_I2C_ReadWord(PAJ_INT_FLAG1); // Read Bank_0_Reg_0x43/0x44 for gesture result. // printf("2 Gesture_Data=%x\n",Gesture_Data); _gesture = Gesture_Data & 0x00ff; if (_gesture != eGestureNone) { // DBG(""); switch (_gesture) { case eGestureRight: printf("Right Event Detected\n"); return PAJ_RIGHT; break; case eGestureLeft: printf("Left Event Detected\n"); return PAJ_LEFT; break; case eGestureUp: printf("Up Event Detected\n"); return PAJ_UP; break; case eGestureDown: printf("Down Event Detected\n"); return PAJ_DOWN; break; case eGestureClockwise: printf("Clockwise Event Detected\n"); return PAJ_CLOCKWISE; break; case eGestureAntiClockwise: printf("anti-clockwise Event Detected\n"); return PAJ_COUNT_CLOCKWISE; break; default: break; } } return _gesture; }
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_I2C1_Init(); MX_ICACHE_Init(); MX_USART1_UART_Init(); MX_USART3_UART_Init(); MX_USB_PCD_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ printf("Gesture Sensor Test Program ...\r\n"); if(!PAJ7620U2_init()) { printf("\nGesture Sensor Error\r\n"); return 0; } printf("\nGesture Sensor OK\r\n"); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //printf("%d\n",getGesture()); //HAL_Delay(700); switch (getGesture()) { case PAJ_RIGHT: HAL_GPIO_WritePin(SW1_GPIO_Port,SW1_Pin,GPIO_PIN_SET); //1 HAL_GPIO_WritePin(SW2_GPIO_Port,SW2_Pin,GPIO_PIN_RESET); //0 break; case PAJ_LEFT: HAL_GPIO_WritePin(SW1_GPIO_Port,SW1_Pin,GPIO_PIN_RESET); //0 HAL_GPIO_WritePin(SW2_GPIO_Port,SW2_Pin,GPIO_PIN_SET); //1 break; case PAJ_UP: HAL_GPIO_WritePin(SW1_GPIO_Port,SW1_Pin,GPIO_PIN_SET); // HAL_GPIO_WritePin(SW2_GPIO_Port,SW2_Pin,GPIO_PIN_SET); // break; case PAJ_DOWN: HAL_GPIO_WritePin(SW1_GPIO_Port,SW1_Pin,GPIO_PIN_RESET); //0 HAL_GPIO_WritePin(SW2_GPIO_Port,SW2_Pin,GPIO_PIN_RESET); //1 break; case PAJ_CLOCKWISE: HAL_GPIO_WritePin(SW3_GPIO_Port,SW3_Pin,GPIO_PIN_SET); //1 break; case PAJ_COUNT_CLOCKWISE: HAL_GPIO_WritePin(SW3_GPIO_Port,SW3_Pin,GPIO_PIN_RESET); //1 break; default: HAL_Delay(100); break; } } /* USER CODE END 3 */ }
四、效果演示
将所有的模块通过杜邦线进行连接。继电器使用5V电源,震动模块使用3.3V电源。信号线与GPIO管脚连接。就可以通过手势控制两颗卤素灯的亮灭了。
https://www.bilibili.com/video/BV1eZ421H7oM/