Главная » Световые эффекты
Призовой фонд
на ноябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Тестер компонентов LCR-T4
Паяльник
4. 200 руб.
От пользователей

Похожие статьи:


Тестер сигнала DMX-512 и двухканальный диммер

Стал глубже погружаться в мир театрального света и стало интересно, как же оно работает.

Световое оборудование сейчас управляется по DMX-512. Этот протокол работает на сетях RS-485. DMX-512 крайне простая штука. Представляет собой до 512 байт с данными о значении канала, передаваемых последовательно. И все. На самом деле вовсе не обязательно отправлять все 512 байт, но если нужно сказать, что изменилось значение на, допустим, 27 канале, то необходимо отправить значения не только измененного канала, но и все предыдущие. Остальные 485 каналов отправлять вовсе не нужно. Но в рамках данной статьи можно опустить эти подробности. Ведь мы собираемся читать, а не писать.

Для устройства я выбрал ATmega8, но, забегая вперед, скажу, что по объему памяти она бы поместилась и на Tiny13. Вот только Tiny13 не умеет тактироваться от кварца да и аппаратного UART в нем нет. Подошла бы Tiny2313, но разница в цене настолько мала, что можно и раскошелиться на более крутое железо.

Первым делом инициализируем USART на скорости 250 000.

#define USART_BAUDRATE 250000
#define UBRR_VALUE (F_CPU/16/USART_BAUDRATE-1)

void USART_Init()
{
	// Set baud rate
	UBRRH = (uint8_t)(UBRR_VALUE>>8);
	UBRRL = (uint8_t)UBRR_VALUE;
	/* Set frame format: 8data, 2stop bit */
	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
	//enable reception
	UCSRB |= (1<<RXEN);
	// разрешаем прерывание по приему байта
	UCSRB |= (1<<RXCIE);
}

Тут все достаточно просто. Не забываем включить прерывание, так как программно на такой скорости работать не рекомендуется.

#define COUNT_CHANNELS 6
unsigned char data[COUNT_CHANNELS];

unsigned int DMX_Current_Channel = 0;
unsigned int DMX_Start_Channel = 0;


ISR(USART_RXC_vect)
{
	int index = DMX_Current_Channel - DMX_Start_Channel - 1;
	if ((index >= 0) && (index < COUNT_CHANNELS)){
		data[index] = UDR;
	}
	DMX_Current_Channel++;
}

Создаем глобальный массив под интересующие данные. Для этого нужно задать сколько каналов интересуют и начальный адрес. Глобальный массив позволяет задавать данные в прерывании и использовать эти данные в основном цикле программы.

В качестве средств визуализации на моей отладочной плате есть экран, семисегментные индикаторы или же полоска светодиодов. Экран слишком жирно. Полоска, конечно, вещь интересная и наглядная, но более информативным окажется отображение данных в виде числа. Что такое динамическая индикация думаю все здесь уже знают.

Но в данном виде, как сейчас, прошивка работать не будет. Самой сложной задачей является разделение посылок между собой. Для этих целей предусмотрен интервал тишины. Линия RX опускается в 0, что означает старт-бит. Далее микроконтроллер ждет данные и 2 стоп-бита. Последних он так и не дожидается, что генерирует ошибку "Frame Error", позволяющую определить начало новой передачи.

В итоге получаем следующий код:

ISR(USART_RXC_vect)
{
	unsigned char UART_Status = UCSRA;
	unsigned char UART_Data = UDR;
	// Обнаружена ошибка (Frame error)
	if (UART_Status & (1<<FE)){
		DMX_Current_Channel = 0;
		DMX_Break = 1;
	} else if (DMX_Break == 1){
		int index = DMX_Current_Channel - DMX_Start_Channel - 1;
		if ((index >= 0) && (index < COUNT_CHANNELS)){
			data[index] = UART_Data;
		}
		DMX_Current_Channel++;
	}
}

Добавилась только переменная - флаг. Что сигнал break был пойман. Дополнительное условие (DMX_Break == 1) нужно для того, чтобы избежать ситуации, когда устройство включили в сеть прямо во время активной передачи. Тогда на линии идут корректные пакеты, но в данный момент идет вовсе не значение первого канала, а, допустим, 123. И мы получим ошибочное значение. Реальное же будет только в новой посылке.

К статье приложены два варианта устройств. первый - игрушка. Тестер линии с отображением данных первого канала на семисегментных индикаторах. Практической пользы от такого устройства мало, но для обучения можно и собрать на макетной плате.

DMX-512 тестер.

Второе же устройство куда полезнее. В нем я использовал два канала с ШИМ, данные для которых поступают по DMX-512. Его можно использовать для оцифровки старых аналоговых диммеров, управляемых сигналом 0-10 Вольт (добавив операционный усилитель), или же для сборки собственных приборов. Например LED прожектор или даже, при наличии пары сервоприводов, полноценная голова! Тут только стоит проявить фантазию!

Двухканальный диммер DMX-512

Минимальная схема будет следующей:

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
IC1 МК AVR 8-бит
ATmega8
1 Поиск в LCSCВ блокнот
IC2 ИС RS-422/RS-485 интерфейсов
MAX485
1 Поиск в LCSCВ блокнот
Q1 Кварц16 МГц1 Поиск в LCSCВ блокнот
R1 Резистор
10 кОм
1 Поиск в LCSCВ блокнот
C1, C2 Конденсатор22 пФ2 Поиск в LCSCВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Набор для сборки - LED лампа
Набор для сборки - LED лампа
Катушка Тесла AVR-программатор USB ASP
вверх