问题标签 [neopixel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arduino - Neopixel 的系列问题
我正在寻求一些帮助;了解 DMA、串行、管理中断和阻塞代码。
我有一个 ESP32 DEVKITC v4,用于处理来自旋转编码器等硬件和 wifi 的用户输入。ESP32 还负责驱动 20x4 LCD 显示菜单供用户交互。
然后我有一个 Teensy 3.5 处理像素驱动。它负责生成像素帧,将其加载到缓冲区并输出信号。我正在运行Adafruit Neopixel 库的修改版本来控制我的 TM1814 LED
我现在遇到的麻烦是 ESP32 和 Teensy 之间的通信。neopixel 的代码需要阻塞才能正确设置 LED 驱动器 IC 的时序。虽然 ESP 具有用于旋转编码器的中断以保持准确计数,但这两者都与串行通信混淆。到目前为止,这是我的测试代码,它是最终项目代码的精简版本,以简化识别问题并帮助缓慢构建复杂性。
ESP_Transmitter
TEENSY3.5_RECEIVER
虽然这段代码大部分都有效,但在快速转动编码器时,我仍然会遇到传输错误。这就是我希望 DMA 可能成为解决方案的地方。如果我正确理解 DMA,我可以使用它和 uart(串行)在两个 MCU 之间发送数据,而忽略阻塞代码和中断。然后在主循环中轮询 DMA 缓冲区并解析接收到的数据,但我找不到使用 DMA 和 Uart 的可靠示例。有谁知道这是否可行,如果可行,是否有一些示例可以链接供我查看?
我更愿意找到一个软件解决方案,但作为一个硬件解决方案,我也在考虑使用这个或两个 MCU 都可以访问的外部 SRAM。充当缓冲区来存储用户生成的变量,以便在适当的时候进行轮询。
我对这一切还很陌生,所以欢迎任何进一步的问题,我想知道人们对此的看法。
rgb - 我设计的这种可寻址的 rgb led 会起作用吗?
我对这件事相当陌生,我的语法也不好,但我们开始吧。我计划通过使用可寻址的 rgb sk6812 为我的学校项目点亮一个清晰的铸造小雕像,它的尺寸为 2020 年,因为它相当小(15 厘米)而且有点狭窄,所以对我的人物来说非常方便。我试图用一些效果来点亮它,比如爆发,请看我的 tinkercad 图片,对不起,这是我现在可以做的最简单的方法附加设计
如您所见,我尝试将整个 LED 分布在每个肢体上,将 1 号(首先获取数据)LED 放置在胸部,我想我是否可以将数据线从 1 号 LED 扩展到接下来在它周围引导,依此类推,会产生类似涟漪/爆裂的效果,对于狭窄的电缆也很抱歉,因为我的 sk6812 在 tinkercad 上只有 4 针而不是更大的旧 6 新像素,所以我让它尽可能接近我的情况,将它可以在没有任何未来问题的情况下工作吗?这件事会持续 3 天,服装也只是一个例子,我将使用 5-12v 供电的 LED 灯条控制器进行真正的交易,比如这个BTF SP105E 蓝牙控制器,它可能已经检查了所有的供电LED(它的手机也被控制了!)。
每个led都需要旁路电容吗?或任何额外的电阻?我的朋友说控制器有很多图案,而且速度可能很快,以至于他担心 LED 的寿命会缩短,但由于我们俩都是新手,我想在这里为一些有经验的人听听。
这是我的 tinkercad 草图链接
任何帮助都会很棒!谢谢你。
assembly - 使用 PyBoard 上的 MicroPython 内联汇编器 BitBanging 一个 MHz 协议
我正在尝试使用 PyBoard v1.1使用 Micropython 的内联汇编器来驱动 Adafruit 的 NeoPixel LED SK6812RGBW的协议。
协议
从链接的数据表中可以看出,单个 LED 是通过组合 4 个 8 位 rgbw 值来驱动的。每个高位由 0.6us 的模拟高,然后是 0.6us 的数字低组成,低位的比例为 0.3us 高和 0.9us 低。这使得在 4 字节 LED 颜色值中使用的每个数据位都是 4 个模拟位,每个 0.3 us,或者总共 128 个位超过 38.4 us。发送到第一个 LED 的字节流也包含所有后续 LED 的值,它会将除自己之外的所有 LED 传递到下一个 LED,依此类推。
执行
使用 pyboard 的 SPI 接口可以很容易地实现该协议。一旦生成了数据流(每个 LED 有效 16 个字节)并计算了波特率(1s / 0.3 us = ca 3333333),只需创建一个 pyb.SPI 实例并使用字节作为参数调用其发送方法.
任务
现在到手头的任务:我想用一个 PyBoard 驱动三个不同的 LED 灯条。但是只有 2 条 SPI 总线可用。因此,在尝试使用 pyb.Pin 和循环对协议进行 bitbang 后,我很快意识到这不起作用,最小切换速度为 54 us,这比我需要的 0.3 us 略低...
实施 V2
在尝试了一些优化步骤后,我转向了 Micropython 的内联汇编器。几个小时后,我设法在用示波器测量的 23 ns 轻松切换给定引脚。这很好,但我不需要盲目地切换引脚,我需要根据比特流遵循精确的协议来切换引脚。又过了几个小时,我完成了以下实现:
B6 是引脚 X9 的 CPU 名称,我将其用作与 LED 的数据连接。
为了运行,我将它嵌入到一个演示 python 脚本中:
问题
这工作得很好,但是当使用它代替 SPI 流媒体时,每隔几次执行就可以看到 LED 偶尔出现的伪影。以下是我用示波器查看时的图像: 带有工件的示波器日志 可以看出,有一个地方由于某种原因它似乎停止切换恰好 2 个值位:缺少铅笔的侧面 这似乎发生随机地,在比特流的任何部分,有时从上升的边沿开始,有时从下降的边沿开始。
问题
现在显然我的问题是为什么会发生这种情况。SPI 不会发生这种情况,尽管我假设 C 实现注意不要让任何东西中断流。我尝试在调用 send_bits_on_x9 之前禁用垃圾收集器并在之后重新启用,但这没有帮助。我还改变了延迟周期的数量,也没有改变任何东西。
我注意到的第二件事是,当有多个尾随零字节时(根据协议定义的 80 us 重置周期),该周期似乎将在大约四分之一的时间内执行。将尾随字节更改为 0xff 时,它们保留了预期的持续时间,LED 似乎并不介意。
现在,如果有人可以向我指出官方内联汇编程序文档以外的资源,甚至提供一些见解,我将不胜感激。干杯!
javascript - Neopixel / WS2811 通过本地 HTML 控制
我已经按照 Adafruit 的说明使用 Python 启动和运行 WS2811 LED,一切都很好。
我还创建了一个非常简单的 HTML / JS / CSS 页面,它允许用户在屏幕上“着色”像素。我想在连接了 LED 的 Raspberry Pi 上运行它(每个屏幕上的“像素”对应一个 LED)。我曾希望找到一些 PHP 可以接受我可以使用的参数,例如 LED=42,colour=red,但没有这样的运气。
每次单击“像素”时,我都可以直接调用 Python 脚本并将参数传递给它,但这不是很优雅。
请问有谁知道我如何做到这一点?
python - 在 if 语句中检测到 Python 语法错误
我正在尝试运行我的代码,但由于语法错误,我已经被困了好几个小时。我尝试了不同的 if 语句级别、重写部分等......没有任何变化。有人有什么想法吗?谢谢
我也使用过在线破解者,但没有任何结果。我使用 Python 3 运行代码,不能使用旧版本运行它。
错误发生在这部分代码的所有行上:
这是完整的代码,它是一个 RGB 条形计时器
python - 如何使用 node-red-node-pi-neopixel 库在一个 msg 有效负载中传递 csv 以点亮更多单个 LED
我目前正在尝试点亮由单个 WS2812B LED 灯条制成的 32x60 LED 矩阵。使用 node-red-node-pi-neopixel 节点,如果我想点亮 10 个不相邻的 LED,我必须编写 10 个不同的消息。由于节点使用 csv,它还有另一种方法可以传递使用 ';' 的更复杂的 csv 点亮多个阵列?像'1,255,255,0;5;2550,255'。
或者,如果有其他方式,我很高兴从你这里!
c++ - Neopixel 示例代码在使用更多像素时崩溃
语境
我正在重新启动一个涉及ESP8266和 WS2812B(Neopixels)的个人项目。
值得注意的是,我目前没有连接任何 Neopixels。我只是想了解我可以多快更新像素。
我正在运行一段非常简单的示例代码,取自 Adafruit 的 Neopixel GitHub 存储库。我对其进行了轻微修改,以使其更准确地适应我的用例并删除评论(为了在此处发布)。
细节
示例代码:
它会在调用“End”之前崩溃。循环仅达到〜227:
故障排除
如果我将像素数减少到 200 或在 for 循环中添加延迟(1),则此代码不会崩溃。
或者 - 删除 for 循环并通过简单地使用 loop() 设置 LED 似乎有效。
所以 - 问题似乎最终取决于在 loop() 函数内部的 for 循环中调用 show() 一定次数(227+)。
问题
许多示例包括 for 循环中的显示。我怀疑将节目移到 for 循环之外是一种适当的解决方法。我在我的原始项目中做到了这一点,似乎没有问题。
但我仍然很好奇为什么会这样。如此多的示例都将 show() 包含在 for 循环中,这一事实让我认为这应该可行。
有谁知道为什么在上面的代码中设置 ~300 个 LED 会导致崩溃,但 200 个不会?
colors - 树莓派 + neopixel:如果 RGB LED 的亮度降低,是否意味着某些颜色无法渲染?
参考 python 库 neopixel
(rpi_ws281x) 来控制 WS2812B RGB LED 灯条,通过将像素中每个子 LED 的字节从 255 缩放到 127 来调整亮度是否会限制我们渲染某些颜色?
根据该库,出于调光目的,执行以下代码:
但是,如果我想以 50% 的亮度渲染 RGB(255、187、120)的颜色:在我看来,数据帧位被限制为每个像素的最大值( 127、127、127) - 根据上面的代码,通过哪个,上面的颜色不能显示?
我对吗?
谁能解释该库中的亮度控制/调光功能是如何工作的?它不应该降低 PWM 占空比以降低亮度(功率)吗?
请解释。谢谢你。
更新:
通过将亮度与 CCT 作图,在较低亮度(100% --> 75% --> 50% --> 25%)下,CCT 会增加。如何纠正这个?
c++ - Arduino 上的 Blynk 项目在使用 NeoPixel 启动剧院彩虹追逐动画时断开连接
我正在尝试在 D1 Mini 上使用 Blynk 创建一个简单的项目,我可以随时选择任何动画,除非我使用 Blynk 应用程序停止该动画,否则它应该播放。虽然其他所有功能都可以完美地运行,但我无法弄清楚我的剧院Chaserainbow功能上有什么问题,但是在选中时,我的D1被断开并再次连接。这是代码。
我从各个论坛了解到,我必须改用 blynk.timer 并在设置中设置超过 1000L 的计数。但这对于这个特殊的剧院追逐彩虹功能也无济于事。所有其他功能完美运行。任何帮助将不胜感激。
python - 全局变量更改时退出 while 循环
所以,我一直在研究连接到我的树莓派 4 的 LED 灯条,并且我已经让 TouchOSC 在树莓派和我的手机之间工作。我目前遇到的问题是,当我按下的切换按钮关闭时,它指定运行的程序继续运行。我有一个全局变量,它应该确定“while”循环是否继续,但不是将按钮状态设置为零并终止程序,而是继续运行,直到它被终端中的 Ctrl+C 中断。我想知道是否有人会碰巧知道为什么当按钮状态改变时程序不会停止。
这在按下闪烁按钮时触发,但当我将其切换回零时程序继续运行。下面是函数“twinkleTest”的代码
我不确定我是否只是一无所知,或者这里到底做错了什么。我对 Python 很陌生,所以它可能不是最好的。谢谢你的帮助!