Проблемы с управлением Rainbowduino
Вопрос
Я только что купил Радужный Дуино для управления загрузкой отдельных светодиодов (НЕ RGB-матрицы).Вся документация на данный момент направлена на управление RGB-массивами, которые не то, что мне нужно.
Если вы не знакомы с Rainbowduino, то это Arduino клон с 24 каналами постоянного тока по 120 мА, 8 каналами драйвера super source по 500 мА каждый и широкой адаптацией выходного напряжения от 5 В до 12 В постоянного тока.Идеально подходит для управления светодиодами.Веб-страница продукта находится здесь: http://www.seeedstudio.com/blog/?page_id=187
Я подключил 16 светодиодов и хочу иметь возможность включать и выключать каждый из них по отдельности с помощью digitalWrite()
.Я загрузил на доску некоторый демонстрационный код, который на самом деле не работает.Я выяснил, что 8 каналов источника драйвера легко управляются с помощью digitalWrite()
на контактах 3-11.Однако управлять остальными 24 каналами приемника сложнее.По-видимому, они управляются 3 регистрами сдвига (по одному на каждый), доступ к которым я могу получить только с помощью shiftOut.Я понятия не имею, как это работает.Кто-нибудь может помочь мне указать правильное направление?
Половина светодиодов подключена к синему цвету 1-8, а другая половина - к зеленому цвету 1-8.Положительные опоры подключены к VCC1-2, которые установлены на ВЫСОКИЙ уровень.Я уверен, что схема подключена правильно, у меня проблемы с программированием.
Я просмотрел пример кода, который поставляется вместе с Rainbowduino, но я не могу понять его смысла.Как я могу устранить эту проблему?
Решение
Использование сдвигового регистра для мультиплексирования (или демультиплексирования, в зависимости от вашей точки зрения) входов/выходов очень распространено в цифровой электронике.
По сути, вы меняете сохраняющие контакты на вашем контроллере на необходимость включения в конструкцию другой микросхемы (сдвигового регистра).
В этом случае регистр работает как преобразователь последовательного типа в параллельный;он имеет линию последовательного ввода, на которую поступают биты от вашего процессора.Он также имеет 8 параллельных выходов, подключенных к 8-разрядной памяти, которая последовательно загружается из центрального процессора.Используя это, вы можете "сместить" 8 бит данных на одном выводе (плюс, как правило, один вывод для синхронизации), которые затем сохраняются в регистре сдвига и могут параллельно управлять 8 светодиодами.
В этом конкретном случае вам нужно выяснить, к какому порту AVR подключены регистры сдвига (здесь драйверы приемника постоянного тока MBI5168 содержат регистры сдвига).Они должны быть подключены к паре выходов, один для передачи данных и один для синхронизации.Как только вы узнаете эти штифты, вы сможете управлять ими самостоятельно с помощью Смещение команда.
Копаем немного дальше, этот примерный "эскиз" содержит следующие определения в файле под названием "Rainbow.h":
//MBI5168
#define SH_DIR_OE DDRC
#define SH_DIR_SDI DDRC
#define SH_DIR_CLK DDRC
#define SH_DIR_LE DDRC
#define SH_BIT_OE 0x08
#define SH_BIT_SDI 0x01
#define SH_BIT_CLK 0x02
#define SH_BIT_LE 0x04
#define SH_PORT_OE PORTC
#define SH_PORT_SDI PORTC
#define SH_PORT_CLK PORTC
#define SH_PORT_LE PORTC
Конечно, это всего лишь цифровые "слухи" (у меня нет устройства, я никогда не программировал ни на каком * duino), но я бы сказал, что это система доставки пуль, извергающих частицы, которую вы ищете.
Я интерпретирую это примерно так:
- PORTC - это тот, который подключен к регистрам сдвига, все управляющие контакты находятся в PORTC.
- Выделено четыре контакта (вместо оптимистичных двух, о которых я упоминал выше).
- Тактовый сигнал - это pin-код PORTC: 2, а данные - PORTC: 1.
Другие советы
Управление каждым отдельным светодиодом требует значительных затрат времени, поэтому лучше мыслить рядами, тогда как каждый цвет светодиода представлен в виде разряда, так что это 8 бит x 3 цвета (красный, зеленый, синий).Я написал небольшую библиотеку Rainbowduino, которая позволяет вам легко устанавливать каждую строку или фрейм: