Официальный сайт компании Arduino по адресу arduino.cc
вместе не работают библиотеки adafruit_neopixel и VirtualWire (RadioHead )
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Здравствуйте. Столкнулся с проблемой взаимодействия библиотеки для ленты WS2812 и rf передатчика на 433 Mhz. Выяснил, что библиотеки используют одинаковое прерывание по Timer1. Как подправить одну из этих библиотек на работу с Timer2, найти не смог. Товарищи с буржуйских форумов советуют продвинутую библиотеку RadioHead, работающую практически с любыми RF передатчиками (за исключением esp ). В этой библиотеке есть возможность, раскоментировав один define из файла *.cpp переключить ее на работу с таймером 2. Внимательно прочел, сделал все как по феншую, но та же беда в работе скетча.
Как только раскоменчиваю строчку pixels.show(); для отображения WS2812 ленты, приемная часть затыкается и ни одного пакета по радиоканалу на ардуинку более не проходит.
Прошу помощи для наладки взаимодействия цветной LED ленты и rf передатчика.
Any suggastions?
В виртуалвайр очень простая работа с таймером, его просто заводят, чтобы он дергался с определённой частотой и всё. Переделать легко, если Вы умеете работать с таймерами.
Я переделывал её на второй таймер, но мне нужен был только приёмник (передатчик не был нужен). И ещё, я намертво забил туда скорость передачи 2000 (убрал параметр).
Если такое решение (только для приёмника и с фиксированной скоростью) устроит, могу дать.
Мне как раз нужен приемник и 2000 бод приемлемая скорость! В принципе мог бы и сам посидеть вспомнить регистры, но буду благодарен за Вашу библиотеку :)
Ну, давайте, потихоньку. Чтобы Вы могли запустить мои примеры. Вам нужны мои файлы.
Значит у меня есть два файла, которые надо расположить как библиотеки:
1. FS1000A.h - это просто небольшая обёртка вокруг VirtualWire. Мне удобнее работать с нею, чем в оригинальной VirtualWire. Посмотрите на её функции - поймёте почему. Она нуждается в оригинальной VirtualWire и всё делает через неё. Там ничего не поменено. Эту "библиотеку" использует передатчик из моего примера.
2. FS1000A_V.h - этот файл уже включает в себя переделанную VirtualWire, т.е. оригинальная VirtualWire ему не нужна. Реализован только приёмник. Всё работает на втором таймере. Эту "библиотеку" использует приёмник из моего примера.
Ещё раз, эти файлы ставим как библиотеки (в сответсвующие папки).
Вот все файлы.
FS1000A.h
FS1000A_V.h
Пример - передатчик
Пример - приёмник
Спаисбо! Попробую) Если не стартанет, буду уже тогда перепиливать собственноручно либу =)
надеюсь, все получится.
Удивительно... даже с вашей библиотекой не хотит работать. Как только раскоменчиваю строчку //pixels.sow(); отвечающую за вывод инфы в ленту, так сразу затыкается передача по rf.
Нашел даже другую библиотеку якобы не использующую прерываний. История та же. Как только вывод инфы на ленту, приемник словно засыпает ))
Третью ночь победить не могу.
Похоже, что Ваша библиотека для WS2812 использует и первый, и второй таймеры (так, например, себя ведёт библиотека для TLC5940).
Дайте мне ссылку на Вашу библиотеку, я посмотрю какого ей надо.
Самая распространенная для ws2812
вот описание https://www.adafruit.com/category/168
вот сырцы https://github.com/adafruit/Adafruit_NeoPixel
сейчас когда я чуть больше нагрузил выводом анимации ленту, у меня даже подвисать система начала и датчики иногда подвисают. Думаю, может там уже стек оверфлов происходит.
Библиотечка по ходу кушает не малые ресурсы.
Ну, так понятно.
Во-первых, таймеры они не используют, поэтому забудьте наши заморочки с таймерами.
Во-вторых, посмотрите на функцию show (особенно на строку 135 в файле "Adafruit_NeoPixel.cpp") - они там тупо запрещают людбые прерывания, поскольку им нужен точный тайминг.
Разумеется, приёмник работать не будет, т.к. ему прерывания нужны.
спасибо очень дельно!
Что нибудь посоветовать сможете ?
Что нибудь посоветовать сможете ?
Использовать ленту и передатчик поочерёдно.
Что нибудь посоветовать сможете ?
Не могу, потому, что не знаю Вашей задачи. Можно, например, на передатчик взять отдельный маленький контроллер (ATtiny45, например). Или наоборот, на ленту. Но не зная задачи как посоветуешь?
менябы устроила хотя бы периодическая отправка получение данных в промежутках между выводом на ленту.. на сколько я понимаю, прерывания снова разрешаютмя по окончании отправки пакета данных на ленту, но у меня пакеты шлютмя так часто, что библиотека получения rf данных не успевает проглотить даже 1 пакет.
Беда) Если я буду использовать одну ардуину для полно загрузки вывода инфы на RGB ленту, а вторую приконекчу к ней для ретрансляции пакетов с радиоканала, какой тип соединения между ардуинами бнаиболее стабильно будет работать, на ваш взгляд? Там UART тоже живет на прерываниях по ходу... Как на счет I2C или SPI ?
Задача получить данные по беспроводному соединению, обработать их и вывести на ленту определенную динамику в зависимости от входящих данных.
Да, зачем вторая ардуина? На приёмник выше крыши хватит крохотулечки типа ATtiny45. Для связи, опять же я не знаю какие пины у Вас чем заняты, но я бы использовал SPI, а если нет возможности, то программный SPI. Ну, можно сделать полный "самогон" на двух пинах - по сути тот же SPI, но без выбора слэйва - чего его выбирать, когда он один?
Главная ардуина работает с лентой, а когда у неё есть время, соединяется у ATtiny и та её всё. что успело прийти отдаёт. Главна делает что нужно с лентой и опять спрашивает. Ну, и так далее.
Задача получить данные по беспроводному соединению, обработать их и вывести на ленту определенную динамику в зависимости от входящих данных.
И в чём проблема? Получил данные, вывел на ленту и ждёшь опять новых данных.
И в чём проблема? Получил данные, вывел на ленту и ждёшь опять новых данных.
Я понимаю проблему так: пока выводишь на ленту (с выключенным приёмником) можно пропустить, пришедшие данные.
Если я правильно понимаю, проблема в том, что данные вообще перестают гнаться, ибо вывод на ленту довольно часто происходит. Там достаточно динамичные световые эффекты. Программа на свичах написана, получается за одну итерацию цикла выполняется буквально строчек 20 кода (если отбросить приемную часть) и вывод на ленту.
Мне даже не хватает производительности, ардуина не успевает отрисовать то, что задумано.
данные не критично чтобы были пропущены. Они вообще не принимаются со стандартной библиотекой. а с самопалом алгоритм получится такой - после отправки на ленту данных, мне надо обратиться к тиньке и спросить у нее, что там у нас пришло. Тинька будет просто датчик расстояния опрашивать.
Здравствуйте. У меня та же проблема - светодиоды WS2812B и радиомодуль fs1000a (приемник).
Нужно менять анимацию на лету, как только получается управляющий сигнал.
Бился уже 3 ночи над этой проблемо, выявил конфликт библиотек и так же, как и вы застрял...
Вам удалось все же подружить их или это из области фантастики? Смогли победить ситуацию?
А какой именно конфликт для Вас критичен? Если по таймеру, так fs1000a относительно несложно на другой таймер переводится.
У меня приемник xy-mk-5v, который идет в комплекте с передатчиком fs1000a на 433Мгц.
Я работаю через Adafruit с матрице из светодиодов.
И в процессе выполнения анимации матрицей при подаче сигнала на приемник анимация должна меняться на другую.
Так вот суть конфликта заключается в том, что библиотека Adafruit при выполнении команды отображения изображения на матрице matrix.show() глушит приемник, т.е. его Ардуина в принципе не видит, идет ли с нее сигнал.
Как решить этот вопрос без привлечения стороннего микроконтроллера я так и не нашел ответа. Потому и спрашиваю здесь, т.к. судя по всему тут разбирается подобная проблема.
Здравствуйте. Тема не такая уж длинная, почитайте все сообщения. Проблем может быть две:
Либо работают на одном и том же таймере библиотеки приемника и адафрут, тогда Евгений вам подсказку дал - перевести нужно библиотеку на другой таймер.
Либо проблема в другом.. где то натыкался на инфу, что адафрутовская библиотека вообще запрещает какие либо прерывания во время своей отработки. Тогда тут решение вопроса по пути наименьшего сопротивления - использование двух ардуин. Либо читайте коменты выше.
Да, я прочитал изначально всю тему. И скачал переделанные файлы. Попробую их потестить. Я изначально сам пришел к двум вариантам решения, но оба они имеют свои минусы и требуют дополнительного железа:
1. (самый хреновый вариант) на передатчике делать условие при котором будет выполняться анимация. Т.е. приемник получает некую переменную, в результате которой разрешает делать анимацию. Если нет переменной, то анимцию делать низя. В этом варианте главный минус - медленная работа анимации, т.к. ее выполнение зависит от сигнала. Да и порой буджет мигание. В общем эта была первая идея. Она мне сразу не понравилась, но все же идея!
2. (тот, который здесь представлен, как альтернативный) использовать отдельный микроконтроллер (atTiny85) для работы с радиомодулем и при получении команды, командывать ардуиной через тот же Digital pin (режим работы кнопки).
И вот я все еще питаю надежду, что удасться подружить две библиотеки, чтобы не пришлось городить лишний огород из железяк.
З.Ы.: мне удалось сделать передатчик на atTiny85 с библиотекой VW. А вот приемник что-то работать отказывается... Ночь потратил - не победил.
Вроде ж выше уже выяснили, что таймеры не при делах. Там проблема в том, что библиотека ws прерывания запрещает. Т.е. одновременно они не живут. Либо надо использовать другую библиотеку, либосерь5зно переделывать эту.
Я использовал ранее FastLED, но она жрет непомерно оператики и к тому же весьма скудна в графической реализации. Так что Adafruit я пока что альтернативы не нашел к сожалению. Она тут лучшая.
Прийдется, видать, все же реализовывать обходной маневр со вторым МК.
Смотри на приемные пины, там может быть попутана распиновка ( китайцы косячно маску наложили ). Распиновка в таком порядке: земля, питание, сигнал ( иногда у них попутаны местами питание и сигнал, be carefull ))
у меня даже с фастлед библиотекой не запустился RF приемник))
да у меня с распиновкой все гуд.
я сначала тестил на ардуине. на ней скетч отточил - все работает.
потом в сктече меняю пин ресивера на соответствующий у atTiny.
и фигушки...
Самое неудобное, что у atTiny нет возможности просматривать сериал потр.
Я сегодня-завтра подрублю к нему отдеьлный LCD экран и гтогда попытаюсь глянуть. что вообще он ловит.
Тут еще важно понять к какому пину его подключать. Уже вроде все перепробовал.
Я тут по приемнику сделал отдельную тему в форуме:
http://arduino.ru/forum/programmirovanie/pomogite-podruzhit-attiny85-i-xy-mk-5v-priemnik-fs1000a
Гляньте, может какие идеи появятся.
Всем заранее спасибо