Arduino上的手势控制灯

图片

大家好!
我很高兴能再次向您展示我的新工艺。
这次,我整理了一个手势控制的arduino灯。

这个项目花了我很多时间,而我一直都缺乏。
我很快安装了第一版的灯泡,对我来说,在面包板上工作得非常好,但是当我将其移至固定位置时,所有灯泡都开始运转,解决了所有冻结,误报和其他问题。 在互联网上进行谷歌搜索时,我在国外站点上发现了许多与APDS9960传感器问题有关的投诉,但没有找到解决这些问题的方法。 我不得不花一些时间研究此传感器的数据表并了解其操作。 最后,它得到了回报,并且我能够编写稳定的工作代码。

因此,一切都井井有条。

灯说明


该灯的主要重点不是可视化,而是手势控制,所有其他功能都是次要的。

指示灯以向左或向右的手势点亮,您也可以以朝向自己的手势将其点亮,但这并不完全方便。 接下来,向左和向右手势,您可以滚动浏览灯光效果。 如果您开始向右翻转,灯泡将首先将其颜色从白色更改为红色,包括所有原色以及它们之间的过渡。

如果在打开灯后开始向左翻转,我们将看到动态照明效果,例如“火”,“矩阵”,“熔岩灯”,“彩虹”,“五彩纸屑”,“火花”,“火热灯”。 如果您需要返回到常规灯,则无需翻转,而可以使用自己的手势关闭灯泡,然后打开这三个手势中的任何一个。
关闭是通过您自己的手势完成的。



亮度由接近和远离传感器的手势来调节。 首先,您需要将手掌尽可能靠近传感器,然后将其急剧抬起。 灯泡将切换到亮度调节模式,使手掌越来越近,您需要找到合适的亮度并将您的手锁定几秒钟,以便保留亮度值。 保持亮度后,灯泡会通过平稳地关闭灯光,然后以新的亮度级别打开来通知您。

我没有特别注意视觉效果,因为我计划在Wemos D1迷你控制器上制作第二个版本的灯泡。 我计划在其中实现理想的一切。 出于同样的原因,我仍然只使用一行LED,它由4个ws2812b灯条组成,而不是四个。

APDS9960中断


实际上,LED灯的主要问题与之相关。 apds9960的中断有自己的生命,它可以从任何事情上发挥作用,例如来自EM干扰或靠近人的传感器,营养波动甚至可能来自其他事物。



首先,我尝试通过更改硬件来解决问题。 即使使用18650电池,电源滤波也无济于事,该传感器仍然可以继续使用。 我试图将INT信号的负载电阻切换到+ 5V,但这也没有带来成功。

随着研究的进行,人们逐渐了解了为什么会发生虚假干扰。 主要问题是红外信号的随机反射。 制造商建议使用黑色橡胶涂层覆盖传感器及其周围的所有物体。 我没有这种油漆,也没有打扰。 尽管可以肯定的是,这可以稍微减少误报的数量。

我编写了过滤掉所有随机触发器的代码,但遇到了另一个问题。 触发中断后,手势信息不会立即通过I2C总线传输,但会有一定的延迟。 并且,如果由于地址LED灯带而导致的电源噪声很大,那么考虑到这些干扰,传输时间将始终是不同的。 我必须考虑到这一事实,并以新的方式重写用于确定手势的代码。

手势定义


如果代码不使用来自传感器的中断,则手势定义没有问题。 但是在这种情况下,多任务处理将丢失。 如果在灯上激活了动态效果,则相应地需要一个循环的,可执行的代码,并且需要中断才能将控制器从周期中删除。

为了提高手势识别的稳定性,还必须降低库中接收器的灵敏度。 为此,请替换SparkFun_APDS9960.h文件中的行:

如果(!setLEDBoost(LED_BOOST_300))

如果(!setLEDBoost(LED_BOOST_150))

如果您是从本文下载的库,则无需执行任何操作,所有内容均已在此处修复。
我还实验性地选择了50 mA LED的电流,在该状态下手势最稳定,不需要用100 mA的电流强行驱动红外LED。

而且,我还把微控制器放在灯的底部,而手势传感器放在了顶盖上,这是一个错误。 因此,要连接arduino和apds9960,我必须使用30厘米长的电线,这也增加了传感器的不稳定性。 结果,我以编程方式克服了所有这些问题。

方案




为了给设备供电,我使用了智能手机上的充电器,其输出电压为5V,电流为2A。 但实际上,以最大亮度打开的白光灯消耗的电流不会超过1.3A。因此,任何输出电流至少为1.3 A的电源都是合适的。

dc-dc mini360稳定器可以用任何其他降压转换器替代,其输出电流至少为150 mA。

在下图中,我没有使用逻辑电平转换器,但这是我个人的决定。 因此,如果您在没有TTL电平转换器的情况下连接了APDS9960传感器,我将不承担任何提前责任。

可以使用Arduino UNO控制器或其克隆代替Arduino Nano。

请务必检查手势传感器上是否存在跳线,它们在下面的照片中以红色标记。 如果没有焊锡,则应在这些接触轨道上使用烙铁,然后涂抹并加热焊料,直至形成均匀的液滴。 现在中国人正在提供不带跳线的传感器。 如果没有这些跳线,则无法保证传感器的运行。



使用的组件


Arduino Nano-1个
手势传感器APDS9960-1个
LED灯带ws2812b-4个
Mini360降压转换器-1个
连接线-1套。

Arduino的程式码


该代码分为两部分。 第一部分是与传感器配合使用的主要代码,第二部分是所有照明效果的代码。

您可以通过类似于我的代码的方式自己添加任何效果,但最重要的是,不要忘记添加一个函数来使手势退出循环效果。 为此, 如果(check_int())返回,则在循环末尾添加以下行

程序主要功能的说明
processingGesture()处理来自手势传感器的中断。
processingProximity()处理来自接近传感器的中断。
gesture_int()-手势传感器的中断处理程序。
distance_int()-来自接近传感器的中断处理程序。

常数说明


APDS9960_INT-外部中断的输入。 Arduino Nano和UNO只有两个这样的输入2和3。

PIN-在这里,您需要指定LED灯条的输出。 您可以指定与ws2812b皮带连接的任何数字引脚。

NUM_PIX-在这里我们指示所用磁带中的地址LED数量。
范围-误差极限为0到10。如果在调节亮度时将一只手固定在传感器上方2秒钟,则应该保存读数,但是如果不保存读数,则逐渐增大误差极限。

下载APDS9960库
下载灯草图

显示灯泡操作的视频



总结


现场灯光看起来比视频中的要好。 现在,从我这里看到他的每个人都被要求为他们收集同样的东西。 目前,我不喜欢亮度调节的工作原理,但是我正在研究它。 我不保证很快,但是灯的下一个版本已经在开发中。

感谢您阅读本文的结尾! 如果仍有问题,可以在文章下方的评论中提问。

聚苯乙烯


灯的灵感在这里
我在这里发挥了主要作用

Source: https://habr.com/ru/post/zh-CN484278/


All Articles