试验目的:利用手势模块检测到特定的手势,实现蜂鸣器、继电器的开启与关闭。在手势读取功能正常后,对负载进行控制。
硬件接线:
PC1 接蜂鸣器模块 高电平使能
PC4 接双路机电元件继电器1 高电平使能
PB8 接双路机电元件继电器2 高电平使能
STM32 cube软件初始化配置:以PC1 为例介绍:
点击生成的底层驱动代码:
IO口配置代码分为:
1:使能所使用IO口时钟;
2:设置IO引脚的初始电平,为低电平
3:配置IO口的模式信息
void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1|GPIO_PIN_4, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); /*Configure GPIO pins : PC1 PC4 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pin : PA5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PB8 */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); }
在生成的代码中添加IO口的操作代码如下:
/*定义蜂鸣器、双路继电器的输出状态控制部分,直接操作对应IO口*/
#define BEEPON HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET); #define BEEPOFF HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET); #define JDQ1ON HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET); #define JDQ1OFF HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET); #define JDQ2ON HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); #define JDQ2OFF HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
最后在手势检测代码中,添加上述继电器控制部分:
如下图所示:
case PAJ_UP: BEEPON ; printf("Up\r\n"); break; case PAJ_DOWN: BEEPOFF ; printf("Down\r\n"); break; case PAJ_LEFT: JDQ1ON ; printf("Left\r\n"); break; case PAJ_RIGHT: JDQ1OFF ; printf("Right\r\n"); break; case PAJ_FORWARD: JDQ2ON ; printf("Forward\r\n"); break; case PAJ_BACKWARD: JDQ2OFF ; printf("Backward\r\n"); break; case PAJ_CLOCKWISE: printf("Clockwise\r\n"); break; case PAJ_COUNT_CLOCKWISE: printf("AntiClockwise\r\n");break; case PAJ_WAVE: printf("Wave\r\n"); break;
然后编译、下载查看试验效果:
1:向上蜂鸣器工作,向下继电器熄灭。
2:向左继电器1吸合,并且板载指示灯工作;向右继电器1断开,并且板载指示灯熄灭;
3:向前继电器2吸合,并且板载指示灯工作;向后继电器2断开,并且板载指示灯熄灭;
演示效果如下:B站视频
https://www.bilibili.com/video/BV11Z8deiEgA/?spm_id_from=333.999.0.0