Прочитал я про Управление компьютером при помощи ИК приемника + 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 файл кнопку компиляции нажимать надо вместе с шифтом.
Копируем путь.

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

Видеопример работы: На видео вместо реле я управляю светодиодом, так как контакты реле не влезли в макетку.
https://www.youtube.com/watch?v=rmZPLCteSHA
Наконец то дошли руки доделать пульт к лампе. По сравнению с макетом много в задумке поменялось.
Поменялась немного схема:

соответственно и перечень элементов к ней. Некоторые элементы брал именно такие потому что были именно они, ничего другого не оказалось под рукой, а купить не позволило склизкое зеленое животное, сдавив горло перепончатой лапой:
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.
Не очень компактно, не очень аккуратно, но я все равно это в стену замурую.
Ну а вот так это выглядит в готовом виде (сторону с дорожками я уже залил термоклеем, если не придумаю корпус, то залью и все остальное):
https://www.youtube.com/watch?v=nuGGmSE-j3M

0 комментариев на «“Управление Arduino с помощью ИК пульта”»
отличная работа!
Нельзя ли выложить схему в более высоком разрешении и качестве? Выколи глаз =)
И что такое X1 16MHz, где он на схеме?
X1 — это кварцевый резонатор
Это -вот это
на схеме он слева от атмеги посередине
тамже 2 кондёра на 100п
большое спасибо автору пороекта!!! я на его основе сделал схемку управлял десятью сведодиодами соответственно кнопками от 0 до 9 на пульте, пульт от samsunga все отлично работает!!!