为业余项目添加运动和方向感应
不知道为什么,一直以来,我业余就是爱好搞搞 LED 项目。就像我那句口头禅:“看到闪闪发光的 LED,我就会流口水。”最近,我迷上了在我的业余项目中添加运动和方向感应。实际上,我刚刚在一个 12 x 12 的乒乓球阵列上添加了该功能,每个乒乓球都配备一个三色 LED。
但是,或许我应该从头说起。大约在 2020 年春季,我与一位澳大利亚的退休工程师朋友 David Humrich 通过电子邮件聊天。David 告诉我,他买到一个小型矩阵式三色 LED,问我对如何使用它有何建议。在回信中,我发了一个简单蠕虫程序短视频,这是我在几年前用一个 8 x 8 LED 阵列实现的。
为 David 制作此视频时,我想起了一个搁置的项目,那就是做一个更大的阵列。我看过一些用乒乓球制作的非常有趣的显示器,所以我决定也这样做。我首先购买了一大袋物美价廉的乒乓球,然后将其粘成一个 12 x 12 = 144 的阵列(图 1)。
图 1:笔者自豪地拿着他的 12 x 12 的乒乓球阵列,每个乒乓球包含一个三色 LED(图片来源:Max Maxfield)
在 LED 选择方面,此类项目的绝佳选择是来自 Adafruit 的 NeoPixel,它基于 WS2818 三通道 LED 驱动器。比如 1376 灯带每米就有 30 个 NeoPixel。这条五米长的灯带提供了 150 个像素点:阵列使用 144 个,一个用作电压电平转换器,其余五个备用。我将灯带分割为单个像素点,然后在每个乒乓球的背面贴上一个像素点。
我最终采用了蛇形(之字形)布线模式,从一个角落开始,然后在阵列上来回穿梭。如果您决定打造自己的阵列,所有像素点的连接顺序实际上是无所谓的。我们把该阵列看成 12 列(X 轴)x 12 行(Y 轴),行和列的编号均从 0 到 11,像素点 [0,0] 位于左下角(面向阵列时)。然后,我们开始编写程序以驱动该阵列,我们使用了一个名字类似于 GetNeoNum() 的函数,它接受 X 和 Y 值作为参数,使用的算法取决于阵列布线方式,并且返回相应像素点在灯串中的编号。
为了驱动该阵列,我需要一个微控制器,它应具有合理的内存量、相对较快的时钟和相当高的处理能力,因为我计划实现一些有趣的效果,包括多色渐变。我选择了来自 Seeed Technology 的 102010328 Seeeduino XIAO(图 2)。XIAO 由 Atmel 的 ATSAMD21G18A-MUT SAMD21G18 微控制器驱动,仅有标准邮票大小,是 Seeeduino 系列中最小的 Arduino 兼容微控制器开发板。该微控制器采用 32 位 Arm Cortex-M0+ 处理器内核,运行频率为 48 MHz,并配备 256 KB 闪存和 64 KB SRAM。
图 2:适合试验板的 Seeeduino XIAO 是目前 Seeeduino 系列中最小的 Arduino 兼容微控制器开发板,为用户提供性能强大的 32 位 Arm Cortex-M0+ 处理器,运行频率为 48 MHz。(图片来源:Seeed Studio)
XIAO 有 11 个引脚,每个引脚都可以用作模拟输入、数字输入或数字输出。其中 10 个引脚支持脉冲宽度调制 (PWM),1 个引脚配备数模转换器 (DAC),从而提供真正的模拟输出能力。此外,如果需要,引脚 4 和 5 可用于支持 I2C 接口,引脚 6 和 7 可用于支持 UART 接口,而引脚 8、9 和 10 可用于支持 SPI 接口。
正如我之前所提,最近我迷上了在我的业余项目中添加运动和方向感应。作为测试案例,我决定在我的 12 x 12 乒乓球阵列上加入此功能。
我需要一个带微机电系统 (MEMS) 传感器的小型分线板 (BOB),该传感器包含一个 3 轴加速计、一个 3 轴陀螺仪和一个 3 轴磁力仪。我很快意识到,操纵和理解原始传感器数据非常复杂,会让我的脑袋爆炸。作为替代方案,我选择使用 Adafruit 的 2472 BOB,它采用来自 Bosch 的 9 自由度 (DoF) BNO055 传感器。
图 3:除了 3 轴加速计、3 轴陀螺仪和 3 轴磁力仪外,Adafruit 2472 BOB 上的 BNO055 传感器还包含执行传感器融合的 Arm Cortex-M0 处理器。(图片来源:Adafruit)
BOB 使用双线 I2C 接口与 XIAO 微控制器通信。BNO055 的优点在于,它还包含一个 32 位 Arm Cortex-M0+ 处理器,该处理器从三个传感器中获取原始数据,执行复杂的传感器融合,并以我能使用的形式提供我所需要的数据。正如我们在此视频中看到的那样,我的第一项测试是将阵列水平放置,然后倾斜阵列,让一个“球”(像素点)围绕显示器“滚动”。
结语
第一项测试的结果比我预期的要好得多,但实际上,它相当简单。我只需要检测阵列的倾斜度何时超过某个值(当前设置为 10 度),然后让“球”以恒定的速度沿相应的方向移动。下一步将是更准确地模拟惯性和加速度等参数,然后利用这些功能来实现一系列游戏。
最主要的是,这些一次成功的实验激发了我的灵感,让我开始在其他项目中加入运动和方向感应,让这些项目更加酷炫。你呢?你有什么业余项目可以用上这些酷炫的运动和方向感应能力呢?
Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum