로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2012/03/15
첨부#1 dmx512-6ch-rcvr.zip (6KB) (Down:2)
ㆍ추천: 0  ㆍ조회: 3205   
  Arduino DMX512 송신기 제작
DMX는 DMX512 라고 하며, 2선식 차동신호(RS485 인터페이스)를 사용하는 직렬 비동기 통신방식으로
250Kbps의 빠른 전송속도와 1 start bit, 8 Data bit, 2 Stop bit, No parity 의 포맷을 사용합니다.
먼저 DMX의 통신 규격에 대하여 간단히 설명하고 송신방법을 설명하도록 하겠습니다.

DMX512 커넥터
DMX512 연결에 사용하는 커넥터는 3핀 XLR 혹은 5핀 XLR을 사용한다.
 

송수신 공통으로 1번 핀은 GND로 케이블의 시일드(정전차폐용 금속외피)에 연결한다.
회로에서 1번 GND 핀은 직접 전원 -측에 연결하지 않고 100옴 저항을 직렬로 연결한다.
실제 통신신호선인 2 번핀은 D- 신호를, 3 번핀은 D+ 신호를 연결한다.
5핀 방식 커넥터는 4, 5번은 사용하지 않거나, 전원단자로 사용하기도 한다.

연결 핀의 위치만 참고한다. 요즘 위와 같이 2개의 커넥터를 공통으로 연결하지 않는다.
비용을 절약하거나 시험용으로는 위와 같이 2개를 하나의 RS485 포트에 연결해도 되지만,

2개의 DMX 커넥터가 있는 경우는 2개의 RS485 포트에 2개의 커넥터를 송수신 전용으로 각각 연결한다.
커넥터는 전기신호가 나오는 송신측은 금속핀이 돌출되지 않은 Jack 이고, 수신측은 금속핀이 돌출된 Plug 이다.
커넥터의 절연용 몸체는 플라스틱이므로 전기가 통하는 금속핀과는 반대의 형태로 구성되어 있다.

비절연 방식
비절연 방식은 가장 많이 사용하는 방식으로 동일한 전원을 사용하는 경우에 적용되는 방식이다.
좌측이 MPU의 UART 포트에 연결하고 우측은 DMX512 커넥터에 연결한다.
 
1번은 GND, 2번은 D+, 3번은 D- 로 연결한다. 통신선은 노이즈나 작은 신호에 반응하지 않도록
풀업 R1과 풀다운 R3 저항을 신호극성과 반대로 연결한다. D-는 +로 풀업해야 하고, D+는 -로 풀다운해야 한다.
송신신호 DI는 TX에 연결하고, 수신출력 RO는 RX에 연결한다. 송신제어 DE는 대부분 D2로 연결한다. 

DMX 통신선에 통신신호가 없으면,  D-는 +5 Volt 로 되고, D+는 0 Volt로 된다. (Null Level)
DMX 통신선에 통신신호가 있으면, D-는 0 Volt 로 되고, D+는 +5 Volt로 된다. (Active Level)
DMX 송신기와 마지막에 연결하는 수신기에는 신호반사를 억제하는 더미저항 R2를 연결한다. 
 
위 회로를 아듀이노에 연결하는 방법은 RO 출력을 RX (D0)로, TX(D1)을 DI 입력으로 연결한다.
그외 아듀이노의 회로는 일반적인 응용과 같으므로 생략한다.

절연방식
절연방식은 LED 전원이 다른 장치로 연결하거나, 장거리 혹은 잡음이 있는 곳에 사용할 때 효과적이지만, 
가격이 비싼 단점이 있다. 또한 절연된 DC-DC 컨버터 전원 혹은 다른 장치의 전원을 연결해 주어야 한다.

 

DMX512의 신호
이 신호는 RS485 인터페이스를 통과하지 않은 TTL 신호이므로 신호 극성이 반대이다.
즉 5V Level 이 신호가 없는 Null 상태이고, 0 Level 이 신호가 있는 Active 상태이다.
 

위 그림을 보면 처음엔 Null 상태(HIGH)로 있다가, 88us의 Break 신호(LOW)가 나오고,
다음에 2 개의  4us 정지 비트로 8us HIGH 신호가 있다. 수신기에 Frame으로 FE 오류가 들어온다.

이 신호를 DMX512 수신장치는, 이제부터 채널 데이터가 들어 온다는 명령으로 처리한다.
즉 88us의 중간이후 부분을 그러나 FE 오류가 들어있는 1개의 11 비트 1 Frame으로 인식한다. 
수신 가로채기가 발생하며, 수신처리 함수에서 FE가 검출되고, DMX512의 Break 신호로 처리한다.

BREAK 신호는 88us 이상 송신한다. (수신장치가 느리면 1초까지 시간을 줄 수도 있다, 실제로는 안준다)
DMX512 신호는 88us 이상의 breakr 신호를 시작으로, 모두 513개의 11 비트 비동기 직렬신호를 송신한다.

이어지는 최초의 채널 데이터 값은 항상 0 으로 수신장치에 브레이크 신호 이후에 시작 채널이 0임을 알려준다.
이 Start 명령인 채널번호 0은 잘못 들어올 수도 있으므로, 값이 0 인지 확인하지만, 사용할 일은 없다. 
 
이후 비동기 신호 표준과 같이 1 개의 시작비트, 8 개의 데이터 비트, 마지막으로 2개의 정지비트로 된
정상적인 DMX512의 제어신호인 512 개의 채널 데이터 신호가 연속된다. (1~512 순서대로 데이터만 있다)
 
DMX에서는 채널번호를 송신하지 않으며, 1번 채널부터 ~512 채널까지 11 비트 프레임으로 송신한다. 
송신장치가 송신 이외의 다른 처리를 해야 한다면, 채널과 채널 사이는 필요한 만큼 null 상태가 되어도 좋다.

1 비트의 펄스폭 유지 시간은 4uS 이며, 11 비트인 DMX 1 바이트를 송신하려면 44 uS이 필요하다.
UART 포트에서 DMX 속도를 맞춘다면 250,000 bps 이며, 포맷은 1 START, 8 DATA, 2 STOP 이다.
DMX 데이터인 11 비트 Frame은, START 비트 1개, 데이터 비트 8개, STOP 비트 1개로 구성되며,
START는 항상 0 이고, STOP은 항상 1 이다. 데이터는 전송값에 따라서 0~255 (0x00 ~ 0XFF) 이다.

DMX512의 채널 데이터
첫 번째 데이터는 0번 채널이며, DMX에는 0번 채널이 없으며, 시작 신호로 사용한다.(START BYTE)
따라서 실지로 송신되는 10 비트의 폭의 채널은 모두 512 개지만, 시작 프레임을 포함한 총 전송 프레임은 513 개이다.
 

DMX 수신장치의 채널번호가 03 이고, 내장된 채널이 4 개라면
0 번은 전체 밝기를 제어하고, 1~3 번은 R, G, B 채널의 밝기이다.  
따라서 DMX 송신측의 3,4,5,6 채널이 수신장치 3의 채널 0,1,2,3으로 전송된다.
3축 Motion Control을 한다면 3 채널이 추가된다. 만일 백색 LED를 추가한 장치인 경우
Dim, White, Red, Green, Blue 채널 다음에 X, Y, Z로 모두 8 채널이 배정된다.

DMX 송신방법
위의 회로로 만든 아듀이노 시험용 송신기와 시험할 DMX512 수신기를 DMX 케이블로 연결해야 한다. 

송신기는 LED의 밝기를 결정하는 DMX 데이터는 처음에 0 으로 송신하고, DMX512 채널의 데이터를 모두 송신하면, 
다시 1~512 채널을 송신할 때 데이터는 +3 씩 증가되어, 시험용 DMX 수신기에 연결된 LED를 천천히 밝게 시험한다.

LED 밝기가 255로 되면 -3씩 감소하여, 시험용 DMX 수신기에 연결된 LED를 천천히 어둡게 시험한다.
시험용 송신기를 끌 때 까지 점점 밝게와 점점 어둡게를 반복한다.

라이브러리를 쓰지 않는 DMX512 시험용 송신소스
// DMX008fade.pde
// DMX512 수신기 시험용 송신
// Tomek Ness 와 D. Cuartielles의 소스를 참조함
// Peter Szakal 와  Gabor Papp의 arduino 008 소스를 개조함.
// 저자 사이트는 
http://nextlab.hu 이다.

int sig = 11;   // 송신 신호의 출력 핀 (소프트웨어 방식이므로 다른 핀으로 바꿀 수 있다)
int value = 0;  // 송신할 밝기 값, 초기값은 0
int valueadd = 3;
// 데이터를 변화시키는 크기 (이 값을 바꾸면 LED의 밝기를 변경하는 속도가 바뀐다)
 
// DMX 바이트를 핀으로 출력한다. 클럭은 16MHz 이다.
// 직렬통신 이나 타이머 가로채기는 사용하지 않는다.
// 오직 millis() 지연함수를 사용하고 있다.

// DMX 송신 함수의 시작
// 정지비트 1개 + 시작비트 1개 + 데이터 비트 8개 + 정지 비트 1개를 송신한다. 
void shiftDmxOut(int pin, int theByte)  // (송신하는 핀 번호와 전송하는 데이터를 받는다)
{
  int port_to_output[] =   
// sig로 정의된 송신 핀을 설정한다
  {
    NOT_A_PORT,
    NOT_A_PORT,
    _SFR_IO_ADDR(PORTB),
    _SFR_IO_ADDR(PORTC),
    _SFR_IO_ADDR(PORTD)
   };

  int portNumber = port_to_output[digitalPinToPort(pin)];  // 통신 출력 핀을 정의
  int pinMask = digitalPinToBitMask(pin); 
// 통신 출력 핀을 출력으로 정의
  
  // 처음에는 출력 핀을 high로 만들어야 한다 (null 상태)
  _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;
  delayMicroseconds(10);
  // 10us 동안 출력 핀을 high로 한다. 이것은 직전의 정지 비트 2를 만든다.

  // milliseconds 함수는 us 지연에 사용하기는 너무 크다.
  cli();  // 혹 다른 곳에서 가로채기를 사용할 수도 있으니, 모든 가로채기를 정지, 

  // DMX는 0 으로 된 비트로 시작한다, 송신핀을 low로 출력
  _SFR_BYTE(_SFR_IO8(portNumber)) &= ~pinMask;    // 시작 비트를 송신

  // 4us의 지연이 필요하다.
  // 이렇게 4us을 만들면, delayMicroseconds 함수 보다는 안정적이다.
  asm("nop nop nop nop nop nop nop nop ");
  asm("nop nop nop nop nop nop nop nop ");

  asm("nop nop nop nop nop nop nop nop ");
  asm("nop nop nop nop nop nop nop nop ");

  asm("nop nop nop nop nop nop nop nop ");
  asm("nop nop nop nop nop nop nop nop "); 
    // 시작 비트 폭을 만들기 위해 4us을 기다리고

  for (int i = 0; i < 8; i++)
  {
    if (theByte & 01)        // 데이터 8 비트를 모두 송신 했다면?
    {
      _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;  // 송신출력 핀을 high로 (정지 비트를 송신)
    }

    else    // 만일 데이터 비트 8개의 송신 중이면?
    {
      _SFR_BYTE(_SFR_IO8(portNumber)) &= ~pinMask; // 송신 데이터 비트를 출력 (8개의 데이터를 한 비트 씩 송신)
    }


    asm("nop nop nop nop nop nop nop nop ");
    asm("nop nop nop nop nop nop nop nop ");

    asm("nop nop nop nop nop nop nop nop ");
    asm("nop nop nop nop nop nop nop nop ");

    asm("nop nop nop nop nop nop nop nop ");
    asm("nop nop nop nop nop nop nop nop ");   
// 데이터 비트 간격 4us 을 기다리고,,,
    theByte >>= 1;                                             // 바이트 카운터가 01 로 될 때 까지 시프트한다.
  }


  // 마지막으로 송신출력 핀을 high로 한다
  // 바이트를 송신 중. (break 명령은 8 us ~ 1 sec 사이어야 한다)
  _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask; 
// 정지 비트 1을 송신함
  sei();  // 이함수를 나가기 전에, 다른 가로채기를 허용
// dmx 송신 함수의 끝

void setup()    // 아듀이노 기판의 초기화 함수 (전원을 켤 때, 한번만 실행된다)
{
  pinMode(sig, OUTPUT);   // 통신 출력으로 사용하는 MPU 핀의 기능을 출력 용도로 설정
}
  // setup의 끝 

void loop()  // 아듀이노 기판의 주함수 (전원을 끌 때 까지, 무한 반복된다)
{
  // DMX 신호를 출력한다
  // 먼저 DMX512의 break 명령을 88us ~1sec 사이로 만든다
  digitalWrite(sig, LOW);  // Break는 low 이다
  delay(10);  // Break 시간은 10ms 이다. (88us 보다 크면 된다, 너무 길면 송신이 늦어 진다)

  // break 다음의 10us MAB는 송신 함수에서 정지 비트를 먼저 송신하므로 이것으로 대치한다.
  shiftDmxOut(sig, 0);   
// 시작 채널의 데이터는 0 으로 송신, DMX 데이터의 시작을 알린다.
  for (int count = 1; count <= 512; count++)  // 시험용 데이터를 송신하는 512 개  
  {
    shiftDmxOut(sig, value);  // 이어서 채널 1 ~ 체널 512 데이터를 순서대로 송신한다
  }
 

  // Break + MAB + ch 0 + DMX1 ~ DMX512를 모두 송신 하고 나면
  value += valueadd;    // 다음은 LED의 데이터를 +3으로 (혹은 -3), 수신측 LED를 점점 밝게(어둡게) 한다. 
  if ((value == 0) || (value == 255))

 {
    valueadd *= -1;   // LED의 밝기가 0 혹은 255 이면, LED 변화값을 -3 으로 바꾼다, 수신측 LED를 점점 어둡게 만든다.
  }  // if의 끝
}    
// loop의 끝

 
이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 AVRTOOLS™

   
윗글 아날로그 8ch 데이터 로거
아래글 nRF24L01 무선모듈의 사용방법
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 1064 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 18166 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 3053 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 3205 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 6493 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 5270 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3795 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 3317 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3702 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 3338 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3618 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 8287 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 4363 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3773 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 5713 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 4437 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3949 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3649 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6976 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 4142 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5832 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 7477 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 8627 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4682 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 5175 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5829 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 9918 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 17972 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 7024 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5743 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 5112 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 4319 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 6306 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4878 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4816 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 5139 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5686 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 4265 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13887 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9841 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 6142 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 7091 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 4343 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3633 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3403 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 5484 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 5328 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5987 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4394 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3655 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4984 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9965 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3837 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 5253 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6817 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 5132 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 5169 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 5462 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 5032 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7912 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 7054 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0