UDMX接口库
udmx-pyusb的Python项目详细描述
使用python和pyusb对anyma udmx接口(和克隆)进行编程
版权所有©2016 Dave Hocker(athomex10@gmail.com">athomex10@gmail.com)
概述
此回购协议的目的是分享我在编程 Anyma UDMX接口,在Raspberry PI(RPI)上使用Python和PyUSB。TH Anyma UDMX公司 接口相对便宜,并且有大量的克隆可用 从像易趣这样的网站。然而,似乎缺乏可用的信息 在Linux下编程这个接口(本例中是Raspbian Jessie)。
非常感谢markus baertschi和他在udmx linux实用程序上所做的工作。 (请参见https://github.com/markusb/udmx-linux" rel="nofollow">https://github.com/markusb/udmx-linux)。以C++为基础的UDMX实用程序为基础 在我的大部分学习活动中。
许可证
本文介绍的工作是根据GNU通用公共许可v3授权的,该v3由 自由软件基金会。有关许可证的全文,请参阅许可证文件。
源代码
完整的源代码保存在github上。
开发环境
虚拟环境
这项工作最初是用Python2.7编写的,但是已经针对Python2和Python3进行了调整。 版本1.1.0适用于Python2。2.0.0及更高版本可在Python3.5+上运行。 一个合适的开发环境将使用virtualenv和virtualenvwrapper来创建一个工作的虚拟环境。 requirements.txt文件可与pip一起使用,以创建具有所有依赖项的所需虚拟环境。
这里有一些关于设置virtualenv和virtualenvwrapper的参考资料。
- virtualenv和virtualenvwrapper
- Linux上的virtualenv和virtualenvwrapper
- Windows上的pip和virtualenv
- Windows上的virtualenvwrapper
- macos上的virtualenv和virtualenvwrapper
一个快速的互联网搜索将揭示许多关于如何安装和设置virtualenv/virtualenvwrapper的文章 大多数操作系统。
PYUSB
PYUSB需要下列之一:libusb 1.0、libusb 0.1或openusb。请参见5。libusb 1.0是 raspbian jessie图片可从raspberrypi.org获得。如何 在Windows上安装libusb,如下所述。
操作系统
树莓
这个项目的主要目的是学习如何在rpi上使用udmx接口。而且,这是 作者部署代码的主要环境。
Mac操作系统
不过,工作已经够多了 是在OSX10.11.3上完成的,以得出这样的结论:这段代码可以在两个操作系统上工作,也可以在这两个操作系统上工作。如果你想的话 在OS X上试用,使用Brew安装libUSB(它将安装libUSB 1.0)。
窗口
该代码也在windows 10上进行了测试。要使其正常工作,必须安装Windows版本的libusb。
可能有很多方法可以安装libusb。
但是,以下libusb版本已成功测试:
libusb-win32使用此
安装程序。
关键是要遵循"驱动程序安装创建器向导"的说明。您需要为
UDMX接口。
程序和模块
tryusb.py程序
这是我的第一个学习工具。它执行以下操作:
- 定位UDMX接口。
- 打印有关接口的一些信息。
- 向场馆thinpar64发送一些基本命令,演示如何通过dmx操作灯光。
它还帮助我解决了rpi上的权限问题。运行此应用程序:
python tryusb.py
udmx.py程序
<>这个程序的功能非常类似于Markus Baertschi的基于C++的UDMX实用程序。要获得帮助,请尝试./uDMX --help
or
python uDMX.py --help
对于每次调用,此程序执行以下操作:
- 从/etc/udmx.conf加载udmx.conf文件。
- 如果在当前环境中找不到pyusb,则激活conf文件中定义的virtualenv。
- 加载conf文件中定义的.udmxrc文件。
- 根据供应商ID和产品ID定位UDMX接口。
- 发送由命令行参数定义的dmx消息。
udmx.py使用pyudmx.py模块。
pyudmx.py模块
py udmx.py模块提供了一个简单易用的模块,用于与udmx接口对话。基本上, 它是PYUSB模块顶部的UDMX特定适配器。如果要编写面向udmx的应用程序 考虑从pyudmx.py开始。
简单用法示例:
dev = pyudmx.uDMXDevice()
dev.open()
dev.send_single_value(1, 255) # sends the value 255 to DMX channel 1
dev.close()
在本例中,open()方法将默认打开第一个udmx接口 供应商ID为0x16C0,产品ID为0x05DC。
一个更完整的编程示例可以在example.py文件中找到。
学习笔记
以下是在RPI上使用Raspbian Jessie学习练习的一些笔记。经验教训 这里适用于大多数Linux系统,但可能不适用于Windows或MacOS。
查找UDMX接口
由于UDMX没有内核驱动程序,因此它不会显示在/dev-like/dev/tty下。
您可以这样找到它:
~/rpi/uDMX-pyusb $ lsusb
Bus 001 Device 005: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb
Bus 001 Device 004: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
UDMX是总线001上的第一个设备,设备005的ID为16C0:05DC。16c0是供应商ID,并且 05DC是产品ID。UDMX可以在/dev/bus/usb/001/005中找到。
权限
如果您想在不总是运行sudo的情况下在覆盆子pi上编程udmx,那么 必须使用UDMX设备的默认权限执行操作。
~/rpi/uDMX-pyusb $ ls -al /dev/bus/usb/001/005
crw-rw-r-- 1 root root 189, 4 Feb 25 15:30 /dev/bus/usb/001/005
注意,权限是:664。只有根和成员 根组具有写入权限。这就是为什么当前用户需要sudo(通常是pi)。 您可以通过将UDMX上的权限更改为:666来解决此问题。
sudo chmod 666 /dev/bus/usb/001/005
现在检查权限。
~/rpi/uDMX-pyusb $ ls -al /dev/bus/usb/001/005
crw-rw-rw- 1 root root 189, 4 Feb 25 15:30 /dev/bus/usb/001/005
不幸的是,这只是一个临时的解决方案。下次重新启动时,权限将恢复 回到他们的默认664。永久解决此问题的一种方法是编写 当设备插入时将权限设置为666的udev规则。这里是 规则< <
SUBSYSTEM=="usb", ATTR{idVendor}=="16c0", ATTR{idProduct}=="05dc", MODE="0666"
您可以通过编辑98 udmx usb.rules来获取此解决方案 文件并取消对包含此规则的行的注释。将编辑后的文件复制到/etc/udev/rules.d。
sudo cp 98-uDMX-usb.rules /etc/udev/rules.d
要确保使用了该规则,请拉动UDMX并重新插入。
这个解决方案显然有一个缺点。它允许所有用户对udmx进行读/写访问。我们 通过将规则更改为:
python tryusb.py
0
将所有权更改为root:pi时,此规则将权限设置为664。 总的来说,这可能更可取。根用户拥有设备,其成员是 pi组(包括pi)具有读/写访问权限,所有其他用户都具有只读accESS,
python tryusb.py
1
您可以通过编辑98-udmx-usb.rules文件并取消注释来选择此规则。 包含此规则的行。
符号链接
您可以使用udev规则为udmx设备创建符号链接。
python tryusb.py
2
此规则将为找到的每个UDMX设备生成一个符号链接。
python tryusb.py
3
查看这些权限时,您可能会认为有对UDMX的开放访问。 然而,事实并非如此。以symlink目标的权限为准。 符号链接只允许所有人访问符号链接本身。
python tryusb.py
4
感谢muzzol提供此技巧。
udev规则
有关udev规则的更多信息,请参见编写udev规则
重新启动问题
这是一个观察。在热重启时,并不总能找到udmx接口。 你可能需要重新安装设备才能让Raspbian找到它。为什么会发生这种情况还不清楚。
多个UDMX问题
在一个系统上运行多个udmx设备是可能的,但这可能很困难。大多数UDMX接口 克隆没有唯一的序列号。这使得每个接口的标识都有问题。
根据下面显示的详细USB信息,可以使用以下内容来识别 一个UDMX.
- 供应商ID
- 产品编号
- 制造商
- 产品
- 串行
- 公共汽车号码
- 设备编号
基于有限的研究,似乎只有总线和设备编号唯一地标识 给定UDMX间隔。基于 Anyma设计和固件。不幸的是,总线和设备号不能可靠地使用,因为仅仅移动 UDMX到另一个USB端口将更改其中一个或两个值。
如果要使用多个udmx接口,则需要一次将它们插入一个,并使用lsusb命令 确定每个总线和设备的编号。在那之后,你就不能移动它们了。
如果需要管理多个 UDMX接口。
除非另有说明,否则此回购协议中的程序将使用它们找到的第一个UDMX接口。
详细的USB信息
这里有一堆关于UDMX克隆的信息。垃圾堆里的大部分信息似乎是指 固件制造商不是硬件制造商。固件是开源的。
python tryusb.py
5