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的文章 大多数操作系统。

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

参考文献

  1. udmx-微型总线供电的usb-dmx接口-anyma
  2. illutzminator
  3. markus baertschi udmx实用程序
  4. 编写udev规则
  5. pyusb

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java[Jersey 2.x]如何重试请求?   java我不能同时使用ActionListener和KeyListener   java如何以与List相同的方式计算流的哈希代码。hashCode()   java从超类实例创建实例   Android Studio中视频捕获中的java检查输入   使用java中的开源xmpp库连接到nimbuzz聊天室   java我们可以在spark sql中启动传统的连接查询吗   JavaJSF连接挂起   java PowerMockito静态   java分布式程序执行管理器   java如何按条件唤醒线程   java在Neo4J Spring Boot OGM上的关系实体中保存子类或数组列表   java SQL server 2008 R2连接错误/安卓   java Android问答应用程序崩溃   java Firefox被PID“杀死”后拒绝启动   java库将JSON转换为URL编码   java JUnit 5 Spring安全WebMvcTest没有PasswordEncoder类型的bean   获取所选项目id的java返回0