Управление компьютером при помощи ИК приемника + Arduino


Решил я сделать управление компьютером по средствам пульта ДУ.

Что нам понадобится:
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. Позже выложу полноценную программу для компьютера.


0 комментариев на «“Управление компьютером при помощи ИК приемника + Arduino”»

  1. Если применить библиотеку для ардуино поддерживающию NEC,SONY,RC5,RC6 то код на ардуине сильно упращается. А со стороны Window есть такая программа WinLIRC для управления компом с пульта. Кстати ИК приемники наиболее популярные и доступные это TSOP1736, TSOP1836 ну или смотреть TSOPxxXX — где хх это серия а ХХ частота, обвязка у них попроще резистор и конденсатор хотя народ бывает использует и без обвязки.

    • Тоже сначала хотел купить TSOP1736, в магазине его не нашлось. Взял попробовать HS0038 в таком же корпусе. Я сначала его без обвяза пробовал подключить, но или контакт был плавающим или ещё что-то, в итоге были ложные срабатывания.

    • TSOP1736 более популярный но и более старый, он сильно капризный и без обвязки не рекомендую.
      TSOP1836 намного удобнее, питание 2.7 — 5.5 т.е можно применять в 3х вольтовых системах без преобразования уровня, обвязка в виде RC фильтра по питанию заявлена как опцианальная и опыт показывает что это действительно так.

  2. по моему ардуина в качестве прослойки между сенсором и компом слишком жирно, в сети полно схем с подключением просто в ком порт и сотф к ней

    • отчасти вы правы, но это же просто начало 🙂 Например, можно использовать на ноутбуке у которого нет COM-портов 🙂
      К тому же, этот пример можно адаптировать чтобы передавать сигналы роботу или управлять эффекторами умного дома, на базе дуины 🙂

    • +1 Я часто использую IR пульт для управления своим роботом.

      А насчет жирности, можно взять готовую схему собрать и заработает.
      А человек взял идею, подобрал комплектующие, собрал, Понял как оно работает!!!
      Теперь ему не представляет проблемм сделать это и без ардуины.
      Короче автор молодец. Критиковать все могут, а ты сделай лучше 😉

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение