Тема бегущей строки достаточна популярна среди начинающих в микроконтроллерах. Существует достаточно большое количество вариантов, однако у большинства из них есть один недостаток — нерасширяемость. В большинстве случаев вы ограничены 20-30 колонками светодиодов, а чтобы увеличить их число придется вносить изменения в программу и схему
В этом проекте, я предлагаю новый виток в уже достаточно старой теме — теоретически, в этом проекте можно одновременно задействовать 1200 светодиодов, причем вы можете менять их количество буквально в процессе работы, без существенного изменения схемы и прошивки. Для обмена данными между блоками используется шина SPI.
Шина SPI
В проекте используется один главный(ведущий) модуль и множество подчиненных (ведомых) модулей со светодиодами — именно для этого и используется SPI. SPI (Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс) — популярный стандарт обмена данными, и существует множество устройств которые могут использовать его для связи друг с другом. Протокол SPI — 4х проводной. Один провод для передачи данных от ведущего к ведомому (MOSI, Master Out / Slave In), ещё один, для передачи от ведомого к ведущему (MISO, Master In / Slave Out), ещё один для тактирования (SCLK), и один для выбора ведомого для связи (SS). Когда ведущий хочет послать данные к ведомому, то сначала выставляет SS этого конкретного ведомого к земле. Затем выставляет бит данных на линии MOSI и принимает бит на MISO, после чего выдает такт на SCLK.
Сведения о настройке и работе с SPI можно прочитать в datasheet (начиная с стр 162). Там же можно посмотреть примеры кода для работы и конфигурации модуля. Протокол SPI может работать в различных режимах. От режима зависит по какому фронту SCLK (нарастающему или убывающему) будет происходить чтение/запись бита данных, и в каком порядке будет происходить запись/чтение битов в регистр приема/отправки. В этом проекте все настройки SPI оставлены по умолчанию, но если вы хотите связаться с другим устройством через шину SPI вам, возможно, потребуется изменить конфигурацию.
После того, как шина SPI инициализирована, байт для отправки записывается в регистр SPDR. По завершению обмена ставится бит SPIF регистра SPSR, а в регистре SPDR оказывается принятый байт. Можно настроить прерывание, когда запись завершена, а можно следить за изменениями SPIF. В проекте используется прерывание, потому что основная программа занята обновлением светодиодов.
Одним из больших преимуществ шины SPI является скорость ее работы. В проекте частота шины получается делением частоты тактирования микроконтроллера на 16. Мы используем кварцевый резонатор на 14.7456 MHz, поэтому фактическая частота SPI составляет чуть более 900kHz. В таком случае, отправка полного кадра в 21 байт занимает всего около 180 микросекунд. Этого достаточно, чтобы обновлять матрицу светодиодов с частотой примерно 60 Гц.
Схема 4 ведомых модулей вместе с ведущим модулем (линия MISO не используется):
Конструкция бегущей строки
Бегущая строка, в отличие от большинства подобных конструкции, состоит из модулей 20×5 светодиодов. Придать дополнительную функциональность не получится без жертв. Шина SPI в оригинале требует 4 провода, поэтому мы теряем возможность использовать 4 линии управления светодиодами. Так как модули не возвращают никаких данных, мы не используем ножку MISO. Итого на обмен данными используется 3 ножки. Используя схему мультиплексирования мы теряем 3 столбца. Это нестрашно, зато у нас есть возможность удлинять строку практически произвольно.
Схема соединения светодиодов:
Схема соединения матрицы с микроконтроллером модуля
Прошивка
Есть два комплекта кода для этого проекта: одна программа для главного модуля (ledarray_master.c) и отдельная программа для ведомых модулей (ledarray_slave.c). Все ведомые модули работают под управлением одной и той же программы.
Вы можете скачать полный исходный код этого проекта в архиве в конце статьи. Папка содержит дополнительные Python сценарии, для связи с Главным устройством через последовательный порт, и сценарий, который используется для отображения текущей музыкальной дорожки
Длинные провода и защита от помех
Если вы внимательно посмотрите на схему в разделе «шина SPI» выше, вы увидите шесть резисторов 1 кОм. Это один из редких случаев, когда расположение элемента на схеме указывает на то, где компонент должен располагаться в реальности. Резисторы должны быть на ведомых модулях, как указано.
Если вы реализуете этот проект, но опустите эти резисторы, вы можете столкнуться с необычным поведением, особенно с блоками физически удаленными от главного модуля. Это первый проект, в котором мы отправляем цифровые сигналы по проводам дальше, чем на несколько дюймов. Даже если скорость передачи данных составляет всего около 900 кГц, как указано выше, на большом расстоянии форма сигнала сильно искажается и вносятся помехи извне. Для предотвращения помех важно прижать линии к земле, что резисторы и делают. Мы выбрали 1K в качестве сопротивления, чтобы не добавить энергопотребления, но достаточно облегчить передачу.
Прикрепленные файлы:
- ledarray_spi.zip (7 Кб)