DMX512灯光协议

c++

Posted by elmagnifico on January 15, 2021

Foreword

最近了解了一下led灯带相关内容,顺便记录一下DMX协议学习过程

DMX512

DMX是协议名称,后面的数字表示该协议携带的最大数据帧数量

比如DMX256,DMX512,DMX1024

协议格式

image-20210115153136343

DMX512,使用的波特率是250Kbps

一个完整的DMX512数据包的格式由一个MTBP信号、一个BREAK信号、一个MAB信号和一个SC信号,以及后面的数据帧组成。其分别的含义如下:

  • MTBP(Mark Time Between Packages)标志着一个完整的DMX512数据包的发送完毕,高电平有效,表示当前传输线处于空闲状态,没有数据传输。

  • BREAK 是一个DMX512数据包的起始控制信号,对应着一个数据包结束后的复位阶段,复位完成后接着应该发送下一包的数据。协议规定BREAK的信号为低电平有效,并且持续时间不小于两个DMX512的数据帧的长度,即88us。

  • MAB(Mark After Break)是一个数据包开始发送的标识,由于每一个数据帧的第一个位为低电平,故为了区分BREAK的低电平和数据帧的起始位的低电平,加入了MAB信号。协议规定了MAB的典型持续时长为8us,即两个位的时间,高电平有效。

  • SC(Start Code)SC即起始码,它和一个普通的数据帧一样,但是它的8位数据位均为零,标示数据包中数据帧的开始。
  • 数据帧,包含灯光的控制信号

数据帧

一个数据帧有11bits,其中第一bit是起始位,后接8bits数据位,最后还有2bit停止位,无校验。

img

由于波特率已经确定了,所以每bit时间->每帧数据时间也就规定好了

问题

比如DMX512,也就是最多512个数据,每个数据1字节,而控一个RBG灯至少要3个字节,那么一个完整的控制链最多能控制170个RGB灯;由于波特率固定了,那么灯的刷新频率大概是44Hz。

同时由于电气限制,大概一条DMX控制线,能控制的范围大概是1000m,超过了就需要放大器或者中继了,如果连的长了,那么频率自然就继续下降了。

DMX协议本身不带校验位,这就会出现一旦发错了,那么最后结果错了就按照错的显示了,这也是不安全的地方。

而实际上灯光设备中并不是这么用这个512数据的,每种灯的需要的数据帧可能不同,而且灯的效果本身已经固定了,可能通过五六个字节就可以控制这一个灯的所有效果了,对应的每个灯使用的数据帧index也就成了这个灯的地址,一般都是串联相同类型的灯于其中,这样地址就比较好计算。

对于室外LED点阵当成屏幕来用的时候,有上百万个LED,同时他们都是用的DMX512,如果都是一套控制器可能会使用非标协议(DMX1024甚至更高),一个控制器可能就有几十条DMX512的链路,从而可以达到一个控制器可以控制几千个灯,然后控制器之间再用以太网或者其他高速链路进行链接,最终汇流到一个总控就行了,如果分布式的话大概都是通过移动网络进行远距离链接的,总体上整个控制网络是在离线的局域网内的。

DMX512-A

最初的叫DMX512,后来修订成标准协议就叫DMX512-A,现在市面上说的DMX512实质上应该是指DMX512-A

Art-Net

简单说就是包含了远程管理的DMX512-A协议的扩展,其运行在IP网络协议上,本质上是RDM+DMX512-A封装成UDP而已。DMX512本身是个单向链路的,具体灯具当前状态信息完全无法获取,而基于RDM以后,就可以用来管理基于网络或者远程的灯光设备。

Summary

以上是基于标准DMX来说的,实际使用的时候可能很多人会使用非标准DMX,会去掉协议的MTBP和BREAK这些内容(这个部分要单独拉低或者拉高对于现成外设不友好),只保留数据帧这部分,无数据就直接拉高,然后可以直接使用现成的控制器直接完成。

Quote

https://blog.csdn.net/qq_42992084/article/details/98525578

https://blog.csdn.net/hushiganghu/article/details/108682690

https://blog.csdn.net/cunlingwang/article/details/6712187

https://en.wikipedia.org/wiki/DMX512