Mbed OS :DMX512 灯光控制协议
? ? ? MX512協議最先是由USITT(美國劇院技術協會)發展成為從控制臺用標準數字接口控制調光器的方式。這個接口基于RS485 硬件接口,傳輸速率為250Kbps。在舞臺燈光,景觀燈控制領域得到廣泛應用。
DMX512 的幀結構
DMX512幀以break 信號開始。大于22bit,或者88 us。跟隨其后的是512 個字節的通道,可以控制512 個通道,或者170個RGB 燈具。
?開始碼(start code)
? ?一般來講,簡單的設備開始碼位0x00,代表后面的數據是燈光數據。DMX512 也可以傳輸RDM(遠程設備管理協議) 這時起始碼為0xCC。
| Code | Meaning | Notes |
| 0000 0000 | Lighting Data | Default format |
| 0101 0101 | Network Test | All slots carry the same value |
| 0001 0111 | Text Packet | Simple text message |
| 1100 1100 | Remote Device Management | RDM Control/Response message |
| 1100 1111 | System Information Packet | Identifies a DMX Universe |
| 1111 1111 | Dimmer Curve Select |
?DMX512 物理接口
DMX512 使用RS485 接口,物理插頭是5 針卡農頭。
Male Female
Pin 1 (screen)----------------------------- Pin 1 (screen)
Pin 2 (Data -)----------------------------- Pin 2 (Data -)
Pin 3 (Data +)----------------------------- Pin 3 (Data +)
Mbed OS DMX512? 協議的實現
在Mbed OS 下DMX512 的實現只要使用一個serial 口就可以了。下面我們介紹DMX512 類的實現:
?例1- 發送模式
向DMX512 燈具發送燈光數據,假設燈具是RGB LED 射燈。
DMX512A.h
#define DMX_SIZE 512 #define DMX_START_CODE 0 class DMX512A { public:DMX512A(PinName p_tx, PinName p_rx, PinName p_xmit);void put(int addr, int data);void put(unsigned char *buf, int addr = 0, int len = DMX_SIZE);void start();protected:RawSerial _dmx;DigitalOut _xmit; unsigned char data_tx[DMX_SIZE];unsigned char data_rx[DMX_SIZE];};DMX512A.cpp
?
#include "mbed.h" #include "DMX512A.h" DMX512A::DMX512A (PinName p_tx, PinName p_rx, PinName p_xmit): _dmx(p_tx, p_rx),_xmit(p_xmit){ _xmit=1;_dmx.baud(250000);_dmx.format(8, Serial::None, 2);} void DMX512A::put (int addr, int data) {if (addr < 0 || addr >= DMX_SIZE) return;data_tx[addr] = data; } void DMX512A::put (unsigned char *buf, int addr, int len) {if (addr < 0 || addr >= DMX_SIZE) return;if (len > DMX_SIZE - addr) len = DMX_SIZE - addr;memcpy(&data_tx[addr], buf, len); } void DMX512A::start () {//send break_dmx.send_break();wait_us(88); // send start code_dmx.putc(DMX_START_CODE);// send 512 channelfor (int i=0;i<512;i++)_dmx.putc(data_tx[i]);}?這一代碼中,關鍵的是發送88uS 的break 信號。
主程序 寫了一段LED 的流水控制,底色是綠色,紅燈在流動。
#include "mbed.h" #include "DMX512A.h" DigitalOut myled(PC_6); DMX512A dmx512(PD_5,PD_6,PD_4); int main() {int addr;addr=0;//set background color greenfor (int i=0;i<170;i++){dmx512.put(addr++,0x00);//red channeldmx512.put(addr++,0xff);//green channeldmx512.put(addr++,0x00);//blue channel}dmx512.start();addr=0;while(1) {wait(1.0); // 1 secmyled = !myled; // LED Flashdmx512.put(addr++,0xff);//red channeldmx512.put(addr++,0x00);//green channeldmx512.put(addr++,0x00);//blue channeldmx512.start();if (addr==510) addr=0;wait(1.0); // 1 sec} }?
?
總結
以上是生活随笔為你收集整理的Mbed OS :DMX512 灯光控制协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dmx512 java_什么书通过软件层
- 下一篇: Skyline学习