Решил я сделать управление компьютером по средствам пульта ДУ.
Что нам понадобится:
1. Пульт ДУ с протоколом NEC (я использовал Samsung 00054C)
2. TSOP ИК приёмник (HS0038)
3. 2 керамических конденсатора 0,1 МкФ
4. 2 электролитических конденсатора 10-1 МкФ
5. Резистор 100 Ом.
TSOP может быть любым с частотой от 36-40 кГц. Я использовал TSOP с несущей частотой 38 кГц, главная его особенность в инверсном выходе, при отсутствии сигнала на пин приходит 1, соответственно при появлении сигнала он посылает 0.
Подключаем по этой схеме ИК приёмник. Конечно можно просто его подключить к любому пину и подать питание, но тогда возможны ложные срабатывания. Электролитические конденсаторы можно поставить на 1 МкФ. INFR я подключил к 9 пину.
А дальше стоит почитать про протоколы работы пультов ДУ. К примеру отсюда.
Если читать лень, то суть протокола NEC (по которому работает мой пульт) сводится к тому что пульт передает 9 мс сигнал, это сигнал о начале передачи кода, его мы и будем пытаться отследить. После сигнала о начале передачи следует сам код длительностью 101 мс, который нам следует передавать по ком порту.
Листинг программы передачи кода через COM порт:
void setup()
{
Serial.begin(9600);
digitalWrite(13,HIGH);
}
void loop() {
int mStr;// время старта
int mStop; // значения времени в момент считывания
int Str; // значения времени в момент считывания
int Stop; // значения времени в момент считывания
int i; // буфер
int j;
boolean oneStep = false; // начало приёма кода
boolean lastStep = false; //окончание кода
pinMode(9,INPUT);
mStr = micros();
Str = millis();
j = 0;
if ((digitalRead(9) == 0)) {
for(;;)
{
i = digitalRead(9);// считывание кода
if(i == 0)
{
digitalWrite(13,LOW);
} else {
digitalWrite(13,HIGH);
}
Serial.println(i,DEC);
mStop = micros();
j = j + i;
//определение начала передачи
if (((mStop-mStr) >= 9000) && (j==0) && (oneStep == false))
{
Serial.println(2,DEC);//предаем 2 чтобы на компьютере отследить начало кода
oneStep = true;
j=0;
mStr = micros();
}
//определение конца передачи
Stop = millis();
if ((Stop - Str) >= 110)
{
Serial.println(3,DEC); //предаем 3 чтобы на компьютере отследить конец кода
oneStep = false;
break;
}
}
}
}
Передав код через порт на требуется его принять. Реализацию этого я приведу на примере класса для C#.
class ComPort
{
private SerialPort port = new SerialPort("COM1", 9600);
public char[] buffer;
public string str = ""; // сюда пишется код принятый с COM порта
private bool startFlag = false;
public bool closeFlag = true;
public ComPort()
{
port.Open();
}
public void ReadPort()
{
for (; ; )
{
buffer = port.ReadLine().ToCharArray();
if (buffer[0] == '2')
{
startFlag = true;
str = "";
}
if (startFlag == true)
{
str += buffer[0];
}
if (buffer[0] == '3')
{
startFlag = false;
}
if (closeFlag == false)
{
break;
}
}
}
public void Close()
{
port.Close();
}
}
Использовать этот клас нужно в отдельном потоке, потому что мы используем бесконечный цикл.
ComPort port = new ComPort();
ThreadStart threadDelegate;
Thread newThread;
threadDelegate = new ThreadStart(port.ReadPort);
newThread = new Thread(threadDelegate);
newThread.Start();
Я не большой мастер писать статьи, так что буду рад любым замечаниям.
UPD. Позже выложу полноценную программу для компьютера.
Если применить библиотеку для ардуино поддерживающию NEC,SONY,RC5,RC6 то код на ардуине сильно упращается. А со стороны Window есть такая программа WinLIRC для управления компом с пульта. Кстати ИК приемники наиболее популярные и доступные это TSOP1736, TSOP1836 ну или смотреть TSOPxxXX — где хх это серия а ХХ частота, обвязка у них попроще резистор и конденсатор хотя народ бывает использует и без обвязки.
Тоже сначала хотел купить TSOP1736, в магазине его не нашлось. Взял попробовать HS0038 в таком же корпусе. Я сначала его без обвяза пробовал подключить, но или контакт был плавающим или ещё что-то, в итоге были ложные срабатывания.
TSOP1736 более популярный но и более старый, он сильно капризный и без обвязки не рекомендую. TSOP1836 намного удобнее, питание 2.7 — 5.5 т.е можно применять в 3х вольтовых системах без преобразования уровня, обвязка в виде RC фильтра по питанию заявлена как опцианальная и опыт показывает что это действительно так.
отчасти вы правы, но это же просто начало :) Например, можно использовать на ноутбуке у которого нет COM-портов :)
К тому же, этот пример можно адаптировать чтобы передавать сигналы роботу или управлять эффекторами умного дома, на базе дуины :)
+1 Я часто использую IR пульт для управления своим роботом.
А насчет жирности, можно взять готовую схему собрать и заработает.
А человек взял идею, подобрал комплектующие, собрал, Понял как оно работает!!!
Теперь ему не представляет проблемм сделать это и без ардуины.
Короче автор молодец. Критиковать все могут, а ты сделай лучше ;)
Комментарии (7)
RSS свернуть / развернуть— это вы зря! Статья очень даже получилась :)
noonv
skystorm
Cerberus
TSOP1836 намного удобнее, питание 2.7 — 5.5 т.е можно применять в 3х вольтовых системах без преобразования уровня, обвязка в виде RC фильтра по питанию заявлена как опцианальная и опыт показывает что это действительно так.
skystorm
Trashman
К тому же, этот пример можно адаптировать чтобы передавать сигналы роботу или управлять эффекторами умного дома, на базе дуины :)
noonv
А насчет жирности, можно взять готовую схему собрать и заработает.
А человек взял идею, подобрал комплектующие, собрал, Понял как оно работает!!!
Теперь ему не представляет проблемм сделать это и без ардуины.
Короче автор молодец. Критиковать все могут, а ты сделай лучше ;)
skystorm
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.