Бегущие поворотники на ленте WS2812 и Arduino
Arduino: 1.8.6 Hourly Build 2017/10/20 02:33 (Windows 7), Плата:«Arduino/Genuino Uno» D:\arduino\iop\arduino-nightly\arduino-builder -dump-prefs -logger=machine -hardware D:\arduino\iop\arduino-nightly\hardware -tools D:\arduino\iop\arduino-nightly\tools-builder -tools D:\arduino\iop\arduino-nightly\hardware\tools\avr -built-in-libraries D:\arduino\iop\arduino-nightly\libraries -libraries D:\arduino\iop\arduino-nightly\libraries\libraries -fqbn=arduino:avr:uno -ide-version=10806 -build-path C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607 -warnings=none -build-cache C:\Users\305E~1\AppData\Local\Temp\arduino_cache_271047 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -verbose D:\arduino\arduino-nightly\libraries\ad\ad.ino D:\arduino\iop\arduino-nightly\arduino-builder -compile -logger=machine -hardware D:\arduino\iop\arduino-nightly\hardware -tools D:\arduino\iop\arduino-nightly\tools-builder -tools D:\arduino\iop\arduino-nightly\hardware\tools\avr -built-in-libraries D:\arduino\iop\arduino-nightly\libraries -libraries D:\arduino\iop\arduino-nightly\libraries\libraries -fqbn=arduino:avr:uno -ide-version=10806 -build-path C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607 -warnings=none -build-cache C:\Users\305E~1\AppData\Local\Temp\arduino_cache_271047 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -verbose D:\arduino\arduino-nightly\libraries\ad\ad.ino Using board ‘uno’ from platform in folder: D:\arduino\iop\arduino-nightly\hardware\arduino\avr Using core ‘arduino’ from platform in folder: D:\arduino\iop\arduino-nightly\hardware\arduino\avr Detecting libraries used… «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «nul» «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «nul» «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «nul» «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\preproc\ctags_target_for_gcc_minus_e.cpp» In file included from D:\arduino\arduino-nightly\libraries\ad\ad.ino:3:0:
D:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0/Adafruit_ADXL345_U.h:26:29: fatal error: Adafruit_Sensor.h: No such file or directory
#include
compilation terminated.
Используем библиотеку Adafruit_NeoPixel-master версии 1.0.3 из папки: D:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master Используем библиотеку Adafruit_ADXL345-1.0.0 версии 1.0.0 из папки: D:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0 exit status 1 Ошибка компиляции для платы Arduino/Genuino Uno.
Требования
- Автомобиль Chevrolet Cobalt в комплектации LTZ или Ravon R4 любой комплектации;
- Любой программируемый микроконтроллер, я использую Arduino UNO;
- MCP2515 — CAN-контроллер с интерфейсом SPI;
- DFPlayer Mini — аппаратный проигрыватель MP3 файлов с последовательным интерфейсом управления;
- Любой динамик для воспроизведения звуков.
Стоимость такого удовольствия следующая: Arduino (250 руб.), MCP2515 (130 руб.), DFPlayer (60 руб.), динамик (50 руб.). Итого 490 рублей.
SWCAN шина и используемые в ней коды
В подробные детали о шине вдаваться не буду, для нашей задачи достаточно о ней знать следующее: представлена одним проводом, работает на скорости 33.3kbps и в том числе содержит в себе команды для индикации системных сообщений.
В интернете мне удалось найти два кода соответствующих включению и выключению звука поворотников, но для меня так же критичны звуки незакрытых дверей и непристегнутого ремня. Потому пришлось прибегнуть к самостоятельному “отлову” необходимых кодов. Для этого я использовал программу Can Hacker и залитый соответствующий скетч в ардуино.
Проехавшись буквально пять минут, создавая ситуация для воспроизведения нужных мне звуков я вывел искомые значения. С радостью делюсь ими с вами (если вдруг, вы найдете еще какие-нибудь интересные значения, не поленитесь поделиться ими с нами ):
Поворотник (включить): | Extended ID: 0×10400060 DLC: 5 Data: 0×82 0×08 0×01 0xFF 0xD4 |
Поворотник (выключить): | Extended ID: 0×10400060 DLC: 5 Data: 0×81 0×08 0×01 0xFF 0xD5 |
Открытая водительская дверь на зажигании (включить): | Extended ID: 0×10400040 DLC: 5 Data: 0×86 0x3C 0xFF 0xFF 0×58 |
Открытая водительская дверь на зажигании (выключить): | Extended ID: 0×10400040 DLC: 5 Data: 0×86 0x3C 0×00 0xFF 0×58 |
Сброс одометра (единократный щелчок): | Extended ID: 0×10400060 DLC: 5 Data: 0×85 0x1E 0×01 0×33 0×38 |
Непристегнутый ремень на скорости выше 20км/ч (включить): | Extended ID: 0×10400058 DLC: 5 Data: 0×87 0×65 0×64 0xFF 0×05 |
Непристегнутый ремень на скорости выше 20км/ч (выключить): | Extended ID: 0×10400058 DLC: 5 Data: 0×87 0×65 0×00 0xFF 0×05 |
Тройной писк при открытой двери в движении (единократно): | Extended ID: 0×10400060 DLC: 5 Data: 0×86 0×28 0×04 0xFF 0×88 |
Движение на стояночном тормозе (включить): | Extended ID: 0×10400060 DLC: 5 Data: 0×86 0x1E 0xFF 0xFF 0×78 |
Движение на стояночном тормозе (выключить): | Extended ID: 0×10400060 DLC: 5 Data: 0×86 0x1E 0×00 0xFF 0×78 |
Полученных данных достаточно, а значит мы переходим к программированию микроконтроллера.
Сфера применения
Адресные светодиоды используются там, где обычные виды линейных светильников оказываются несостоятельны и справиться с поставленной задачей не могут. Основная сфера использования:
- создание полноцветных модулей;
- конструирование световых приборов типа «soft lights»;
- в оформлении участков интерьера, декора фасадов или иных элементов;
- в рекламных конструкциях;
- для создания LED экранов. Которые популярны при оформлении мероприятий шоу-бизнеса или рекламных кампаний.
Адресные светодиоды относительно дороги, что заметно снижает распространение и востребованность таких конструкций. Кроме того, необходимость использования дополнительных устройств (контроллер), загрузки в них программного обеспечения и прочие сложности отпугивают массового пользователя.
Теперь тайминги
Изначально на ножке стоит лог. единица. Для перевода светодиода в режим получения сигнала необходимо подать логический ноль в течение 5 мс. После этого идут биты данных: для передачи «нулевого» символа необходимо подать логическую единицу, и сразу подать логический ноль. Для передачи «единичного» символа необходимо подать логическую единицу, подождать 3 мкс и подать логический ноль. Интервал между сигналами от 6 до 20 мкс. Временные интервалы можете увидеть на осциллограммах в разных временных развертках.(рис3, рис2, рис1).
После подачи последнего информационного бита на шину необходимо подать логическую единицу. Установленные таким образом цвета будут светиться пока вы не выключите питание или не обновите цветовой рисунок новым пакетом данных.
И последний нюанс — на моей ленте при таком управлении светодиодами, если долго не отправлялись данные, и при попытке начала передачи нового пакета данных первый светодиод принимает 24 бита, дальнейшие биты начинает передавать на следующие светодиоды, но свой цвет не меняет.
Пока с проблемой справился таким образом: в исходном состоянии стоит лог. единица, даю сигнал инициализации (5 мс), 24 бита — пакет данных для первого светодиода, жду 30 мкс, снова даю сигнал инициализации (5 мс), и отправляю информационные биты для всех светодиодов.
Купить адресную светодиодную ленту
Ленты ws2812 достаточно распространены на российском рынке, их без труда можно найти в многочисленных специализированных магазинах. Можем посоветовать интернет-магазин Giant4.Ru с достаточно широким ассортиментом различных светодиодных лент и вполне низкими ценами, сопоставимыми с али. Если же есть возможность и желание ждать товар с Алиэкспресса, то ниже мы собрали вместе некоторые популярные варианты у надежных поставщиков:
Адресная светодиодная лент 1m/4m/5m WS2812B 30/60/144 pixels,IP30/IP65/IP67 DC5V | Светодиодная лента DC5V WS2812B 1m/4m/5m 30/60/74/96/144 pixels/leds/m от надежного поставщика | Адресная светодиодная лента DC5V 1m/4m/5m WS2812B |
Как работает адресная светодиодная лента
Принцип работы ленты следующий. Она поделена на сегменты, в каждом из которых находятся светодиод и конденсатор. Они все подключены параллельно, а данные передаются последовательно от одного сегмента к другому. Управление осуществляется контроллером, в котором прописывается программа функционирования. Управлять лентой можно через платформу Ардуино.
Маркировка адресной ленты:
- Black PCB / White PCB – цвета подложки;
- 1м/5 м – длина адресной ленты;
- 30/60/74 и т.д. – сколько светодиодов приходится на 1 метр ленты;
- IP30, IP65, IP67 – степень влаго- и пылезащищенности ленты =.
Адресные светодиодные ленты используются для сборки полноценных модулей, в конструировании ламп с управлением soft lights, для декоративной подсветки, в построении диодных экранов уличной рекламы.
- Ws2812b
Видео инструкции и ролики
Обучающее видео на канале HomeMade:
Видео по созданию бегущей строки на базе ленты ws2112
Подключение
Итоговая схема подключения
Начнем с CAN-декодера. Прежде чем начать с ним работать, я по советам других пользователей сразу перепаял кварцевый резонатор c 8мГц на 16мГц. У платы MCP2515 в сторону шины два вывода: CAN High и CAN Low. Работать мы будем с шиной SWCAN, которая по своей природе является однопроводной. Значит, CAN High подключаем к шине, CAN Low на землю. Тут уже присутствуют варианты:
- Взять SWCAN с диагностической колодки, пин №5. Там же кинуть землю;
- Взять SWCAN с разъема для магнитолы, в нем он находится под номером №14, а земля №38:
Другой стороной MCP2515 подключаем к нашему микроконтроллеру — Arduino UNO. Делаем это как показано на схеме:
- INT => D2;
- SCK => D13;
- SI — D11;
- SO — D12;
- CS — D10;
- GND — GND;
- VCC — 5V.
MP3 проигрыватель управляется по последовательному порту через пины RX и TX. По факту RX не используется, управление одностороннее. В случае с Arduino можно использовать как физический интерфейс, размещенный на пинах D0 (RX) и D1 (TX) Ардуины, так и воспользовавшись библиотекой SoftwareSerial поднять программный интерфейс на любом цифровом пине. Я выбрал второй вариант и использовал для него пин D6. При первом подключении я столкнулся с помехами на динамик, решением оказалось TX пин подключить через 1кОм резистор. Подключаем проигрыватель так:
- VCC — 5V;
- GND — GND;
- TX — D6;
- SPK_1 и SPK_2 — на динамик.
На этом подключение заканчивается и мы переходим к теории о шине SWCAN.