本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于WS2812B的吸顶灯

发布时间:2022-07-31
分享到:

基于WS2812B的吸顶灯

发布时间:2022-07-31
分享到:

这个项目使用的一个定制的天花板屏幕,能够使用 Raspberry Pi 和基于 Web 的 GUI 播放视频、颜色选择器和色温。

概述
该项目包括一个由 4,661 个由多个 5V 电源供电的 NeoPixel LED、10 个 Fadecandy NeoPixel 驱动板和一个 Raspberry Pi 3 Model B+ 组成的天花板支架。这款 LED 吊装能够播放视频,并显示颜色选择器上选择的颜色。开发了一个基于网络的移动应用程序,以便用户可以选择要在天花板安装显示器中显示的视频或颜色。数据通过 WiFi 从用户浏览器发送到 LED 吊装支架,然后再发送到托管 ROSWWW 服务器的 Raspberry pi。我们在这个项目中使用了 ROS 框架来管理多个节点并在 Raspberry Pi 和 Web 应用程序之间建立通信。

技术规格
成分

  • 树莓派 3 型号 B+ - x 1
  • Fadecandy NeoPixel 驱动板 – x 10
  • NeoPixel LED 灯条 (WS2812b) - 160 米(约)
  • Multi TT USB 驱动程序 – x 4
  • 5V 电源 – x 5
  • 2芯线——1200米(电源线)
  • Cat-6 电缆 – 500 米(数据线)
  • 胶合木底座 - 直径 2.9 米
  • 电容器 – 1000µf – 6.3V
  • 终端连接器 – 85 个。
  • 木板 – 6 块。
  • 母线 – 36 个。
  • 3 芯线 – 5 米
  • 3 针插头 – 3 个。
  • 电缆扎带 - 500

工具

  • 优质烙铁
  • 焊锡铅(无铅)
  • 焊芯
  • 剥线机
  • 钢丝钳
  • 螺丝刀
  • 测试仪
  • 切割播放器
  • 数控机床
  • 电钻机
  • 胶带
  • 743单组份瞬间粘接胶
  • 弹性胶水
  • 真空吸尘器
  • 木工工具(锯、锉)
  • 弹簧线
  • 外科口罩和手套

软件

  • 树莓派 stretch
  • ROS框架
  • Open CV
  • Fadecandy 服务器
  • GL服务器

计划
我们的项目包括一个胶合木框架,呈圆形,靠近框架底部有一个空心圆。框架的设计方式使其适合天花板上的巴黎石膏层。使用大型安装螺钉直接进入混凝土层进行安装。

我们使用了 30 个 LED/m 的灵活 NeoPixel 灯条。由于框架的形状是圆形的,因此放置一整条 LED 并不是一个可行的选择。我们应用了一些简单的数学公式来生成一个文件,该文件将帮助我们确定每次切割条带所需的 LED 数量。

最初的挑战

  • 映射 LED,在播放视频或运行颜色选择器时实现接近 85 x 85 的分辨率。圆直径为 2.9 m,因此我们最多可以容纳 85 个 LED,
  • 根据框架的设计,找出增加和减少条带长度的解决方案,并将数据线和电源线拉到正确的点。
  • 将电源线分开到 LED 灯条,以便均匀分配电源,而不会造成过载或 LED 闪烁。

要找到这些问题的解决方案,了解框架的布局非常重要。

考虑一个 85x85 的图形,圆的中心位于网格 (0, 42.5) 上。要将 LED 安装在框架的圆形图案中,我们必须在某些边缘添加和移除 LED,这是我们面临的第一个挑战。

来解决这个问题。我们使用 python 设计了一个文本文件。该文本文件由 (x, y) 坐标组成,有助于放置 LED。为了映射 LED 以用于视频播放和颜色选择,我们使用相同的文本文件使用 (x, y) 坐标生成元组,并将这些值存储在 pickle 文件中。

因为,我们使用 Fadecandy 驱动程序来完成这个项目。每个 Fadecandy 最多可支持 512 个 LED,这意味着在单个 Fadecandy 驱动器的每个端口上最多可支持 64 个 LED。但是,由于 raspberry pi 造成了每个通道全部 64 个 LED 的问题,我们只使用了 90% 的吞吐量,因此我们决定将每个端口的 LED 数量保持在 60 个左右。

由于其独特的设计,LED灯带的起点在我们项目的不同地方有所不同。因此,我们生成了一个文件作为标记系统,以便我们跟踪我们将为 LED 拉电源线和数据线的点。

代码将附在本文下方
我们在这个项目中使用了 4,661 个 LED。为它们供电尤其具有挑战性。在电源波动、低电压期间,LED 有可能劣化,因此我们在为 LED 供电时必须小心并采取预防措施。我们使用了 5、5V 60A 电源。我们的目标是让每个电源支持大约 950 个 LED。有关这方面的更多信息将在电源拓扑部分简要介绍。

数据拓扑

在我们的项目中,我们使用 2 个多 TT USB 将 10 个 Fadecandy 驱动程序连接到 Raspberry PI 3 B+。每个 Multi-TT 最多可支持 4 个 Fadecandy 驱动程序,另外 2 个 Fadecandy 驱动程序直接连接到 Raspberry PI。Turbo - 4 端口 USB 集线器专为多个设备之间的高效连接而设计。它使用 mtt(多事务翻译技术),保证每个端口 12 mbps 的速度。这使所有 4 个设备能够同时以 100% 的效率运行。Fadecandy 的每个端口传输 12mbps 至关重要,因为我们在 Fadecandy 中播放视频,高传输速率对我们来说很重要。

在 Raspberry PI 中,我们使用 ROS 框架的 ROSWWWW 将服务器托管在本地网络中。我们创建了一个响应式 HTML 页面,为其提供移动 Web 应用程序 UX。我们使用网页中的 ROSJS 库与树莓派中的 ROS 服务器进行通信。因为,ROSJS 能够通过套接字协议发送消息。我们利用这个优势将消息从网页(浏览器)发送到 Raspberry pi。树莓派根据发送的socket消息发送Fadecandy指令来执行。下面将解释用于执行 Fadecandy 操作的代码片段。

电源拓扑

将功率均匀分配到多个 LED 灯条,包含 4,661 个 LED。我们使用了 5 个电源,每个电源包含大约 950 个 LED。每个电源由6个母线、3个+Ve和3个-Ve组成。从我们小心地连接到母线的 LED 灯条上拉出的电源线。

我们还创建了一个公共接地来连接 Fadecandy 和电源的接地。

视频功能.py:

import opc
import cv2
import pickle
From PIL import Image
def video_function(video_name):
pix = list()
# Locate and add the video file
vidcap = cv2.VideoCapture(video_name)
success,image = vidcap.read()
success = True
client = opc.Client('127.0.0.1:7890')
#ADDED MAPPED PIXEL
mapped_pixel = list()
with open('mapped_pixel.pickle', 'rb') as handle:
mapped_pixel = pickle.load(handle)
Try:
while success:
success,image = vidcap.read()
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
pix = []
im = Image.fromarray(image)
im = im.resize((85,85), Image.ANTIALIAS)
# Only want RGB, not RGBA
for i in range(0,4661):
pix.append(im.getpixel((mapped_pixel[i][0],mapped_pixel[i][1]))[:3]) 
client.put_pixels(pix)
time.sleep(1/60)         
except:
print "Video terminated unexpectedly!!"

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Shahid Memon,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论