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

Прочитал я про Управление компьютером при помощи ИК приемника + Arduino, интересно, но мне хотелось бы управлять не компом а лампочкой.
Сначала принципиальная схема:

Перечень элементов:
V+ = 5в
C1 = 100n
C2 = 100n
C5 = 100n
C6 = 470µ
HL1 = светодиод, цвет по вкусу
HL3 = светодиод, цвет по вкусу
IC1 = ATMEGA168-20PU
IR1 = TSOP31236
K1 = реле 834-1A-B-C 5V — 10A 277V AC
R1 = 1k
R4 = 100
R5 = 120
R6 = 120
R8 = 100
VD2 = диод, подойдет любой.
VT1 = KT315б
X1 = 16MHz

Пульт использовал старого тв тюнера пинакл.
Коды пульта в тупую копировал из терминала putty.
Сначала использовал время чтения сигнала 130, потом сократил до 64мс, по идее для этого пульта мог и до 32.
Основу скетча взял из указанной выше статьи.

  int mStr;// время старта
  int mStop; // значения времени в момент считывания
  int Str; // значения времени в момент считывания
  int Stop; // значения времени в момент считывания
  int i; // буфер
  int j; //счетчик символов
  boolean oneStep = false; // начало приёма кода
  boolean lastStep = false; //окончание кода

//
//
//кнопка 1
//код кнопки (то что передает пульт)
boolean sostA[130]={0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
//состояние действия кнопки (нужно только если одна кнопка имеет несколько действий, пример:включить - выключить)
int statA=0;
//статус сравнения при нажатии
int sostRA=0;
//кнопка 2        //0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,1,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
boolean sostB[130]={0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,0,1,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int statB=0;
int sostRB=0;
//кнопка вверх 000011111101110000111111001111111111111111111111111111111111111
boolean sostUP[130]={0,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int statUP=0;
int sostRUP=0;
//кнопка низ 000011111100110011101111001111111111111111111111111111111111111
boolean sostDN[130]={0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int statDN=0;
int sostRDN=0;
//кнопка центр       0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
boolean sostMD[130]={0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int statMD=0;
int sostRMD=0;


//Сравнение кнопок, определение какая нажата
void keyread(){
  //кнопка 1
     if (i != sostA[j]){sostRA=sostRA+1;}
  //кнопка 2
     if (i != sostB[j]){sostRB=sostRB+1;}
  //кнопка низ
     if (i != sostDN[j]){sostRDN=sostRDN+1;}
  //кнопка вверх
     if (i != sostUP[j]){sostRUP=sostRUP+1;}
  //кнопка центр
     if (i != sostMD[j]){sostRMD=sostRMD+1;}

}

//Выбор действия кнопки
void keyobrabotka()
{
  //кнопка 1
      if (sostRA==0){Serial.println("KEY A");if (statA==0){digitalWrite(7,HIGH);statA=1;}else if (statA==1){digitalWrite(7,LOW);statA=0;}}
  //кнопка 2
      if (sostRB==0){Serial.println("KEY B");if (statB==0){digitalWrite(10,HIGH);statB=1;}else if (statB==1){digitalWrite(10,LOW);statB=0;}}
  //кнопка низ
      if (sostRDN==0){Serial.println("KEY DOWN");}
  //кнопка вверх
      if (sostRUP==0){Serial.println("KEY UP");}
  //кнопка центр
      if (sostRMD==0){Serial.println("KEY MID");}

//сбрасываем состояния кнопок
sostRA=0;
sostRB=0;
sostRDN=0;
sostRUP=0;
sostRMD=0;
}


void setup()
{
  Serial.begin(9600);
  digitalWrite(13,HIGH);
  pinMode(7, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9,INPUT);
}

void loop() {

 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.print(i,DEC);
    mStop = micros();
    //сравнение кнопок
    keyread();
    j = j + 1;
//определение конца передачи
    Stop = millis();
    if ((Stop - Str) >= 64) //Время чтения сигнала с пульта. Этот параметр для разных пультов может быть разным.
    {
      //Выбор действия кнопки
      keyobrabotka();
      Serial.println("END");//предаем 3 чтобы на компьютере отследить конец кода
      Serial.println(j,DEC);//передаем количество символов
      oneStep = false;
      j=0;
      break;
    }
  }
  }
}



Так как пускать на такое устройство дуину слишком жирно, использовал микроконтроллер (такой как и на дуине ATmega168-20PU) отдельно, чтобы не вытаскивать-вставлять туда суда МС, прошивал через ISP, на дуине около микросхемы FT232RL 4е вывода (у некоторых не распаяны) — это ISP программатор. Для прошивки ATMEGA168-20PU цепляем: 4й вывод к 1й ножке, 3й вывод к 17й ноге, 2й вывод к 19, 1й к 18й. Для прошивки использовал avrdude + avrdudeGUI. Чтобы узнать куда кладется hex файл кнопку компиляции нажимать надо вместе с шифтом.
Копируем путь.

Вставляем в дудку и шьем.


Видеопример работы: На видео вместо реле я управляю светодиодом, так как контакты реле не влезли в макетку.



Наконец то дошли руки доделать пульт к лампе. По сравнению с макетом много в задумке поменялось.
Поменялась немного схема:

соответственно и перечень элементов к ней. Некоторые элементы брал именно такие потому что были именно они, ничего другого не оказалось под рукой, а купить не позволило склизкое зеленое животное, сдавив горло перепончатой лапой:
C1 470µ 25v
C2 470µ 25v
C3 100n
C4 100n
C5 100n
HL1 зеленый
IC1 ATMEGA168-20PU
IR1 TSOP31236
K1 834-1A-B-C 5V 10A 277V AC
R1 120
R2 1k
R3 100
R4 120
VD1 1N5408
VD2 1N5408
VR1 7805
VT1 KT315б
X1 16MHz

Вот так выглядит печатная плата, правда вместо трансформатора и диодного моста я приклеил маленький импульсный блок питания на 6В 450мА от какогото старого, давно разобранного мобильника (трансформатор что хотел поставить сначала, 12В 1А, слишком громоздкий, да и для чего нибудь другого сгодится):

Перемычкой JP1 планировал возможность выбора питания, на случай если не найду реле на 5в. В скетче заменил 7й выход на 11й.
Тем кто захочет повторить это, вот плата в формате lay.
Не очень компактно, не очень аккуратно, но я все равно это в стену замурую.

Ну а вот так это выглядит в готовом виде (сторону с дорожками я уже залил термоклеем, если не придумаю корпус, то залью и все остальное):

  • +1
  • 13 января 2011, 22:58
  • mogalkov

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

RSS свернуть / развернуть
+
0
отличная работа!
avatar

noonv

  • 13 января 2011, 23:31
+
0
Нельзя ли выложить схему в более высоком разрешении и качестве? Выколи глаз =)
avatar

oleamm

  • 16 апреля 2011, 13:32
+
0
И что такое X1 16MHz, где он на схеме?
avatar

oleamm

  • 16 апреля 2011, 13:35
+
0
X1 — это кварцевый резонатор
avatar

admin

  • 16 апреля 2011, 16:41
+
0
Это -вот это robocraft.ru/store/catalog/44
на схеме он слева от атмеги посередине
тамже 2 кондёра на 100п
avatar

abbivan

  • 16 апреля 2011, 17:17
+
0
большое спасибо автору пороекта!!! я на его основе сделал схемку управлял десятью сведодиодами соответственно кнопками от 0 до 9 на пульте, пульт от samsunga все отлично работает!!!
avatar

nanit

  • 8 декабря 2011, 15:21

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