IR ПЕРЕДАТЧИК
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Народ, помогите разобраться с работой ir передатчика.
В примере библиотеки IRremote считываю показания пульта, код считывает вот такой:
{убрал метку старта, 8850, 4350, 600, 500, 600, 500, 600, 500 ,600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 500, 600, 550, 550, 550, 550, 550, 550, 1600, 550, 550, 550, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1600, 600, 1600, 550, 1600, 600, 1600, 550, 1650, 550, 1600, 600, 1600, 550, 1600, 600}
Передаю этот массив, вот весь код программы - передатчика:
#include <IRremote.h> int RECV_PIN = 11; int BUTTON = 10; int LED = 12; int STATBUTTON = 0; IRsend irsend; IRrecv irrecv(RECV_PIN); decode_results results; //Unknown encoding: F4BA2988 (32 bits) unsigned int TV[68] = {8850, 4350, 600, 500, 600, 500, 600, 500 ,600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 500, 600, 550, 550, 550, 550, 550, 550, 1600, 550, 550, 550, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1600, 600, 1600, 550, 1600, 600, 1600, 550, 1650, 550, 1600, 600, 1600, 550, 1600, 600}; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver pinMode(BUTTON, INPUT); pinMode(LED, OUTPUT); digitalWrite(LED, LOW); STATBUTTON=0; } void loop() { STATBUTTON= digitalRead(BUTTON); if (STATBUTTON==HIGH) { // поочередно закоментривано первую или вторую команду на передачу irsend.sendRaw(TV, 68, 32); // команда включения ТВ. //irsend.sendNEC(0x800FF, 32); // тоже самое NEC delay(200); } }
Передатчик подсоединяю на пин3.
Аппаратура на этот код не реагирует, соответственно вторая ардуино которая принимает этот код выдает совершенно другой код и массив [66], всегда 66. Т.е код передаю вышеуказанный, а принимает массив [66] , массив принимается другой, но содержимое массива всегда одинаково. NEC передает(смотрел фотоаппаратом), но приемник нечего не выдает.
IR приемник TL 1838 VS1838B infared receiver куплен на ebay.
IR передатчик ir led и транзистор s8050.
IR LED включен в цепь коллектора, информационный вход - база, через ограничивающий резистор и в цепи эммитера еще один резистор.
IR LED и транзистор выпаял из пульта, может дело в транзисторе. Нашел на него кучу даташитов - в одном он идет как pnp, а в другом npn транзистор.
Транзистор должен быть же npn? (когда на базе положительный импульс- транзистор открывается...)
Пожалуйсто подскажите схему на IR передатчик, может я чтото там не правильно делаю.
помоему я перемудрил с ir передатчиком и транзистором...надо просто IR LED через ограничивающий резистор подсоединять к пин 3? правильно?
Народ помогите.
Чет то я запутался...
установил ir led через ограничивающий диод.
передаю вот что:
unsigned int TV[68] = {8850, 4350, 600, 500, 600, 500, 600, 500 ,600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 500, 600, 550, 550, 550, 550, 550, 550, 1600, 550, 550, 550, 550, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1600, 600, 1600, 550, 1600, 600, 1600, 550, 1650, 550, 1600, 600, 1600, 550, 1600, 600};
и irsend.sendNEC(0x800FF, 32) (тоже самое).
принимаю вот что:
Unknown encoding: 15E7F51B (32 bits)
Raw (66): -6950 1000 -800 950 -800 950 -800 1000 -750 1000 -750 1000 -750 1000 -750 1000 -850 900 -750 1050 -800 950 -850 900 -850 900 -2500 950 -850 900 -850 900 -900 950 -750 1000 -800 950 -800 1000 -750 1000 -750 1000 -800 950 -800 1000 -850 900 -2500 1000 -2550 900 -2550 950 -2550 900 -2600 850 -2550 1000 -2550 900 -2550 950
15E7F51B
Unknown encoding: 15E7F51B (32 bits)
Raw (66): -8050 1100 -950 1050 -1000 1050 -950 1050 -950 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -950 1050 -1000 1000 -2900 1050 -950 1050 -1000 1000 -1000 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -1000 1050 -950 1050 -1000 1000 -1000 1050 -2850 1050 -2850 1050 -2850 1050 -2850 1050 -2850 1000 -2900 1050 -2850 1000 -2900 1000
Т.е принимает одинаковый код, но что то не то...
подскажите где ошибка может быть.
вот код:
Поможите.
Ну попробуйте под соединить диод между ногой и плюсом питания. И еще один момент. Приемник ваш рассчитан на прием сигнала про модулированного некой несущей частотой. Раз вы пользуетесь библиотечными функциями, то и при отправке он модулирует сия. Но вот частота может не совпадать. Тогда результат не предсказуем.
Если будет только передаваться, то надо в setup() сделать irsend.enableIROut(38); (в скобках частота модуляции в кГц - лучше чтобы совпадало но если нет - не особо критично, влияет в основном на дальность приёма). потом есть смысл попробовать частоты 36, 38, 40 кГц и посмотреть с какой приём надёжнее.
спасибо. завтра буду попробовать.
я так понял, моя ошибка в том, что я не объявил процедуру irsend.enableIROut() в setup, а объявлена в коде только irrecv.enableIRIn() (только обработка принятого кода)?
Здравствуйте.
Сделал все по вашей рекомендации, всё работает. Огромное спасибо за помощь.
Возник вопрос по вашим словам про прием и передачу.
Имеется пульт из набора к ардуино, и к примеру взял пульт от ТВ.
ИК приемником считал коды с пульта ардуино(CH-, CH+, VOL-, VOL+, PWR), соответственные коды с пульта ТВ
ну и изучаю данный вопрос....
Вот код:
Если отправляю irsend.sendNEC(0x8A857, 32) просто передатчиком, все работает, а если как в вышеизложенном коде, то не отправляется.
Как вы и рекомендовали - перед каждой отправкой делаю активацию передатчика irsend.enableIROut(36)
и после самой передачи активирую работу приемника irrecv.enableIRIn()
Приемник скорее всего работает, т.к все команды отображаются в Serial.print (ch-, ch+ и т.д..) а вот ретрансляции нет...
подскажите пожалуйсто где я ошибся.
В setup irrecv.enableIRIn()
делать не надо, а надо все делать в loop ?
спасибо.
enableIROut перед sendNEC бессмысленна, смотрим код библиотеки и видим:
enableIRIn нужно делать в setup, иначе в loop будет нечего делать.
Вам нужно удостовериться, что строки 23-26 вызываются. Добавьте туда (вместо строки 23) что нибудь типа:
Чтобы видеть, что этот код срабатывает. Да, только придется добавить в setup в конец строку pinMode( 13, OUTPUT );
25 строка Serial.print("CH-") отрабатывает, значит по идее строки 22-24 тоже проходят, я загонял не только эту одну команду, всего 5 штук( ch-+, vol-+, pwr) код однотипный, поэтому только экспереметирую с одной... везде Serial.print стоит после send, и везде принт отрабатывает....завтра посмотрю через фотоаппарат и запущу вторую ардуино(найду еще один приемник) посмотреть что она пинимает....
во #2 enableIROut сделал в setup и только тогда код начал вещать и работать, а когда был в сетапе только IRIn вещал всякую абракадабру... есть ли смысл делать в сетапе и IROut и IRIn, а потом каким то образом в loop переключать?
спасибо
Код:
Если объявлен irrecv.enableIRIn() в setup или loop передатчик не вещает. причем irsend.enableIROut() работает и в сетапе и в луппе.
как програмно отключать приемник на момент передачи?
так то в принципе жду когда придет модуль голосового управления и там не будет использоваться пульт...но все равно интерестно...всеж таки может подскажет кто нибудь как програмно отключить ir приемник на время передачи ir сигнала?
Если не выходит с этой либой, то можно использовать другую.
Ещё вариант - посмотреть исходники либы и разобраться.
Я бы посмотрел, но ик передатчик надо искать, не помню, вроде был. Но не обещаю, как получится.
VR модуль пришел, все в кучу собрал.... теперь и думаю- это тоже самое что из пушки по воробьям стрелять,... если что накопаете- буду крайне признателен...завтра тоже покапаю библиотеку....только знаний маловато для этого
Вот скетч, сделанный из IRecord из библиотеки IRemote:
Вот что на выходе:
Скетч отправляет очередной код из массива кодов, затем ждет секунду приема кода (я нажимал на пульте кнопку несколько раз), если код получен, то выводит его в Serial, либо пишет "No code"
Выключать прием нет никакого смысла, потому что он автоматически отключается при выдаче кода, поскольку прием и передача используют один и тот же таймер.
Вот фотоотчет. На левой беспаечной приемник, на нижней - передатчик (прозрачный светик от какого то пульта с транзистором оттуда же). Arduino Леонардо. Чуть приемник не сжег, успел выключить. Неправильно питание подключил :) Но он выжил и работает.
огромное спасибо. буду попробовать и разбираться
ваш скетч еще не пробовал, возник попутный вопрос- у вас строка 44 печатает один двух nec кодов,
в строке 46 sendNEC происходит, в строке 49 переходит в режим IRIn, далее принимает, декодирует
код и выводит в Serial.print принятый код с пульта.
А точно строка 46 выполняется и send происходит? я когда пытался на УНО принимать и при приеме
определенного нек кода вещать вещать нужный мне код - не получалось.
Т.е я также ставил print и перед и после команды sendNEC- принты все отрабатывали, а вот на
приемной ардуине была тишина(ардуино приемника точно работоспособно, т.к пульты она считывает).
Конечно может я что то не так делал, но такое ощущение, что при активном IRIn, реально передача кода
не происходит, хотя команда send отрабатывается.
Да, и у меня правильно вещает NEC только при включенном IROut, но если IRIn включен, передачи нет....
Вообщем завтра возьму вторую ардуину и посмотреть, что она примет при работе вашего кода...
код в посте 6, IR и Out делал в различный комбинациях..
если можно, разъесните что выполняет эта строка
вот эта
и что выполняет эта конструкция
это когда передался последний элемент массива, передача начинается вновь начинается с нулевого элемента, т.е выбор очередного элемента массива?
code_array_len - это длина массива, надо было в начале const добавить - это значение не меняется.
l_index - это статическая переменная, инициализируется один раз нулем, потом в конце loop увеличивается и при достижении длины массива обнуляется, Вы все правильно поняли.
Принимать код с ардуины я не пробовал, попробую, но времени мало, в общем день-два
Добрый день.
Делаю автоматизацию в конференцзале. По идее принимаем код с пульта и в зависимости от надатой кнопки выполняется определенный сценарий. управляющие комманды раздаются по RS-232 и ИК кодами.
Написал скетч, залил возникла проблема, при вызове функции с передачей ИК - перестает читать ИК коды.
В чем может быть дело?
Написал упрощенный скетч в котором только прием и вызов функции с передачей. Результат тот же.
Mega 2650
После отправки кода нужно всегда вызывать разрешение приема кода, он у тебя в строке 12. Для конкретного этого кода это можно сделать, напиример, скопировав строку 12 и вставив её перед строкой 31 (между 30 и 31), тогда после отправки 6 раз кода (после цикла) будет разрешен прием IR кода.
Спасибо. Заработало. Думал irrecv.resume() это решает.
Что странно скетч сегодня стал зависать на меге еще в void setup на выводе текста в serial. В коде в конце setup строка которая выводит в порт "Setup done". Выводится "Se" и зависон.
Причем даже не внес в него изменений.
Залил на uno там работает.
переатчик всегда устанавливается только на 3 пин?
реально ли сделать передающими инфракрасный сигнал светодиоды подключенные с 13 по 8 пин .и что делать если я хочу использовать несколько светодиодов в качестве передатчика ик сигнала ?
обьясните структуру скетча для работы ик передатчика , более подробно что нужно прописывать чтобы передавать ик сигнал. буду благодарен, не серчайте на меня , я новичок в этом деле