CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Управление компьютером при помощи ИК приемника + 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. Позже выложу полноценную программу для компьютера.
  • +2
  • 1 апреля 2010, 16:41
  • Cerberus

Комментарии (7)

RSS свернуть / развернуть
+
0
Спасибо большое!
Я не боьлшой мастер писать статьи
— это вы зря! Статья очень даже получилась :)
avatar

noonv

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

skystorm

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

Cerberus

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

skystorm

  • 5 апреля 2010, 10:17
+
0
по моему ардуина в качестве прослойки между сенсором и компом слишком жирно, в сети полно схем с подключением просто в ком порт и сотф к ней
avatar

Trashman

  • 3 апреля 2010, 21:24
+
0
отчасти вы правы, но это же просто начало :) Например, можно использовать на ноутбуке у которого нет COM-портов :)
К тому же, этот пример можно адаптировать чтобы передавать сигналы роботу или управлять эффекторами умного дома, на базе дуины :)
avatar

noonv

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

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

skystorm

  • 5 апреля 2010, 10:22

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.