Прочитал я про Управление компьютером при помощи ИК приемника + 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 — это кварцевый резонатор
Это -вот этоrobocraft.ru/store/catalog/44
на схеме он слева от атмеги посередине
тамже 2 кондёра на 100п
большое спасибо автору пороекта!!! я на его основе сделал схемку управлял десятью сведодиодами соответственно кнопками от 0 до 9 на пульте, пульт от samsunga все отлично работает!!!