Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| zheleznaja_chast:dmx_512_send_dmx_data_arduino [2016/10/07 08:24] – создано Leo | zheleznaja_chast:dmx_512_send_dmx_data_arduino [2025/12/24 02:08] (текущий) – удалено 216.73.216.10 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== Отправка DMX 512 данных с помощью Arduino ====== | ||
| - | Еще один простой скетч, использующий Arduino и микросхему MAX485 для отправки данных DMX | ||
| - | ===== Скетч ===== | ||
| - | < | ||
| - | /* DMX Shift Out for arduino - 004 and 005 | ||
| - | * ------------- | ||
| - | * | ||
| - | * Shifts data in DMX format out to DMX enabled devices | ||
| - | * it is extremely restrictive in terms of timing. Therefore | ||
| - | * the program will stop the interrupts when sending data | ||
| - | * | ||
| - | * The elektronic foundation for DMX is RS 485, so you have to use | ||
| - | * a MAX-485 or a 75176. | ||
| - | * | ||
| - | * wirring for sending dmx with a MAX-485 | ||
| - | 1 - RO - Receiver Output --- set to ground with a 100 ohm resistor | ||
| - | 2 - RE - Receiver Output Enable -- set to ground | ||
| - | 3 - DE - Driver Output Enable -- set to 5v | ||
| - | 4 - DI - Driver Input -- Input from Arduino | ||
| - | 5 - GnD - Ground Connection -- set to ground -- refence for the DMX singal --- (DMX pin 1) | ||
| - | 6 - A - Driver Output / Receiver Input -- DMX Signal (hot)------------------ (DMX pin 3) | ||
| - | 7 - B - Driver Output / Receiver Input -- DMX Signal inversion ( cold)------ (DMX pin 2) | ||
| - | 8 - Vcc - Positive Supply -- 4,75V < Vcc < 5,25V | ||
| - | * Every dmx packet contains 512 bytes of information (for 512 channels). | ||
| - | * The start of each packet is market by a start byte (shiftDmxOut(sig, | ||
| - | * you should always send all 512 bytes even if you don*t use all 512 channels. | ||
| - | * The time between every dmx packet is market by a break | ||
| - | * between 88us and 1s ( digitalWrite(sig, | ||
| - | * | ||
| - | * (cleft) 2006 by Tomek Ness and D. Cuartielles | ||
| - | * K3 - School of Arts and Communication | ||
| - | * fhp - University of Applied Sciences | ||
| - | * < | ||
| - | * < | ||
| - | * < | ||
| - | * | ||
| - | * @date: 2006-09-30 | ||
| - | * @idea: Tomek Ness | ||
| - | * @code: D. Cuartielles and Tomek Ness | ||
| - | * @acknowledgements: | ||
| - | * | ||
| - | */ | ||
| - | int sig = 11; // signal (hot / dmx pin 3) | ||
| - | int count = 0; | ||
| - | int swing = 0; | ||
| - | int updown = 0; | ||
| - | /* Sends a DMX byte out on a pin. Assumes a 16 MHz clock. | ||
| - | * Disables interrupts, which will disrupt the millis() function if used | ||
| - | * too frequently. */ | ||
| - | void shiftDmxOut(int pin, int theByte) | ||
| - | { | ||
| - | int theDelay = 1; | ||
| - | int count = 0; | ||
| - | int portNumber = port_to_output[digital_pin_to_port[pin].port]; | ||
| - | int pinNumber = digital_pin_to_port[pin].bit; | ||
| - | // the first thing we do is to write te pin to high | ||
| - | // it will be the mark between bytes. It may be also | ||
| - | // high from before | ||
| - | | ||
| - | | ||
| - | // disable interrupts, otherwise the timer 0 overflow interrupt that | ||
| - | // tracks milliseconds will make us delay longer than we want. | ||
| - | | ||
| - | // DMX starts with a start-bit that must always be zero | ||
| - | | ||
| - | //we need a delay of 4us (then one bit is transfert) | ||
| - | // at the arduino just the delay for 1us is precise every thing between 2 and 12 is jsut luke | ||
| - | // to get excatly 4us we have do delay 1us 4 times | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | |||
| - | for (count = 0; count < 8; count++) { | ||
| - | |||
| - | if (theByte & 01) { | ||
| - | | ||
| - | } | ||
| - | else { | ||
| - | | ||
| - | } | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | } | ||
| - | |||
| - | // the last thing we do is to write the pin to high | ||
| - | // it will be the mark between bytes. (this break is have to be between 8 us and 1 sec) | ||
| - | | ||
| - | // reenable interrupts. | ||
| - | | ||
| - | } | ||
| - | void setup() { | ||
| - | | ||
| - | | ||
| - | } | ||
| - | void loop() { | ||
| - | |||
| - | // sending the break (the break can be between 88us and 1sec) | ||
| - | | ||
| - | | ||
| - | // | ||
| - | | ||
| - | // | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | for (count = 1; count< | ||
| - | | ||
| - | } | ||
| - | } | ||
| - | </ | ||