Страница 1 из 2
Нужна помощь с заданием несущей IR светодиода для ИК пульта
Добавлено: Вт окт 10, 2023 17:14:40
Vovik-78
Всем доброго дня.
Понадобился дублер сигналов с пульта кондиционеров.
Сигналы должен был считывать и воспроизводить без зависимости от протоколов.
Было решено считывать длительности сигналов и пауз между ними и сохранять длительности в массив в микросекундах.
Потом воспроизводить их последовательность обратно.
В протеусе вроде все сохраняется и воспроизводится по длительности норм, но вот что то не могу решить вроде простую задачку – с несущей частотой ИК диода.
Как ее правильнее реализовать, исходя из моего кода?
Код: Выделить всё
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
uint16_t signal[200]; // Массив хранения счетчика
uint8_t n_signal; // Переменная порядкового номера записи в массив
uint8_t sw; // Переменная последовательности действий Свитч1
ISR(INT0_vect){ // Обраьотчик внешнего прерывания (читаем импульсы)
switch (sw){
case 0:
TIMSK|=(1<<TOIE1); // Разрешаем прирывание по переполнению
TCCR1B|=(1<<CS10); // настройка таймер-счетчика без делителя, 1 такт=1мкс
TCNT1=0; // Обнуляем счетный регистр
sw=1; // Переход к следующему действию
PORTD&= ~(1<<PIND7);
break;
case 1:
signal [n_signal]=TCNT1; // Сохраняем значение счетчика в массив
TCNT1=0;
n_signal++; // Инкркментируем порядковый номер в массиве
break;
}
}
ISR(TIMER1_OVF_vect){ // Обработчик прерывания по переполнению (отклчаем все, если пауза длинная)
TCCR1B&= ~(1<<CS10); // Выключаем таймер-счетчик
TIMSK&= ~(1<<TOIE1); // Запрещаем прирывание по переполнению
GICR&= ~(1<<INT0); // Запрещаем работу внешнего прерывания
TCNT1=0; // Обнуляем счетный регистр
print_N_Signals(); //выводим количиство считаных имульсов
sw=0;
n_signal=0;
}
ISR(TIMER1_COMPB_vect){ // Обрпботчик прерывания по совпадению
n_signal++;
if (signal[n_signal]!=0)
{
PORTD^=(1<<PIND5); // Инвертируем состояние ИК светодиода
TCNT1=0; // Обнуляем счетный регистр
OCR1B= signal[n_signal]; // устанавливаем в регистр совпадения Новое сохраненное значение
}
else
{
TCCR1B&= ~(1<<CS10); // Выключаем таймер-счетчик
TIMSK&= ~(1<<OCIE1B); // Запрешаем прирывание по совпадению
OCR1B=0; // Обнуляем регистр сравнения
TCNT1=0; // Обнуляем счетный регистр
PORTD&= ~(1<<PIND5); // Отключаем ИК светодиод
print_N1_Signals(); // Выводим количиство Блинков имульсов
n_signal=0;
}
}
int main(void)
{
lcd_init();
DDRD &= ~(1<<2); // Порт пина 3 INT1 на вход
PORTD|=(1<<PIND2); // Пин порта 3 - Высокий потенциал
DDRD &= ~(1<<4); // Порт пина 4 (кнопка) на вход
PORTD|=(1<<PIND4); // Пин порта 4 - Высокий потенциал
DDRD &= ~(1<<1); // Порт пина 1 (кнопка) на вход
PORTD|=(1<<PIND1); // Пин порта 1 - Высокий потенциал
DDRD|=(1<<7); // Настройка порта Сигнального светодиода
PORTD&= ~(1<<PIND7); // Настройка пина Сигнального светодиода
DDRD|=(1<<5); // Настройка порта ИК светодиода
PORTD&= ~(1<<PIND5); // Настройка пина ИК светодиода
sei(); // разрешить глобально прерывания.
print_N_Signals(); //выводим количиство считаных имульсов
_delay_ms(5);
while (1)
{
if (~PIND&(1<<PIND4)){ // кнопка старта записи сигнала
_delay_ms(200);
n_signal=0;
print_N_Signals();
MCUCR|=(1<<ISC00); // Настраиваем прерывание по любому изменению уровня
GICR|=(1<<INT0); // Разрешаем работу внешнего прерывания
PORTD|=(1<<PIND7); // Зажигаем светодиод
}
if (~PIND&(1<<PIND1)){ // кнопка старта воспроизведения сигнала
_delay_ms(200);
n_signal=0;
if (signal[n_signal]!=0){
TCCR1B|=(1<<CS10); // Включаем таймер-счетчик без делителя
TIMSK|=(1<<OCIE1B); // Разрешаем прирывание по совпадению
PORTD|=(1<<PIND5); // Зажигаем IR светодиод
OCR1B|= signal[n_signal]; // устанавливаем в регистр совпадения первое сохраненное значение
}
}
}
}
В коде еще подключен знакосинтезирующий дисплей 2004, но он пока что только для контроля постоянства количества считанных сигналов. Выводит их количество. В окончательном варианте его вообще не будет.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Вт окт 10, 2023 18:01:42
u37
Возьмите аппаратный таймер, с выходом наружу, запустите его на частоту 36 кГц. Теперь, ваш излучающий светодиод нужно подключить к двум выводам процессора (через резистор, конечно) - один на выход таймера, где всегда будет генерироваться 36 кГц, и другим портом, где вы выдаете последовательность вспышек.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Вт окт 10, 2023 22:29:27
Vovik-78
[uquote="u37",url="/forum/viewtopic.php?p=4487463#p4487463"]Возьмите аппаратный таймер, с выходом наружу, запустите его на частоту 36 кГц. Теперь, ваш излучающий светодиод нужно подключить к двум выводам процессора (через резистор, конечно) - один на выход таймера, где всегда будет генерироваться 36 кГц, и другим портом, где вы выдаете последовательность вспышек.[/uquote]
Читал вроде про такое решение, на таймер с СТС, но вроде пишут, что нагрузка на ИК диод великовата для питания через порты напрямую.
может попробовать так как вы пишите но добавить по транзисторному ключу (на "+" и GND) один npn а другой pnp? Или частота и длительность сильно поплывут?
И еще, а будет иметь значение на каком из пинов будет высокий уровень? Или он на 36кГц должен быть?
Добавлено after 3 hours 45 minutes 40 seconds:
Смоделировал в протеусе с двумя транзисторными ключами - Вроде работает.
Попробую завтра в железе собрать. Нужно только простой диод по мощнее купить, для эксперимента.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 10:08:24
u37
Тоже вариант - поставьте MOSFET, например дешевые 2n7002.
Как понимаю, питание у вас "сетевое" и особой экономии потребления не требуется. Тогда можно сделать так:
- выходы 36к и on/off подать на затворы двух транзисторов, истоки на землю, а между стоками подключить светодиод
- сток транзистора 36к подключить к Vcc через резистор. Он будет задавать "ток" светодиода. Для питания 5В и тока 100 мА (и одного светодиода) это будет 5-1.7=3.3В; 3.3В 100 мА = 33 Ом.
На этом резисторе будет всегда рассеиваться мощность ~4В ~100 мА, т.е. 0.5 Вт резистор нужен.
Теперь, когда НЕ нужно излучать, оба транзистора стоит выключить, дабы не тратить энергию в нагрев платы. Т.е. таймер / его вывод переводить в генерацию только перед непосредственной передачей и выставлять в состояние 0 после передачи.
Можно использовать и биполярные транзисторы, но у них весьма чувствительный хвост выключения и на 36 кГц это уже чувствительно. Т.е. просто поставить резистор в базу - не получится, он слишком долго будет выключаться. Впрочем, тоже можно, вы же можете скорректировать время выключения изменением скважности. ... но с MOSFET гораздо предсказуемее и настривать не нужно.
Remark
Вообще, если ставить "транзисторы", то схему можно упростить до одного транзистора:
-выход on/off через резистор 1к подать на затвор 2n7002, его исток на землю, сток через резистор и светодиод на Vcc.
- выход 36к через диод обратной полярности подключить к затвору того-же транзистора. Диод поставить такой полярности, что-бы когда на выходе 36к будет 0, затвор закорачивался через диод и на затворе было-бы не более ~1В.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 10:11:54
BOB51
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 11:21:20
Vovik-78
Вот такой вариант прокатит?
Или к Q2 нужно резистор между VCC
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 11:50:51
Martian
нужен резистор. кз ведь практически, ток будет максимальным за вычетом падения напряжения на диоде и насыщения переходов, что-то точно сгорит
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 11:58:34
u37
1. поменяйте местами pnp и npn, npn на выход таймера. Дело в том, что npn быстрее, при тех-же параметрах. Транзисторы следует брать с 5-кратным запасом по току. Или, проще говоря: *8050 и *8550.
2. для транзистора с выхода таймера, параллельно его резистору (ваши 1к) поставьте конденсатор 2 нФ (1-10). Это уменьшит время выключения.
3. последовательно с светодиодом поставьте резистор. Ну, как-бы, не прилично. ))
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 12:43:10
Vovik-78
Такая схема, я правильно понял?
Справится со скоростью 76 кГц скоростью переключения (если я правильно понимаю, то именно такая частота нужна для получения несущей частоты через Toggle OC2 38 кГц)?
Добавлено after 10 minutes 17 seconds:
Единственное, мне не нужна большая дальность. Может взять светодиодик по слабее, 3мм (L-34F3C - есть в наличии в магазине) 20мА
Одним транзистором сможем тогда обойтись? Или может вообще без него/них?
На контроллера со светодиодом будет висеть 3 прибора. RFM69HW, Ик диод и либо термодатчик либо терморезистор.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 12:46:40
u37
Думаю, да. Только там ни фига не видно. ))
Если вы о частоте ИК вспышек, то цифра 38 кГц весьма условна. Если приемник расчитан на 40к, а вы будете передавать на 34к, то он сигнал примет. Просто у него будет сниженная чувствительность на такой сигнал. Конкретных цифр не помню, грубо - раза в 2 по сигналу. Так что, выдерживать частоту строго 38.000 кГц вовсе не обязательно.
Теперь, как это настраивать без осциллографа. Возьмите ИК приемник, запитайте его от другого источника (лучше, от батареек) и повеьте на его выход светодиод (с резистором). Он будет зажигаться при приеме несущей. Подбирая частоту смотрите дальность.
Подчеркну, если не заметили - приемник надо питать от отдельного источника и никак не соединять с (питанием) передатчика. "Приемник" - это сложная микросхема с крайне высокой чувствительностью. Она легко насасывает помехи и дает ложные срабатывания.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 13:08:07
Vovik-78
[uquote="u37",url="/forum/viewtopic.php?p=4487729#p4487729"]Подчеркну, если не заметили - приемник надо питать от отдельного источника и никак не соединять с (питанием) передатчика. "Приемник" - это сложная микросхема с крайне высокой чувствительностью. Она легко насасывает помехи и дает ложные срабатывания.[/uquote]
Приемник и передатчики будут разными устройствами.
вообще задумка такая:
Мне нужно устройство типа блока ротации кондиционеров. оно состоит из одного главного/управляющего устройства и нескольких ведомых (типа БУУР / БИС), связываются по радиоканалу. Но функционал нужен чуть другой.
Если БУУР / БИС рассчитан на поддержание температуры в серверной и ротации кондиционеров, то мне нужно устройство, которое будет включать некоторое количество мощных кондиционеров последовательно с небольшой задержкой для исключения перегрузок по сети.
Пусковые токи у сплитов большие, и при одновременном их включении все вырубает.
Вот я и хочу их включать последовательно с задержкой 5-15 секунд с контролем запуска компрессора.
ИК диод, в таких системах, обычно возле приемника крепится почти вплотную, Иногда через полупрозрачный корпус пластика.
С пульта, по очереди, их включать не получается, расположены высоко и близко друг к другу. По этому при нажатие на кнопку пульта - реагирут почти все сразу.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 13:23:30
u37
Если расстояние будет в пару см., то ставить транзсторы нет нужды. Т.к. вам нет необходимости включать все 3 светодиода сразу, то "генератор" (таймер) можно сделать общим, а резистор+LED повесить на 3 порта и работать каждый раз с одним из них.
Дабы не перегружать выход, поставьте резистор(ы) 330-680 Ом.
В программе придется учесть и одинаковые команды (выключения, например) выдавать индивидуально на каждый LED, а не скопом. Вообще, это даже хорошо, меньше ударов по сети. Вроде, за этим всё и затевалось.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 13:41:49
Vovik-78
А откуда / или зачем 3 светодиода?
У меня предусмотрен был один. как указано на скрине с Протеуса.
один передатчик на одном контроллере на один кондиционер.
Главное устройство работает по очереди с одним из нескольких ведомых.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 13:56:43
u37
Зачем вам три коробки? Это носенс, делайте одну (с 3 LED). Всё равно у вас источник команд (пульт) в одном экземпляре.
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 14:58:32
roman.com
а я сделал как писали выше...
u37 писал(а):Возьмите аппаратный таймер, с выходом наружу, запустите его на частоту 36 кГц. Теперь, ваш излучающий светодиод нужно подключить к двум выводам процессора (через резистор, конечно) - один на выход таймера, где всегда будет генерироваться 36 кГц, и другим портом, где вы выдаете последовательность вспышек.
правда дальность маленькая... максимум пару метров)) но для управления теликом по интернету мне хватает))
МК любой...
у меня мега328 читает и воспроизводит сигналы всех пультов в доме))
и т.д.
Добавлено after 47 minutes 37 seconds:
Re: Нужна помощь с заданием несущей IR светодиода для ИК пульта
а потом я выкинул все таймеры... и подключил ИК светодиод на свободный пин МК...
и фотоприёмник TSOP подключил на свободный пин МК... и завёл в прерывание по изменению уровня...
при передаче тупо дергаю пин МК с частотой 36 кгц... с помощью простого delay ))
Код: Выделить всё
//////////////////////////////////////////////////////////////////////////TX_TV:
unsigned char TX_TV_st; // счёт байт
unsigned char TX_TV_Mask; // маска
///////////////////////////////////////////////
void TX_TV(void)
{
/////////////////////////////////////////////// TX: NEC
// Преамбула 9000 us / 27 us = 324
//for (y=0; y<324; y++) {
// PORTC.0=1;
// delay_us(13);
// PORTC.0=0;
// delay_us(9);
//};
/////////////////////////////////////////////// TX: TV SAMSUNG
//TV SAMSUNG
//22h - длительность преамбулы. -4,5 mc
//22h - длительность преамбулы. -4,5 mc
//07h - адрес устройства (SAMSUNG).
//07h - адрес устройства (SAMSUNG).
//68h - адрес команды (номер кнопки).
//97h - инверсия адрес команды (номер кнопки).
TX_int[0] = 0x07;
TX_int[1] = 0x07;
//TX_int[2] = 0x68;
TX_int[3] =~ TX_int[2];
/////////////////////////////////////////////// TX: TV SAMSUNG
// Преамбула 4500 us / 27 us = 162
for (y=0; y<162; y++) {
PORTC.0=1;
delay_us(13);
PORTC.0=0;
delay_us(9);
};
/////////////////////////////////////////////// TX: TV SAMSUNG
// Преамбула 4500 us
delay_us(4500);
/////////////////////////////////////////////// TX: байт SAMSUNG
//for (TX_Modem_st=0; TX_Modem_st<48; TX_Modem_st++) { // 48
for (TX_TV_st=0; TX_TV_st<4; TX_TV_st++) { // 4
/////////////////////////////////////////////// TX: Data: TV SAMSUNG
TX_TV_Mask=0b00000001;
do {
///////////////////////////////////////////// TX: Data: TV SAMSUNG
// Маркер 560 us / 27 us = 23
for (xTX=0; xTX<23; xTX++) {
PORTC.0=1;
delay_us(13);
PORTC.0=0;
delay_us(9);
};
///////////////////////////////////////////// TX: 1 <> 0 SAMSUNG
delay_us(560);
if (TX_int[TX_TV_st] & TX_TV_Mask) {delay_us(1125);};
TX_TV_Mask=(TX_TV_Mask<<1);
}
while (TX_TV_Mask);
/////////////////////////////////////////////// TX: байт END TV SAMSUNG
};
/////////////////////////////////////////////// TX: стоп TV SAMSUNG
// Маркер 560 us / 27 us = 23
for (xTX=0; xTX<23; xTX++) {
PORTC.0=1;
delay_us(13);
PORTC.0=0;
delay_us(9);
};
/////////////////////////////////////////////// TX:
//PORTC.0=0; // сброс TX
}
да, импульсы не такие идеальные как с таймером... и кварцевым генератором))
но как показывает практика... и так всё нормально работает... от обычного встроенного RC-генератора))
и всё это работает по интернету... по витухе... с PoE...
этот ИК путь ещё и температуру передаёт... по тому же интернету))
я надеюсь в серверной есть интернет ? ))

Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 16:41:33
Vovik-78
[uquote="roman.com",url="/forum/viewtopic.php?p=4487761#p4487761"]при передаче тупо дергаю пин МК с частотой 36 кгц... с помощью простого delay ))

[/uquote]
Ну так у вас, как я понимаю, тут уже все сигналы дешифрованы.
Зачем тогда приемник?
Мне же нужно что бы зашить можно было 2 команды с любого пульта управления и потом их воспроизвести. По этому схема с приемником через внешнее прерывание и сохранение длительностей однозначно должны остаться.
И тогда к Вам, как уже изрядно поюзавшему эту тему такой вопрос:
Столкнулся с проблемой такой.
Макетка сигналы всех пультов читает нормально, кроме сигнала с пульта кондиционера. При этом еще и зависает после приема, не хочет принимать новый сигнал.
Хотя когда я подобрал на телефоне с ИК программу с пультом от того же кондиционера, то сигналы с телефонного ИК он читает нормально и не виснет. Пульт проверил, кондером управляет. С телефона тоже управляется, но родной пульт моя программка не читает правильно. Может посмотрите код вверху, может я где то накосячил?
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 18:51:27
roman.com
Vovik-78 писал(а):Ну так у вас, как я понимаю, тут уже все сигналы дешифрованы.
Зачем тогда приемник?
приемник нужен для считывания кнопок пультов... т.к. изначально я не знаю номера кнопок пультов))
берём TSOP... подключаем к нашему интернет пульту... считываем номера кнопок... выводим данные на комп...
...
и т.д.
потом приводим данные к нормальному виду... согласно стандарту...
...
и т.д.
потом забиваем полученные данные в программу МК... или в программу компа... или в программу телефона...
и затем управляем чем хотим))
Добавлено after 4 minutes 7 seconds:
Re: Нужна помощь с заданием несущей IR светодиода для ИК пульта
получился аналог заводского анализатора пультов...
данные можно записать на комп... в журнал...
к слову...
вместо анализатора и осциллографа можно использовать звуковую карту компа... с записью на комп и последующего анализа...
...
и т.д.
Добавлено after 10 minutes 59 seconds:
Re: Нужна помощь с заданием несущей IR светодиода для ИК пульта
программа приёмника (анализатора) работает просто))
подключаем TSOP к любому выводу МК... настраиваем прерывание по изменению уровня... считаем время в микросекундах между прерываниями...
подробнее...
я использую два таймера:
- таймер 0 - 8 бит - для определения окончания пакета.
- таймер 1 - 16 бит - для подсчёта времени между прерываниями.
1.
прилетает пакет... срабатывает прерывание... МК просыпается... выходит из режима SLEEP... запускается таймер 0 и таймер 1...
2.
при каждом изменении уровня срабатывает прерывание по уровню... сбрасывается таймер 0... записывается значение таймера 1 в массив... сбрасывается таймер 1... ждём следующего прерывания...
3.
по окончанию пакета переполняется таймер 0... срабатывает прерывание таймера 0... программа сбрасывается...
4.
устанавливается флаг окончания пакета... данные передаётся на комп... МК засыпает... МК переходит в режим SLEEP...
всё просто))
можно сделать чтоб МК читал сигнал ИК пульта...
потом записывал данные в EEPROM... (перед этим приводил данные к стандартному значению - это опция)
потом МК воспроизводил данные по нажатию кнопки...))
но у меня такой задачи не стояло))

у меня была задача - управление всем с телефона... по интернету и Wi-Fi.
Добавлено after 6 minutes 23 seconds:
Re: Нужна помощь с заданием несущей IR светодиода для ИК пульта
эту задачу я решил))

Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Ср окт 11, 2023 20:05:03
Vovik-78
В общем дела такие.
Дублирование пульта телека работает в железе.
А вот от родного пульта кондера не получается. Что то считывает, но Дублирование не срабатывает.
Записываю сигнал эмулятора пульта с телефона - все дублируется с контроллера. Не могу пока понять в чем проблема.
Может есть у кого то идеи?
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Чт окт 12, 2023 08:23:09
codenamehawk
Разные хитрые кодировки сигнала, нп. следующая посылка некоторые биты инвертированные.
https://winlirc.sourceforge.net/
Делал когда-то пульт
Делал и захват
https://sites.google.com/site/mariankmh/home/ir-to-com
(гоггле файлы срятал)
Re: Нужна помощь с заданием несущей IR светодиода для ИК пул
Добавлено: Чт окт 12, 2023 10:17:19
Vovik-78
Спасибо. Гляну.
Но ведь я считываю и сигналы и паузы по продолжительности. И потом не деколирую а выдаю копии.
По идее не должно это влиять.