Тема: Управление ардуиной через ИК
Что то маловато тут самоделок выкладывают.
Прочитал я про http://robocraft.ru/blog/204.htmlУправление компьютером при помощи ИК приемника + 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 файл кнопку компиляции нажимать надо вместе с шифтом.
Копируем путь.
после компиляции копируем путь к файлу Вставляем в дудку и шьем.
Вставляем в дудку и шьем
Видеопример работы:
На видео вместо реле я управляю светодиодом, так как контакты реле не влезли в макетку.
http://www.youtube.com/watch?v=rmZPLCte … r_embedded
По сравнению с макетом много в задумке поменялось.
Поменялась немного схема:
соответственно и перечень элементов к ней. Некоторые элементы брал именно такие потому что были именно они, ничего другого не оказалось под рукой, а купить не позволило склизкое зеленое животное, сдавив горло перепончатой лапой:
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й.
Тем кто захочет повторить это, вот http://mogalkov.ath.cx/ircontrol/atmega168rele004.layплата в формате lay
Не очень компактно, не очень аккуратно, но я все равно это в стену замурую.
Ну а вот так это выглядит в готовом виде (сторону с дорожками я уже залил термоклеем, если не придумаю корпус, то залью и все остальное):
http://www.youtube.com/watch?v=nuGGmSE-j3M
Уменьшить размер можно: за счет блока питания (например безтрансформаторный бп с гасящим конденсатором), за счет МК (вместо ATmega168-20PU использовать ATmega168-20АU), за счет реле (вместо реле - симистор)