1

Тема: Управление ардуиной через ИК

Что то маловато тут самоделок выкладывают.
Прочитал я про http://robocraft.ru/blog/204.htmlУправление компьютером при помощи ИК приемника + Arduino, интересно, но мне хотелось бы управлять не компом а лампочкой.
Сначала принципиальная схема:
http://mogalkov.ath.cx/ircontrol/E3.JPG
Перечень элементов:

  • 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 файл кнопку компиляции нажимать надо вместе с шифтом.
Копируем путь.
http://mogalkov.ath.cx/ircontrol/compile.jpg
после компиляции копируем путь к файлу Вставляем в дудку и шьем.
http://mogalkov.ath.cx/ircontrol/avrdudeGUI.jpg
Вставляем в дудку и шьем
Видеопример работы:
На видео вместо реле я управляю светодиодом, так как контакты реле не влезли в макетку.
http://www.youtube.com/watch?v=rmZPLCte … r_embedded
По сравнению с макетом много в задумке поменялось.
Поменялась немного схема:
http://mogalkov.ath.cx/ircontrol/E3_02sm.JPG
соответственно и перечень элементов к ней. Некоторые элементы брал именно такие потому что были именно они, ничего другого не оказалось под рукой, а купить не позволило склизкое зеленое животное, сдавив горло перепончатой лапой:

  • 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А, слишком громоздкий, да и для чего-нибудь другого сгодтся):
http://mogalkov.ath.cx/ircontrol/plata-004sm.JPG Перемычкой JP1 планировал возможность выбора питания, на случай если не найду реле на 5в. В скетче заменил 7й выход на 11й.
Тем кто захочет повторить это, вот  http://mogalkov.ath.cx/ircontrol/atmega168rele004.layплата в формате lay
Не очень компактно, не очень аккуратно, но я все равно это в стену замурую.

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

http://www.youtube.com/watch?v=nuGGmSE-j3M


Уменьшить размер можно: за счет блока питания (например безтрансформаторный бп с гасящим конденсатором), за счет МК (вместо ATmega168-20PU использовать ATmega168-20АU), за счет реле (вместо реле - симистор)

2

Re: Управление ардуиной через ИК

большое спасибо, что не поленились и выложили исчерпывающий материал

Re: Управление ардуиной через ИК

О! Как поговаривал один мой коллега по молодости - "респект и уважуха".
Не вдаваясь детально в конкретную схему (просто некогда) я бы хотел отметить правильность подхода - платформа Arduino в виде готовых платок удобна для прототипных разработок. А для конечного продукта логичным является именно сделать на том же чипе отдельное устройство с учетом особенностей конкретной схемы, что автор любезно и продемонстрировал.

4

Re: Управление ардуиной через ИК

ИМХО Дуина удобна для прототипирования, не более. Делать на дуине конечное устройство - глупо.  Покупал (фридуино 2009) только изза того что какой нибудь стандартный AVR-JTAG атмеловский стоит значительно дороже, а на ардуино иде с авр студио+вингсс перешел так как оно удобнее. До этого в основном с тини 13 работал.  Делать готовое устройство на дуине - ГЛУПОСТЬ и РАСТОЧИТЕЛЬСТВО. Да и по размерам не удобно, я лучше платку сооружу лутом, на тотже АТмега168-20АU, он меньше (AU значит корпус TQFP для smd монтажа). На той же нано который стоит, но там почему то 328я, отличяющаяся только памятью и ценой.