Проблема с управление по ИК
- Войдите на сайт для отправки комментариев
Хочу сделать ретранслятор ИК команд с пульта одного устройства на другое и при этом включать и выключать нагрузку с помощью реле. Использовал для этого такой код:
#include <IRremote.h> int RECV_PIN = 2; int RELAY_PIN = 5; unsigned long ON_OFF = 0xFDC23D; // Кнопка пульта Dune HD TV-102 включение //Аналогично можно прописывать остальные кнопки пульта IRrecv irrecv(RECV_PIN); decode_results results; IRsend irsend; void setup() { pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN,LOW); Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { if ( results.value != ON_OFF) { // Исключили из принятого ненужное, оставили только прописанные команды пульта delay(200);/*без этой строки неустойчивое управление, значение подбираем: чем больше значение - тем больше задержка, чем меньше значение - тем хуже управление, у меня от 100 до 200*/ Serial.print("Not declared command - "); irrecv.enableIRIn(); } if ( results.value==ON_OFF ) { delay(200); Serial.print("ON_OFF - "); irsend.sendSAMSUNG(0xE0E040BF, 32); // Передаем команду вкл/выкл digitalWrite(RELAY_PIN, !digitalRead(RELAY_PIN)); delay(100); irrecv.enableIRIn(); }; Serial.println(results.value, HEX); } delay(40); }
Команду с пульта принимает, реле включается и выключается. Но вот команда на другое устройство(телевизор Samsung) не реагирует. Посмотрел камерой смартфона на ИК диод. Он ничего не излучает. Уже даже диод купил новый пошел и подключил. Не помогает. Попробовал залил скетч пример IRsendDemo. Снова смотрю на светодиод камерой смартфона и не видно никакого излучения. Неужели два новых ИК диода и оба неисправные?
Диоды использовал такие:
http://robotdyn.ru/catalog/led/infrared_led_module/
и такой:
https://www.chipdip.ru/product/troyka-ir-transmitter-5mm-led
Подскажите пожалуйста что не так делаю? Почему диоды не работают и ничего не излучают?
При приёме: строка 36 не нужна. Зато нужна команда resume и вставить её надо в строку 38
Можно посмотреть на печатаемый протокол?
Дополнение: ладно, мне уходить надо. Если в протоколе печатается тот print, что перед отправкой, попробуйте перед отправкой всунуть resume на получение, чтобы завершить получение, а потом уж отправлять.
В протоколе печатается:
Больше вообще ничего не выводится.
Попробую сейчас внести корректировки и проверить.
Заодно в строке 33 вместо 0xE0E040BF напишите 0xE0E040BFul.
Закомментировал
irrecv.enableIRIn(); в 36 строке и добавил irrecv.resume(); в 38 строку.
Перестало реагировать на повторное нажатие кнопки питания на пульте. Первый раз реагирует, реле включается и больше не реагирует ни на что.
Также добавил
В строке 33 вместо 0xE0E040BF написал 0xE0E040BFul. Ровным счетом ничего не поменялось. Как не выдавался сигнал диодом так и не выдается.
Кстати, когда нажимаю кнопку на пульте, то на самой адруине взмаргивает свтодиод раза 3. И также взмаргивает при повторном нажатии кнопки на пульте.
Но больше всего меня напрягает, что даже при загрузке скетча из примеров у меня светодиод никак не проявляет себя и ничего не излучает. Может у меня ардуина какая-то неправильная? Бракованная?
Использую Leonardo, правда не оригинал, а китайский клон.
А еще не понятно мне зачем у светодиодов 3 выхода. Вроде как достаточно подключения к 3 пину и земли. А тут получается отдельно питание 5В, земля и данные. Может неправильно подключаю ИК свтодиод?
У-у-у, Вы что, питание ему не даёте? А чего от него хотите? Давайте схемуподключения и фото, где видно, что и как подключаете.
Как раз я подключаю все 3 провода к ардуине. Питание +5В подключаю в пину 5В, землю к земле и выход данных(обозначен на модуле Signal) подключаю к 3 пину ардуины. Я пробовал вообще все отключать от ардуины. После этого подключал только 3 провода от модуля светодиода и заливал в него демо скетч. Не излучает ни один из двух указанных в моем первом сообщении модулей. Камера телефона абсолютно ничего не фиксирует.
Такое впечатление, что с ардуиной что-то не то. Может пин 3 не включается в ШИМ режиме. Не понятно...
Может неправильно подключаю ИК свтодиод?
Три раза кофейную гущу вываливал на стол, но увы... Твоя схема не вылилась. Видимо, Клапочка запретил.
Схема простая. ИК светодиод
https://www.chipdip.ru/product/troyka-ir-transmitter-5mm-led
Подключаю вывод V к пину 5V на ардуине, вывод G к пину GND на ардуине, вывод S к пин 3 на ардуине.
Заливаю скетч irsend demo из примеров. Затем смотрю камерой смартфона на светодиод. Тишина, никакого излучения нет.
Если даже в тестовом скетче из примера светодиод не работает, то тут явно что-то не то. Пробовал другой модуль со светодиодом подключать. Тоже самое-излучения нет никакого.
Точно таким же образом подключаю светодиод в схеме с реле описанной в начале темы. Только к пину 2 подключен еще ИК приемник и к пину 5 подключено реле.
А в примере диод тоже к 3-му пину подключен?
А обычный светодиод не судьба подключить? Чтоб хоть вузуально видно было, что 3й пин работает
Да, в примере диод тоже подключен к 3 пину.
Обычный светодиод подключать не пробовал. Его еще купить надой пойти сначала. :-)
Я к 3 пину подключал управляющий выход реле и заливал скетч из примеров для щелкания реле. Реле отлично управляется 3 пином. Срабатывает без проблем. Т.е. получается 3 пин работает, раз реле с него управлялось. Не работает именно в режиме вывода команд на ИК светодид.
Нельзя никак перенести вывод команд на ИК светодиод на другой пин, например на 7?
мда.
Ага. Какие могут быть причины? Оба модуля неисправны?
Или "мда" подразумевает что-то другое. Думаете что то что реле управляется отлично на 3 пине не показатель того что он работает?
например на 7?
Вы свою библиотеку открывали? Смотрели? Нет, на седьмой нельзя.
Если Вы подумали, что про полную схему утсройства (со всеми другими деталями) и полный скетч, я пошутил, то напрасно. Пока этого не будет, Вам никто не поможет. К схеме обязательно фото, на котором всё видно, потому что уверенности в том. что схема правильно собрана нет.
И ещё, боюсь показаться навязчивым, но нужна именно Ваша схема, а не схема с какого-то сайта, т.к. там (у автора сайта) скорее всего всё работает.
Или "мда" подразумевает что-то другое. Думаете что то что реле управляется отлично на 3 пине не показатель того что он работает?
"Мда" подразумевает, что когда человеку МНОГО раз говорят "давай схему", а он упорно отписывается, что мол не надо - там всё просто, то данный человек либо идиот, либо тролль, которому не нужна никакая помощь - он пришёл просто подразнить всех.
Хорошо, схему сяду нарисую сейчас. Фото смогу дать только вечером, т.к. ардуина дома, а я уже на работе. Скетч в начале темы полный. Именно такой скетч у меня и загружен в ардуину.
я в полном скетче в упор не вижу, где на 3-й пин чо выводится. Туплю?
Я тоже искал где же вывод 3 пина. Перерыл все аналогичные скетчи которные выводят ИК команды. И ни в одной нет указания на то что надо выводить на пин 3.
Вот например скетч irsend demo из примеров:
В нем тоже нигде не прописан явный вывод пина 3. И тоже самое и в других найденных в инете скетчах в которых используется irsend
Тогда подскажите пожалуйста как правильно прописать вывод пина 3 если знаете. Я пока не смог найти его описания.
Может, он внутри библиотеки железно прописан, я ж библиотеку не смотрел, на вас оставил. Ну и так тогда сам бох велел и Клапочка не запретил, повесить ОБЫЧНЫЙ светодиод на пин3 и понять, моргает он хотя бы или нет. Тут сразу и ясно всё станет.
я в полном скетче в упор не вижу, где на 3-й пин чо выводится. Туплю?
Кусочек файла irSend.cpp
Но и это ещё не всё. На самом деле, там не обязательно пин 3. Всё зависит от констант, определённых в #define (например, это может бить пин 9, если определно использование первого таймера, а не второго).
Т.е. там явно задействуется второй (первый?) таймер. Если он задействован ещё где, то приплыли, но пока не будет схемы и полного скетча. я даже смотреть не буду - чего тратить время на тыкание пальцем в небо. Вы согласны?
Тогда подскажите пожалуйста как правильно прописать вывод пина 3 если знаете. Я пока не смог найти его описания.
Вам уже всё подсказали! Схема, фото сборки и полный скетч. Пока этого нет - мы теряем время.
Да, кстати, библиотеки бывают разных версий, а потому, давайте-ка заодно ссылки где Вы брали Ваши библиотеки, чтобы не получилось, что я смотрю у себя другую версию и ... ну, сами понимаете.
Полный код скетча:
Этот же код скетча в начале темы. Это полный код, в скетче больше нет ничего вообще.
Ссылка на библиотеку и схема соединений с фото
Наваял приблизительную схему того что у меня сделано в эмуляторе ардуины.
Фото сделаю вечером когда дома буду.
Откуда скачивал библиотеку уже и не помню. Вот сама скачанная библиотека:
https://yadi.sk/d/7r0wZ4vl3Mr5JL
Ее я и использую.
Подскажите пожалуйста как можно переопределить с помощью #define вывод ИК диода на пин 9? Для этого не нужно библиотеку, надеюсь, переписывать?
Попробовал на эмуляторе это проделать указав в скетче
Но это ничего не дало. Все равно на 3 пине идет передача на диод.
Какая ардуина у Вас?
Arduino Leonardo R3
Точнее ее китайский клон. Покупал в этом магазине эту модельку:
http://robotdyn.ru/catalog/boards/leonardo_r3_atmega32u4/
Опаньки! Так ни хрена себе!
Если у Вас контроллер ATmega32U4, то у Вас и не третий пин-то ни хрена! Скорее всего 10-ый! Теперь понимаете. почему я требовал схему и фото? Попробуйте библиотечный пример на 10-ом пине. Должен заработать.
А вообще, в той библиотеке, что Вы мне дали, открываете файл boarddefs.h. Таймер для 32U4 там определяется в строках 86-89. Выглядят они так:
Можете закомментировать строку 89 и раскомментировать 87 или 88 (но не обе сразу - из этих строк активна только одна должна быть).
При этом Вы выбираете не пин, а таймер. Поэтому смотрите, Вы должны выбрать такой таймер, который не используется другими библиотеками в Вашем проекте.
О как! А я и не знал, что в зависимости от модели разные пины могут быть. Мне как-то думалось, что все ардуины стандартны по пинам и должно везде работать одинаково.
А где-то описаны в каких-нибудь мануалах о различиях в зависимости от модели контроллера?
Домой вечером приду и проверю на 10 пине.
Спасибо вам огромное за помощь и за то что дали ценные подсказки!!!
Проверю и напишу, что получилось.
На каких пинах у кого ШИМ описано и в описаниях ардуин, и, само собой, в даташитах контроллеров.
Спасибо!
Посмотрел описание Arduino Leonardo. Там указано:
PWM: 3, 5, 6, 9, 10, 11, and 13. Provide 8-bit PWM output with
Получается и не 3 пине тоже есть ШИМ. А вот в библиотеке, получается, как раз и используется не 3-й пин для подключения диода, а 10-й.
Попробую на 10 пине поискать. Самое обидное, что не в примерах ни в статьях в интернете, ни на этом форуме откуда и взят используемый мной скетч, ничего не говорят про различные пины в зависимости от модели ардуины. А жаль...
Меня смущает даже не это, а то, что они в библиотеке говорят ещё и о 14-ом пине, а в описании его нет. Ну, в общем, разбирайтесь :)
А можно еще нубский вопросик один.
Код моего скетча вы видели. Он весь именно такой. Как я понимаю ШИМ больше кроме как для ИК светодиода нигде не используется. Получается больше никаких других таймеров у меня не используется? Или все-таки используются они скетчем?
Вы в начале советовали внести небольшие изменения в код для корректности работы. Вот такой вариант с вашими правками будет верным?
Или может нужно еще какие-то правки в код внести для более правильной работы?
Кстати, что у меня Leonardo используется я написал в 5-м сообщении темы. Согласен, не прав, что в начале не указал.
0-ой таймер используется всегда (в среде Ардуино), т.к. на нём живут такие сервисы, как millis, delay, и т.д.
По коду.
resume нужно использовать всегда. Это сигнал, что Вы закончили разбор сообщения и можно получать следующее. Вы же используете его только в ветке "
if
( results.value==ON_OFF )
", а в ветке "if
( results.value != ON_OFF)
" не используете. Оно бы у Вас не работало, но Вы всунули в эту ветку "irrecv.enableIRIn();", что конечно перебор.Правильно было бы строки 27, 36 и 37 удалить, а после строки 39 поставить "irrecv.resume();". Но я не знаю, будет ли работать "irsend.sendSAMSUNG" до того, как завершилось чтение. Если нет, то можно вставить resume и перед этой строкой.
Пока еще на работе и прогнал на эмуляторе изменения в коде по вашим рекомендациям. Работает только на половину. При первом нажатии кнопки на пульте срабатывает реле и идет передача ИК диодом команды. На повторное нажатие кнопки на пульте вообще никак не реагирует. Ни в мониторе порта больше ничего не выводится, ни нагрузка не отключается. Видимо надо что-то другое использовать.
При первом нажатии кнопки на пульте срабатывает реле и идет передача ИК диодом команды.
Ну, это уже прогресс
Видимо надо что-то другое использовать.
Да, нет, надо на логику повнимательнее посмотреть. Возможно, Вы правы и после того, как отработал сендер, надо заново инициализировать реивер, попробуйте вернуть строку 37. А не получится, займёмся этим плотнее.
Ну, это уже прогресс
Да, нет, надо на логику повнимательнее посмотреть. Возможно, Вы правы и после того, как отработал сендер, надо заново инициализировать реивер, попробуйте вернуть строку 37. А не получится, займёмся этим плотнее.
Прогресс, но виртуальный. Это прогон на симуляторе. На реальной железке буду тестировать дома позже.
Вернул строку 37. Заработало так как нужно. При нажатии кнопки пульта включается нагрузка и при повторном нажатии кнопки выключается.
Ну, даст Бог и на железке будет нормально. Если нет, то повоюем.
Ну, даст Бог и на железке будет нормально. Если нет, то повоюем.
Приду загружу новый скетч в ардуину, переключу светодиод и проверю что получилось.
Сейчас со всеми правками скетч получился такой:
Кстати, а зачем нужно было заменить 0xE0E040BF на 0xE0E040BFul ?
Кстати, а зачем нужно было заменить 0xE0E040BF на 0xE0E040BFul ?
Конкретно в данном случае не критично, компилятор и сам бы разобрался по типу параметра функции, но в общем случае это полезно. Число по умолчанию целое, а добавив в конец l или u или ul мо сообщаем компилятору, что оно соответсвенно длинное, беззнаковое или "длинное беззнаковое".
Понятно. Как сейчас код, корректный? Ничего больше править не нужно?
Не знаю. Запустите, увидите.
Самое обидное, что не в примерах ни в статьях в интернете, ни на этом форуме откуда и взят используемый мной скетч, ничего не говорят про различные пины в зависимости от модели ардуины. А жаль...
Мы на каком форуме? - arduino.ru
В каком разделе? - Аппаратные вопросы
Видите вверху прикрепленную тему?
PIN Mapping - соответствие выводов и регистров
http://arduino.ru/forum/obshchii/pin-mapping-sootvetstvie-vyvodov-i-registrov
Ну а первоисточник - само собой, дэйташит на соответствующий контроллер (а какой контроллер в каждой из Ардуин, написано на главной странице настоящего сайта).
Но сам факт различия вывешен на самое видное место!
PIN Mapping - соответствие выводов и регистров
http://arduino.ru/forum/obshchii/pin-mapping-sootvetstvie-vyvodov-i-registrov
Ну а первоисточник - само собой, дэйташит на соответствующий контроллер (а какой контроллер в каждой из Ардуин, написано на главной странице настоящего сайта).
Но сам факт различия вывешен на самое видное место!
Ну если честно, то из приведенной вами таблички никак не понятно, что в библиотеке IRremote для Leonardo оказывается не 3 пин используется для подключения ИК диода, а 10 пин.
Ну если честно, то из приведенной вами таблички никак не понятно, что в библиотеке IRremote для Leonardo оказывается не 3 пин используется для подключения ИК диода, а 10 пин.
А это и не может быть ниоткуда понятно, кроме как из документации по библиотеке. Она есть? Если нет, то это к авторам - типа "чо не написали?". Ну, а лучший способ - открывать текст бибилиотеки и смотреть, что я вчера и сделал.