在进阶作业的基础之上,发挥想象力,发挥主观能动性。在新场景下,成功部署手势控制功能等。或者对手势翻页笔进行合理、有效扩展。总之,让我们看到你的创新,看到你的实现即可。以上是优秀作业的要求,结合还有两个器件没有使用,我们在这里将手势传感器/继电器/蜂鸣器进行综合使用,做一个具有开门提醒功能手势控制锁。
硬件介绍:
首先我们进一步了解一下这两个模块。
蜂鸣器模块:
这个就相对简单一些了,直接通过IO口的高低电平进行控制就可以了,蜂鸣器也是也不能常响,感官会很不舒服;
继电器模块:
之前感觉这个模块好重啊,原来里面是带着结构的,不过这些都不重要的,实际上不跑高压交流电,问题不大。在使用这个模块之前,我们还是要好好一下,给模块上有两个继电器,不过咱们这次用一个就可以了,控制信号可以看到上面有一个三极管,这个继电器是5V供电的,直接用MCU控制是不行的,不过有了这个三极管应该就没什么问题了。继电器分为常闭和常开,所以硬件连接上需要把供电端放到COM口,然后ON端连接到需要控制的器件。
控制器件:
这次控制的器件是一个电磁锁,也就说我们需要用手势控制这个锁的开和关,该电磁锁使用12V供电。
软件介绍
围绕着上面的器件,结合手势传感器和主控板,我们需要实现的具体功能就是,通过采集手势传感器的手势(这里选择了left和right)控制电磁锁的开关,由于电磁锁的电压过高,中间需要一个继电器来实现承接;
继电器模块使用5V供电,不过上有三极管控制电路,可以使用MCU的引脚进行直接控制;
有效的手势需要进行蜂鸣器的提示;
到这里实现的所有功能都进行了罗列,实际上逻辑控制并不复杂,也用不到手势翻页笔中我认为最难得USB部分,我们可以直接在手势采集中进行处理。
代码基本上只是增加了一些蜂鸣器和继电器的控制部分:
#define Buzz_On HAL_GPIO_WritePin(Buzz_GPIO_Port, Buzz_Pin, GPIO_PIN_SET) #define Buzz_Off HAL_GPIO_WritePin(Buzz_GPIO_Port, Buzz_Pin, GPIO_PIN_RESET) #define SRD_On HAL_GPIO_WritePin(SRD_GPIO_Port, SRD_Pin, GPIO_PIN_SET) #define SRD_Off HAL_GPIO_WritePin(SRD_GPIO_Port, SRD_Pin, GPIO_PIN_RESET) uint16_t Buzz_time_cnt = 0; uint8_t Buzz_flag = 0; while(1) { if(Buzz_flag == 1) { Buzz_time_cnt++; if(Buzz_time_cnt%100 == 0) { Buzz_flag = 0; Buzz_time_cnt = 0; Buzz_Off; } } time_cnt++; if(time_cnt >= 200) { time_cnt = 0; /* 获取手势 */ ret = PAJ7620_get_gesture(&gesture); if (ret == PAJ7620_EOK) { switch (gesture) { case PAJ7620_GESTURE_LEFT: { if(Buzz_flag == 0) { Buzz_flag = 1; Buzz_time_cnt = 0; Buzz_On; } SRD_Off; printf("Gesture: Left\r\n"); break; } case PAJ7620_GESTURE_RIGHT: { if(Buzz_flag == 0) { Buzz_flag = 1; Buzz_time_cnt = 0; Buzz_On; } SRD_On; printf("Gesture: Right\r\n"); break; } default: { break; } } } } }
效果展示:
本次的效果展示是通过视频的方式进行,通过实物操作进行讲解。
【番外篇:手势电磁锁效果展示】 https://www.bilibili.com/video/BV1i3g9ehEkf/?share_source=copy_web&vd_source=2a202874768d99b0acaa1aceb9a9b93e