如何通过Python控制Enttec Open DMX USB?

问题描述 投票:0回答:4

我想知道是否可以通过 Python shell 控制连接到 Enttec Open DMX USB 的灯光。如果是的话怎么办?

python python-3.x libusb dmx512
4个回答
4
投票

开放照明项目(以前称为opendmx)提供了Python API,作为其开放照明架构(OLA)的一部分,以便在OSX和Linux上使用OpenDMX USB。如果您使用的是 Windows,那么除了 Enttec 网站上使用 FTD2XX.DLL 库的代码之外,我没有找到任何其他内容。

但是应该注意的是,不能使用普通的基于串行的库(pyserial 等)。基本上,OLA 要么需要在 Linux 上使用特殊的内核模块,要么在 Mac 或 Linux 上使用通用 FTDI 非串行内核驱动程序与 libftdi 结合使用 - 有关详细信息,请参阅其设备特定页面。现在 OLA 网站上已预先构建了 对 Raspberry Pi 的支持

使用的通信和协议与 Enttec Pro 系列完全不同(可以使用简单的串行命令和 pyserial 等进行控制,尽管 OLA 也可以与它们对话)。


1
投票

我遇到了完全相同的问题,所以我为所有运行 Windows 的程序编写了一个简单的 python 程序;看看:https://github.com/Coronon/PyOpenDmxUsb

它使用 C# 服务器(因为他们的 C# 接口是唯一适合我的接口)和 Python 客户端,并且非常易于使用。

它也与非专业版兼容。 (专业版更容易使用,我会使用 AcceptedAnswer [但不支持普通版本])

编辑:这可能是“广告”,但我的项目是开源的并且超级易于使用,所以我相信这对其他人有用:)


0
投票

我知道这是一篇相当老的帖子,但是 DmxPy 在过去几个月对我来说非常有效。它仅适用于 Python 2,但我知道有一些 Python 3 端口。

使用起来非常简单。我个人在我公司的质量控制软件中使用它。虽然它只适用于 DMX(不适用于 RDM),但我认为它比 OLA 的 Python Wrapper 更容易使用。它也能与我们的 ENTTEC 完美配合!

更新:这是我的 Python 3 端口:https://github.com/trevordavies095/DmxPy


0
投票

ENTTEC Open DMX 是一个相当简单的设备,所需要做的就是打开其串行端口,然后继续发送所有 512 个通道,并在循环中添加一个中断和 0 起始字节,发送之间有轻微的暂停。这是类和一小段在单独线程中启动它的代码:

import sys, time
import pyftdi.serialext

class DmxPy:
    def __init__(self, serialPort):
        try:
            self.serial = pyftdi.serialext.serial_for_url(serialPort, baudrate=250000, stopbits=2)
        except:
            print("Error: could not open Serial Port")
            sys.exit(0)
        self.dmxData = [bytes([0])] * 513
        self.dmxData[0] = bytes([0])
        
    def setChannel(self, chan, intensity):
        if chan > 512: chan = 512
        if chan < 0: chan = 0
        if intensity > 255: intensity = 255
        if intensity < 0: intensity = 0
        self.dmxData[chan] = bytes([intensity])
        
        
    def blackout(self):
        for i in range(1, 512, 1):
            self.dmxData[i] = bytes([0])
        
    def render(self):
        sdata = b''.join(self.dmxData)
        self.serial.send_break(duration=0.001)
        self.serial.write(sdata)

    def display_universe(self):
        while True:
            self.render()
            time.sleep(0.005)

dmx = DmxPy('ftdi://ftdi:232:A10NHECY/1') # note device serial in the connect string
dmx_thread = threading.Thread(target=dmx.display_universe)
dmx_thread.start()

dmx.setChannel(5,128)
© www.soinside.com 2019 - 2024. All rights reserved.