выполнить команды с Ик пульта

leshak
Offline
Зарегистрирован: 29.09.2011

step962 пишет:

 Каких только теорий не напридумывали. 

Это был я :)

Сдугой стороны, а как под другому удаленно "искать причину проблемы"? Только выдвигать теории и способы их проверки.

Elektro
Offline
Зарегистрирован: 10.02.2012

 ек макарек !!//// сейчас все мое сообщение удалилось по моей неосторожности.. ладно заново напечатаю: 

нет на нашь с вами скечт я не плюнул просто, искал что люди делают вот и наткнулся.

и так -сменил обвязку тсопа , ошибка стала вылетать реже но всеже вылетает.

вписал delay(50) еще немного сократилось кол-во ошибок, при Delay(150) ошибка редко появляется но все же есть( 

по железу:

я сделал тестовую платформу для себя.

два мотор редуктора взяты от игрушек.

сверху установлена макетная плата для безпаечного мантажа, на ней собственно и собрана вся схема.

"Мозг" сей штуки Orduino nano v1.1 Atmega 168/

ДД L293D

Обвязка тсопа сейчас по даташиту, сам тсоп 2136.

питание либо USB порт или аккумулятор на 7,2в + стабилизатор напряжения 5в(т.к на моей ардуинки его нету)

пульт от машинного мп3 модулятора, есть и другие: два от старых телевизоров LG, и один пульт от новго LG.

 

 >>>Не уверен. На 18-22 секунде видно, что что когда он нажимает вправо/влево робот делает краткий "поворот" (150 ml).и останавливается, после чего ему приходится делать пальцем быстрое повторное нажатие что-бы его "еще довернуть".<<<

Вобщем у него работает все как надо, могу вас заверить потому что я всеже смог запустить его код у себя)) все работает так как и должно пока кнопку держишь моторы работают, отпустил не работают.

 

всем огромное спасибо за помощь, надеюсь я всегда смогу обратится к вам за советами т.к я только учусь работать с arduino и думаю у меня возникнит еще много вопросов=)

Отдельное спасибо leshak

Elektro
Offline
Зарегистрирован: 10.02.2012

 и еще вопросик. можно сделать чтоб при появлении ошибка ардуина сама себя сбросила, так же как при нажатиии на reset?? 

leshak
Offline
Зарегистрирован: 29.09.2011

 >вписал delay(50) еще немного сократилось кол-во ошибок, при Delay(150) ошибка редко появляется но все же есть

Ну какой-то их процент будет всегда. Помехи, отражения сигналов и проч. Главное что-бы это процент не выше того уровня, который влияет на поведение "видимое на глаз".

>все работает так как и должно пока кнопку держишь моторы работают

А... я кажись понял. Действительно его подход проще (не зря, все-таки, вы решили отвлечся и погуглить). Не нужно запоминать "прошлое нажатие". Он "код повторения", интерпретирует как "ничего не делать" (ни включать/ни выключать, все оставить как есть). А выключает, в отличае от нас, только когда "уж совсем ничего с пульта не пришло". У нас тоже можно "так сделать". Для этого нужно turnOffPins вызывать не тупо "в конце loop", а в else условия if(irrecv.decode(&results))  . Тогда и необходимость в millis() и массиве TIMES_OFF отпадет.

Чуть позже попробую накидать скетч. Скретстить "его и наш" подход. Логика "больше от него", а кодирование "от нас" (не могу смотреть на эту портянку if-фов ;)

leshak
Offline
Зарегистрирован: 29.09.2011

 >и еще вопросик. можно сделать чтоб при появлении ошибка ардуина сама себя сбросила, так же как при нажатиии на reset??

Можно. Но сходу не скажу как. Гуглите "сторожевой таймер". Это есть встроенное в железе.

Общий подход там такой: включается аппаратный таймер, который в опреденном регистре все время уменьшает значение на единицу. Когда значение доходит до нуля, он перегружает контроллер. Поэтому нужно где-нибудь в loop. Значение этого счетчика все время "востанавливать". Если скетч где-то "завис"/"зациклился" - "востановление" прекратится, счетчик дойдет до нуля и камень ребутнется. То же самое будет, есл вы где-то воткнете слишком большой delay, за который счетчик успеет обнулися.

Наверное под это дело, лучше отдельную ветку завести (если еще нет таковой).

Mastino
Offline
Зарегистрирован: 03.12.2011

.

leshak
Offline
Зарегистрирован: 29.09.2011

 >можно ваш email?

Конечно. Сам хотел  предложить, но останавливало не желание светить контакты в публичности, а "привата тут нема". Думал предложить использовать связку skype+teamviewer. Тогда все, то же самое, можно было-бы сделать за час-два, а не растягивать на неделю. Но каждый раз казалось что "ну вот теперь должно заработать" и не лениво было с этим замарачиватся ;)

Щас напишу.

leshak
Offline
Зарегистрирован: 29.09.2011

 А... немного проглядел "кто просил email". Тогда про skype+temеmviewer - не в тему. Но все равно оставлю контакт.

leshak
Offline
Зарегистрирован: 29.09.2011

>ардуина сама себя сбросила

Поверхностное гугление говорит что нужно юзать

 #include <avr/wdt.h>

Посмотрите например тут http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1222941939/all

Но, есть много жалоб, что "все это сильно глючит" и причина в багах в бутлоадере некоторых плат, так что возможно его тоже прийдется перешивать, для корректной работы. Видел даже жалобы типа "теперь я даже не могу новый скетч залить".

Elektro
Offline
Зарегистрирован: 10.02.2012

 >ардуина сама себя сбросила

немного потестив найденый скетч,необходимость в автоматическом сбросе отпала. В нем когда возникает ошибка робот просто останавливается , если повторно нажать на любую кнопку то программа возобнавляет свое действие.

>>А... немного проглядел "кто просил email". Тогда про skype+temеmviewer - не в тему. Но все равно оставлю контакт.

Можно ваш скайм или емаил, как вам будет удобней? 

leshak
Offline
Зарегистрирован: 29.09.2011

 >Можно ваш скайм или емаил, как вам будет удобней?

Нет. Можете считать меня параноиком, но светить контакты публично я не буду. А специально заводить "публичный ящик"  мне лениво. Хотите - оставляете свои контакты, как сделал Mastino, я постучу в них.

Elektro
Offline
Зарегистрирован: 10.02.2012

"_"

leshak
Offline
Зарегистрирован: 29.09.2011

 >Хорошо. вот мой скайп "..."

Отправил вам запрос на авторизацию. Можете, по примеру, Mastino, отредактировать предыдущие сообщение и убрать свой skype с публичного обозрения (я как-то сразу до этого не додумался).

Elektro
Offline
Зарегистрирован: 10.02.2012

 да, только вы пожалуйста удадите мою цитату из ващего сообщения #113 , а то толку никакого)))) 

ustas
Offline
Зарегистрирован: 12.03.2012

 ааа.. помощь нужна! leshak, очень нужен контакт (стукнись в скайп stepanovalex). Собственно, проблема тут описана: http://arduino.ru/forum/apparatnye-voprosy/problema-s-ik

 

Elektro
Offline
Зарегистрирован: 10.02.2012

 хм тут впросик встал такой

вообщем придумал код ля генерации произвольной мелодии.

вот: 


int chastota =0; //переменная для частоты
int time =0; // длительность сигнала
int vremy = 0; // время генерации

void setup()
{

Serial.begin(9600);
pinMode(9, OUTPUT);

}


void loop()
{
    chastota = random(100, 5000);
    Serial.print("chastota:");Serial.println(chastota);
    time = random(20,80);
    Serial.print("time:");Serial.println(time);
    vremy = random(50);
    Serial.print("vremy:");Serial.println(vremy);

  
  tone(9, chastota, time);
  delay(vremy);
}

попытался совместить с #IRremote . и ничего не вышло. влияет ли tone на управление с пульты? 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

А вот такой вопрос, как научить ардуину запоминать коды. Т.е.

1. Удерживаем кнопку

2. Направляем пульт на ик транзистор и жмём нужную нам кнопку на ик пульте

3. Ардуина записывает этот код в энергонезависимую память

4. Отпускаем кнопку, берем переменную с памяти и работаем с ней...

 

Elektro
Offline
Зарегистрирован: 10.02.2012

knack пишет:

А вот такой вопрос, как научить ардуину запоминать коды. Т.е.

1. Удерживаем кнопку

2. Направляем пульт на ик транзистор и жмём нужную нам кнопку на ик пульте

3. Ардуина записывает этот код в энергонезависимую память

4. Отпускаем кнопку, берем переменную с памяти и работаем с ней...

 

в библиотеке IRremote есть пример с записью команд с пульта, там как раз то что вам нужно.

2не на ик транзистор, а на ик приемник TSOP(разница большая)  и нужно чтобы частоты приемника и пульта совпадала.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Elektro пишет:

knack пишет:

А вот такой вопрос, как научить ардуину запоминать коды. Т.е.

1. Удерживаем кнопку

2. Направляем пульт на ик транзистор и жмём нужную нам кнопку на ик пульте

3. Ардуина записывает этот код в энергонезависимую память

4. Отпускаем кнопку, берем переменную с памяти и работаем с ней...

 

в библиотеке IRremote есть пример с записью команд с пульта, там как раз то что вам нужно.

2не на ик транзистор, а на ик приемник TSOP(разница большая)  и нужно чтобы частоты приемника и пульта совпадала.

Спасибо не догадался там посмотреть, спасибо что поправили.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Elektro пишет:

еке IRremote есть пример с записью команд с пульта, там как раз то что вам нужно.

Помоему это не совсем то, или я там ничего не понял из примера, может использовать EEPROM.write для записи кода, не совсем догнал как разбить код по адресам

т.е. hex в byte конвертировать или я не в те дебри полез?

leshak
Offline
Зарегистрирован: 29.09.2011

Elektro пишет:

 

попытался совместить с #IRremote . и ничего не вышло. влияет ли tone на управление с пульты? 

Очень вероятно. И та и та библиотека - использует таймеры. Как минимум IRremote еще и перенастраивает их под себя.

Какой именно таймер кто использует - нужно смотреть в код библиотек. В IRRemote это зависит еще от того под какой камень компиляция происходит. Для некоторых камней - можно перевесится на другой таймер.

Elektro
Offline
Зарегистрирован: 10.02.2012

 у меня atmega168,тоесть есть возможность перевести на другой таймер и заставить работать? 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

 Ребят ну подскажите хоть в какую сторону рыть, я совсем новичёк, как слепой котёнок носом тыкаюсь...

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну рыть однозначно в сторону чтения даташитов на таймеры и PWM. Потом смотреть в код библиотек, что они делают. Ищите слова timer, pwm читаете комментарии к коду. Лезете в даташит что-бы понять что означают эти магические цифры и имена портов, используемые в библиотеке. Но "как оно для новичка" - я слабо представляю. Рецепта "поменяйте одну строчку" - похоже нет. Хотя сам, возню с ардуиной имеено с изучения этой IRRemote начинал.

Возможно прийдется делать свой декодер IR-а. Без "подкручивания таймера". На attachInterrupt. Не используя IRRemote.

Кстати, похоже я ошибся. IRremote жестко пришит к Timer2 (хотя память упорно продолжает твердить что были там закомменченные куски кода, с другими таймерами). Но есть надежда на Tone библиотеку. Посмотрел ее "левым глазом", похоже что вот она точно умеет разными таймерами пользоватся. Какой именно - зависит от используемого пина и текущего камня. Если я правилно понял - смена таймера происходит путем перевешиваня на другой pin (и указания его в фунции tone).

Какие  таймеры соотвествуют пинам ищите или в документации на нее (я побыстрому не нашел) или глядя в Tone.cpp. В принципе он и начинается определения таймеров под разные камни и фунции begin где сопоставляются пины и таймеры.

Ну или , банально методом тыка пройтись по всем digitalPin авось на каком-то заработает. Если нет.... тогда свой упрощенный аналог IRRemote ваять прийдется.

 

Xoon
Offline
Зарегистрирован: 02.04.2012

Здравствуйте! Прочитал эту тему и несколько соседних, решил попробовать собрать устройство, при помощи которого можно дистанционно управлять шторой. Сделал за 1 вечер, никаких проблем не возникло. Вот видео, как работает:

 http://www.youtube.com/watch?v=UrLAqd39pI0

leshak
Offline
Зарегистрирован: 29.09.2011

 > Сделал за 1 вечер, никаких проблем не возникло

Ну это "как повезет". Как правило простешие, когда нужно просто включить/выключить pin - проблем не вызывает. Проблемы вылазят когда PWM-мом рулить нужно, или еще паральельно IR датчик дальности висит и т.п. Вообщем когда начинаешь "слеплять" разные библиотеки которые друг-другу мешают.

Но даже и с одной. От пульта сильно зависит - вам повезло. Я две недели с томпсоном колупался (у него свой протокол, про который IRRemote ничего не знает), хотя с пионеровским пультом, взятым у соседа - все заработало за пять минут.

>Вот видео, как работает

А что за механика? Какие-то датчики "крайних положений" есть?

Xoon
Offline
Зарегистрирован: 02.04.2012

leshak пишет:

А что за механика? Какие-то датчики "крайних положений" есть?

Вот здесь ответил: http://arduino.ru/forum/proekty/sobral-ustroistvo-upravleniya-shtoroi-s-pulta

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Похоже вы ответили на 2 последних поста в одном :)

у меня немного другая задача, есть некое устройство которое должно управлятся любым ик пультом. 

т.е. нажимается кнопка обучения на устройстве, нажимаешь кнопку на пульте, он это значение считывает, затем пульт управляет релюшкой. Этот код я написал, остались мелочи, меня интересует другое, как значения с results.value записать в EEPROM  память, затем считать обратно, что бы после обестачивания устройства, не нужно было обучать заново. Я так понял в EEPROM  каждая ячейка держит в бинарном виде 1 бит. Вот как 16ти - 32 битную команду пульта записать в эту память, как разбить 32 бита по одному и с лать с индексом ячейки в EEPROM?

Я с си толком не работал, по справке ардуино порылся толком ничего не расписано, но жутко интересно :)

leshak
Offline
Зарегистрирован: 29.09.2011

knack пишет:

Похоже вы ответили на 2 последних поста в одном :)

у меня немного другая задача, есть некое устройство которое должно управлятся любым ик пультом. 

т.е. нажимается кнопка обучения на устройстве, нажимаешь кнопку на пульте, он это значение считывает, затем пульт управляет релюшкой. Этот код я написал, остались мелочи, меня интересует другое, как значения с results.value записать в EEPROM  память, затем считать обратно, что бы после обестачивания устройства, не нужно было обучать заново. Я так понял в EEPROM  каждая ячейка держит в бинарном виде 1 бит. Вот как 16ти - 32 битную команду пульта записать в эту память, как разбить 32 бита по одному и с лать с индексом ячейки в EEPROM?

Я с си толком не работал, по справке ардуино порылся толком ничего не расписано, но жутко интересно :)

  1.  Без разбирательства с Cи, вы врядли сможете двигатся дальше. Без понимания как разные типы данных в памяти хранятся - дальше двигатся не получится. Нужно не путаться между системами исчисления (десятичная, двоичная, шестнадцатеричная) и типами. Не путать бит и байт. Иначе вы ни вопрос задать не сможете, ни ответ понять, ни документацию прочитать (и это даже не к Си относится, а к базовым знаниям "по информатике"). Как ни странное, что-бы программить нужно разобратся с "базовыми терминами". А уж в справке (по Си, бейсику и т.п.) вы смотрите как эти "базовые понятия" выражаются на этом конкретном языке.
  2.  В справке-то по ардуине написанно. Фунции EEPROM.write и EEPROM.read. Только писать/читать они могут не "побитно", а "побайтово" (переменаня value имеет тип byte). Следовательно вам, что-бы записать в EEROM 16-ти битнную переменную нужно вызвать ее два раза (один байт это восемь бит). Вначале записать старший байт, потом младший (или наоборот, главное потом вычитывать в таком же порядке). Что-бы "разбирать/собирать" переменные на байты почитайте раздел документации Bitwise Operators. И фунции из раздела Bits and Bytes. Особенно lowByte(), highByte() и т.п
  3. Если вы действительно хотите "любой пульт", то вам нужно смотреть не results->value, а в results->rawbuf. Если я не ошибаюсь, то results.value содержит вменяемое значение только если "кодировка распознанна". Если же она Unknown, то в rawbuf лежат просто длительности импульсов.

 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

 Пардон точно побайтово, вот это именно то что искал, пошёл учить основы :)

 Последний раз я с этим сталкивался в школе в паскале . А тут такое хобби, затянуло :) 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

 Вот кстати мой скетч, алгоритм таков, нажимается кнопка программирования, моргает светодиод №1, ждёт комманды 5 сек, не дожидается перескакивает на следуйщий, команда принята, так же пререскакивает на следуйщий. все 5 запрограммированы, пульт управляет пинами, может посоветуете в коде что нибудь?

#include <IRremote.h>

int RECV_PIN =11;
int butpin = 10;
int ledpin[] = {2, 3, 4, 5, 6};
int swichpin[] = {7, 8, 9, 12, 13};
int ledstate[] = {0, 0, 0, 0, 0};
int butrec = 0;
long prevcode[] = {1, 1, 1, 1, 1};
long prevM = 0;
long prevM1 = 0;
long timeEx = 0;
boolean expr = true;

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  for (int i=0; i <= 5; i++){
    pinMode(ledpin[i],OUTPUT);
  }
  for (int i=0; i <= 5; i++){
    pinMode(swichpin[i],OUTPUT);
  }

  pinMode(butpin, INPUT);
  Serial.begin(9600); 
  irrecv.enableIRIn();
}

void loop()
{
  if (irrecv.decode(&results)){
    delay(150);
    for(int i=0; i<5; i++)
      if (results.value == prevcode[i]){
        ledstate[i] = !ledstate[i];
        digitalWrite(ledpin[i], ledstate[i]);
        digitalWrite(swichpin[i], ledstate[i]);
      }
    irrecv.resume();
  }

  butrec = digitalRead(butpin);
  if (butrec == HIGH){
    for (int i=0; i<5; i++){      
      ledstate[i] = 0;
      digitalWrite(ledpin[i], ledstate[i]);
      digitalWrite(swichpin[i], ledstate[i]);
    }
    timeEx = millis() - prevM1;

    for (int i=0; i<5; i++){
      expr = true;
      timeEx = 0;
      prevM1 = millis();        
      while (expr == true && timeEx < 5000){       
        timeEx = millis() - prevM1;
        if (millis() - prevM > 250){           
          prevM = millis();
          int ledstate1 = !ledstate1;
          digitalWrite(ledpin[i], ledstate1);
        }                                      
        if (irrecv.decode(&results)) {         
          delay(150);
          prevcode[i] = results.value;
          irrecv.resume();
          expr = !expr;
          prevM1 = millis();

        }                                      
      }

      digitalWrite(ledpin[i], LOW);

    }
  }
}

 Вопрос если не использовать Serial.begin, 0 и 1 цифровой выход можно использовать?

SavellyS
Offline
Зарегистрирован: 09.04.2012

 Вот посмотрите я немно изменил скретч, который на первой странице 

У меня получилось , только после отпускания кнопки светодиод все же работает ну 300 мс в основном я только изменил 0xFFFFFFFF

#include <IRremote.h>

int RECV_PIN = 11;
int FORWARD_PIN = 13;
int BACKWARD_PIN = 4;
int LEFT_PIN = 6;
int RIGHT_PIN = 7;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(FORWARD_PIN, OUTPUT);
pinMode(BACKWARD_PIN, OUTPUT);
pinMode(LEFT_PIN, OUTPUT);
pinMode(RIGHT_PIN, OUTPUT);

}

void loop() {
delay (300);
digitalWrite(RIGHT_PIN,LOW);
digitalWrite(BACKWARD_PIN,LOW);
digitalWrite(LEFT_PIN,LOW);
digitalWrite(FORWARD_PIN,LOW);
if (irrecv.decode(&results)) {
if (results.value == 0x2FD40BF) {
digitalWrite(FORWARD_PIN,HIGH);
}
else if (results.value == 0xFFFFFFFF) {
digitalWrite(RIGHT_PIN,HIGH);
digitalWrite(FORWARD_PIN,HIGH);
}
else if (results.value == 0x4FDA1A25) {
digitalWrite(LEFT_PIN,HIGH);
digitalWrite(FORWARD_PIN,HIGH);
}
else if (results.value == 0x52DA1EDC) {
digitalWrite(BACKWARD_PIN,HIGH);
}
else if (results.value == 0x5A75109A) {
digitalWrite(RIGHT_PIN,HIGH);
digitalWrite(BACKWARD_PIN,HIGH);
}
else if (results.value == 0xDCC5C566) {
digitalWrite(LEFT_PIN,HIGH);
digitalWrite(BACKWARD_PIN,HIGH);
}
else {
digitalWrite(RIGHT_PIN,LOW);
digitalWrite(BACKWARD_PIN,LOW);
digitalWrite(LEFT_PIN,LOW);
digitalWrite(FORWARD_PIN,LOW);
}
irrecv.resume(); // Receive the next value 4151455000
}
}

Но это получается только для одного светодиода если нажать другую кнопку и удерживать то  пять будет все работать(((

Svas
Offline
Зарегистрирован: 02.05.2012

Может поможет 

http://sites.google.com/site/arduinoirc/

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

 Благодарю скетч для ИК пульта заработал все получилась !
есть у меня скетч для управления серво мотором тоже все работает.

теперь хочу объединить ИК пульт и серво мотор
как можно объединить два скетча ?
или может есть у кого готовый скетч

#include <IRremote.h>

int RECV_PIN = 11;
int OUTPUT_PIN = 4;

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  pinMode(OUTPUT_PIN, OUTPUT);
  pinMode(13, OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
}

int on = 0;
unsigned long last = millis();

void loop() {
  if (irrecv.decode(&results)) {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250) {
      on = !on;
      digitalWrite(OUTPUT_PIN, on ? HIGH : LOW);
    }
    last = millis();      
    irrecv.resume(); // Receive the next value
  }
}
//Program by Jeremy Blum
//www.jeremyblum.com
//Controls a Servo Motor

//Include Servo Library
#include <Servo.h>

//Define Pins
int servoPin = 9;

//Create Servo Object
Servo jeremysServo;

void setup()
{
 
  //Attaches the Servo to our object
  jeremysServo.attach(servoPin);
}

void loop()
{

  //We can Turn a Servo to 180 degrees
  for (int i = 0; i <=180; i=i+20)
  {
    jeremysServo.write(i);
    delay(1000);
  }
  
}

 

Vitaly
Offline
Зарегистрирован: 12.09.2011

Хорошая тема.

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

Vitaly пишет:

Хорошая тема.

v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки

/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
 v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
 Version 0.1 2013/07/02
 
 После того как я выложил видео 
 1/6 Управление Arduino с ИК пульта - начало
 http://www.youtube.com/watch?v=PjR9jlP4644
 поступило немало  просьб такого содержания
 (Антон Палыч 
 Дмитрий, огромная благодарность за Ваш труд! Все просто и доходчиво.
 Скачал Ваш пример "urok ot Dmitriya Osipova - upravleniye Arduino IK pulоtom"
 Все работает но у меня возник вопрос. Как сделать, 
 что бы кнопка определенного пина работала в режиме удержания а не в режиме "триггер" как в уроке?
 То есть нажимая и удерживая кнопку пульта напряжение идет, отпуская исчезает.)
 //
 Поначалу я думал все это будет сделать очень легко и просто, а потом выяснилось что тут
 много подводных камней.
 в видео я подробно все это изложу
v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
https://www.youtube.com/watch?v=AjIASUNiWkY
 
 *******************************************************************
 
 
 Скачать библиотеку IRremote для ИК пульта
 https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkx...
 
 скетч arduino чтобы узнать код кнопки ИК пульта
 sketch arduino buttons on the remote to learn the code
 https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5... 
 
 4/6 как ? узнать код - кнопки своего ИК пульта
 http://www.youtube.com/watch?v=InZuGntH_wk
 
 Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
 http://www.youtube.com/watch?v=Nx6DUQ7Tx1w
 
 усилитель ИК инфракрасного сигнала IR infrared signal amplifier на одном транзисторе Arduino
 http://www.youtube.com/watch?v=3EYxONWSyR4
 
 */

#include <IRremote.h> // это скачанная библиотека

int RECV_PIN = 11; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

//eventTime, для паузы,  вместо delay,будем использовать функцию millis. 
unsigned long eventTime=0;
//индикация таймера
int timer = 12;

int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.
int L2 = 2;
int L3 = 3;
int L4 = 4;
int L5 = 5;
int L6 = 6;
int L7 = 7;
int L8 = 8;

void setup(){
  irrecv.enableIRIn(); // включить приемник

  pinMode(L13, OUTPUT); // назначаем пины как выходы
  pinMode(L2, OUTPUT);
  pinMode(L3, OUTPUT); 
  pinMode(L4, OUTPUT);
  pinMode(L5, OUTPUT);
  pinMode(L6, OUTPUT);
  pinMode(L7, OUTPUT);
  pinMode(L8, OUTPUT);

  pinMode(timer, OUTPUT);
} 
void loop() {
  // Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
  //После появление и пропадания сигнала, состояние сразу не меняется! а ждет  100 миллисекунд.
  //Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

  //Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен.

  // Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал
  if (digitalRead(RECV_PIN) == LOW) 
    //  Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
    eventTime=millis(),digitalWrite(timer, HIGH);
  //  Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
  if(millis()-eventTime>100) digitalWrite(timer, LOW)
    //  и вЫключаем все
    ,digitalWrite(L13, LOW),digitalWrite(L2, LOW),digitalWrite(L3, LOW)
      ,digitalWrite(L4, LOW),digitalWrite(L5, LOW),digitalWrite(L6, LOW),digitalWrite(L7, LOW),digitalWrite(L8, LOW);

  if (irrecv.decode(&results)) {
    //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
    //-у вашего пульта будет другой код, замените на свой!
    // У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала,  чтобы обойти эту проблему
    //я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77
    // Теперь неважно какой код отправлен  с кнопки пульта, первый или второй
    // Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809 

    //Только при условии если, (Одновременно),Обнаружен поступивший код кнопки
    // и выключен ТаймерПИН,"и" "&&" (digitalRead(timer) == HIGH)
    // включаем нужный нам pin, digitalWrite(L13, HIGH);

    if (results.value == 0x1000809 || results.value == 0xF7283C77 && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH); 
    if (results.value == 0x1008889 || results.value == 0x757FB4DF && (digitalRead(timer) == HIGH) )digitalWrite(L2, HIGH);
    if (results.value == 0x1004849 || results.value == 0xB33B4597 && (digitalRead(timer) == HIGH) )digitalWrite(L3, HIGH); 
    if (results.value == 0x100C8C9 || results.value == 0x3C03E507 && (digitalRead(timer) == HIGH) )digitalWrite(L4, HIGH);
    if (results.value == 0x1002829 || results.value == 0xE705551F && (digitalRead(timer) == HIGH) )digitalWrite(L5, HIGH); 
    if (results.value == 0x100A8A9 || results.value == 0xA4A58EC7 && (digitalRead(timer) == HIGH) )digitalWrite(L6, HIGH);
    if (results.value == 0x1006869 || results.value == 0xE2E45F7F && (digitalRead(timer) == HIGH) )digitalWrite(L7, HIGH); 
    if (results.value == 0x100E8E9 || results.value == 0x6BACFEEF && (digitalRead(timer) == HIGH) )digitalWrite(L8, HIGH);

    irrecv.resume(); 
  }
}



v.01 Arduino IR motor Управление моторами с ИК пульта и Скоростью ШИМ (PWM) Pan & Tilt
Управляем с помощью инфракрасного IR любого пульта, двумя моторами, подключенными 
 через микросхему L293D.
 так же можем менять скорость вращения моторов, чем дольше удерживаем 
 кнопку нажатой, тем быстрее крутится мотор.
 с применением (ШИМ. PWM)сигнала.
 
/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
 v.01 Arduino IR motor Управление моторами с ИК пульта и Скоростью ШИМ (PWM) Pan & Tilt
 Version 0.1 2013/07/06
 
 Управляем с помощью инфракрасного IR любого пульта, двумя моторами, подключенными 
 через микросхему L293D.
 так же можем менять скорость вращения моторов, чем дольше удерживаем 
 кнопку нажатой, тем быстрее крутится мотор.
 с применением (ШИМ. PWM)сигнала.
в видео я подробно все это изложу
v.01 Arduino IR motor Управление моторами с ИК пульта и Скоростью ШИМ (PWM) Pan & Tilt
https://www.youtube.com/watch?v=0VvIiu0LUbA
 
 *******************************************************************
 
 
 Скачать библиотеку IRremote для ИК пульта
 https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkx...
 
 скетч arduino чтобы узнать код кнопки ИК пульта
 sketch arduino buttons on the remote to learn the code
 https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5... 
 
 4/6 как ? узнать код - кнопки своего ИК пульта
 http://www.youtube.com/watch?v=InZuGntH_wk
 
 Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
 http://www.youtube.com/watch?v=Nx6DUQ7Tx1w
 
 1/6 Управление Arduino с ИК пульта - начало
 http://www.youtube.com/watch?v=PjR9jlP4644
 
 v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
 https://www.youtube.com/watch?v=AjIASUNiWkY
 
 L293D — драйвер двигателей двухканальный Микросхема
 http://www.youtube.com/watch?v=4e3LEfyS3lQ
 
 
 1/3 поворотная видеокамера Pan & Tilt How to Build Your Own remote control
 http://www.youtube.com/watch?v=zNoWkGWF7uA
 
 2/3 поворотная видеокамера Pan & Tilt How to Build Your Own remote control
 http://www.youtube.com/watch?v=fORD4hUcfYM
 
 3/3 поворотная видеокамера Pan & Tilt How to Build Your Own remote control
 http://www.youtube.com/watch?v=Ku93NDyGcvY
 
 
 1/5 Pan & Tilt How to Build Your Own remote control поворотная видеокамера
 http://www.youtube.com/watch?v=w89IhXHsKSs
 
 2/5 Pan & Tilt How to Build Your Own remote control поворотная видеокамера
 http://www.youtube.com/watch?v=hSKYPZ4WEKU
 
 3/5 Pan & Tilt How to Build Your Own remote control поворотная видеокамера
 http://www.youtube.com/watch?v=QPy9V47dJbA
 
 4/5 Pan & Tilt How to Build Your Own remote control поворотная видеокамера
 http://www.youtube.com/watch?v=RlG7Qmq4TOg
 
 5/5 Pan & Tilt How to Build Your Own remote control поворотная видеокамера
 http://www.youtube.com/watch?v=HzzbM2fr5GM
 
 Самый дешевый Arduino Uno 5$ Minimal Atmega328 without Arduino Board
 http://www.youtube.com/watch?v=joSc-AT8o5k
 */

#include <IRremote.h> // это скачанная библиотека
int RECV_PIN = 6; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

//eventTime, для паузы,  вместо delay,будем использовать функцию millis. 
unsigned long eventTime=0;

int timer_PIN = 13; //индикация таймера


// motor_PWM_PIN Чтобы управлять скоростью вращения электромоторов, с помощью ШИМ (PWM).
//напряжение постепенно увеличивается (от 0V to 5V)
// подключаем к микросхеме L293D  (драйвер двигателей двухканальный)
//Сигнал подаём на ENABLE (1)и(2), (к ножки 1 и 9 микросхемы L293D).
int motor_PWM_PIN = 5;

// переменная для  хранения(ШИМ. PWM)сигнала.Импульсов
// уставливаем начально значение (ШИМ. PWM)сигнала в 80 
//Только после достижения(ШИМ. PWM)сигнала от 0 к 80,
//мотор начинает двигаться, проверил опытным путём 
//Чтобы не терять время впустую, сразу Стартуем с 80
int position_PWM = 80;


//motor_ подключяем к (к ножкам INPUT 1,2,3,4 микросхемы L293D).
int motor_up = 10; // мотор вверх
int motor_down = 9; // мотор вниз
int motor_left = 7; // мотор лево
int motor_right = 8; // мотор право

void setup(){
  irrecv.enableIRIn(); // включить приемник
  pinMode(motor_PWM_PIN, OUTPUT);
  pinMode(timer_PIN, OUTPUT);
} 
void loop() {
  // Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
  //После появление и пропадания сигнала, состояние сразу не меняется! а ждет  100 миллисекунд.
  //Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

  //Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен.

  // Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал
  if (digitalRead(RECV_PIN) == LOW) 
    //  Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer_PIN, HIGH);
    eventTime=millis(),digitalWrite(timer_PIN, HIGH);
  //  Продолжительность работы таймера >100 миллисекунд.
  //Если не было сигнала с пульта в течение 100 миллисекунд. То ТаймерПИН вЫключаем //(timer_PIN, LOW)
  if(millis()-eventTime>100) digitalWrite(timer_PIN, LOW)
    //  и вЫключаем все PINы.
    ,digitalWrite(motor_up, LOW),digitalWrite(motor_down, LOW),digitalWrite(motor_left, LOW)
      ,digitalWrite(motor_right, LOW),digitalWrite(motor_PWM_PIN, LOW),position_PWM = 80;

  if (irrecv.decode(&results)) {
    //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
    //-у вашего пульта будет другой код, замените на свой!
    // У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала,  чтобы обойти эту проблему
    //я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77
    // Теперь неважно какой код из 2 отправлен  с кнопки пульта, первый или второй
    // Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809 
    //также мною замечено при использование разных ИК приемников частотой 36,или 38, кГц, библиотека IRremote
    // выдает Разные коды
    //В конце концов сделать 4 "или" (||), чтобы можно было управлять с двух разных пультов

    //Только при условии если, (Одновременно),Обнаружен поступивший код кнопки
    // и выключен ТаймерПИН,"и" "&&" (digitalRead(timer_PIN) == HIGH)
    // включаем нужный нам pin, например digitalWrite(motor_left, HIGH);

    if (results.value == 0x1000809 || results.value == 0xF7283C77 || results.value == 0xE14405A || results.value == 0x3C7BE0E6
      && (digitalRead(timer_PIN) == HIGH) )digitalWrite(motor_left, HIGH);


    if (results.value == 0x1008889 || results.value == 0x757FB4DF || results.value == 0xE14C0DA || results.value == 0xFC0B7A4E 
      && (digitalRead(timer_PIN) == HIGH) )digitalWrite(motor_right, HIGH);


    if (results.value == 0x1004849 || results.value == 0xB33B4597 || results.value == 0xE14E0FA || results.value == 0xED884524 
      && (digitalRead(timer_PIN) == HIGH) )digitalWrite(motor_down, HIGH); 


    if (results.value == 0x100C8C9 || results.value == 0x3C03E507 || results.value == 0xE14F0EA || results.value == 0x70E7155A 
      && (digitalRead(timer_PIN) == HIGH) )digitalWrite(motor_up, HIGH);


    // Если включен timer_PIN
    if(digitalRead(timer_PIN) == HIGH)
      // шаг приращения Скорости мотора
      // читаем состояние переменной position_PWM и к ней прибавляем по + 1 (ШИМ PWM) сигнала
      // Чем больше значение, тем быстрее будет разгоняться мотор
      position_PWM = position_PWM + 1, 
      //Записываем данные из position_PWM в motor_PWM_PIN
      analogWrite(motor_PWM_PIN, position_PWM);

    // чтобы после достижение максимума  > 255 , не сбрасывалось опять на 0, motor_PWM_PIN, оставляем вКлюченным
    if (position_PWM > 255) digitalWrite(motor_PWM_PIN, HIGH);


    irrecv.resume(); 
  }
}








 

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

v.01 Arduino управление servo любым ИК пультом Control IR + speed

управление двумя servo любым (ИК) инфракрасным пультом,для управления задействуем 5 кнопок ИК пульта,

4 кнопки для плавного поворота вправо или влево, а одну кнопку для регулировки скорости поворота.

Рекомендую использовать конденсаторы для сглаживания электрических колебаний которые создают servo во время работы.



----------------------------------------­-- 

скетч sketch: v.01 Arduino управление servo любым ИК пультом Control IR + speed

http://yadi.sk/d/aZVvva147zkqu

================================ 

что нам понадобиться. 

Аппаратное:

1.servo

2. любая Arduino

3. ИК инфракрасный приёмник 

4. Светодиоды нужны только для визуального контроля за процессом. 

5. конденсаторы

--------------------------------

/*             v.01 Arduino управление servo любым ИК пультом Control IR + speed
 ****************************
 урок от Дмитрия Осипова. <a data-cke-saved-href="http://www.youtube.com/user/d36073?feature=watch" href="http://www.youtube.com/user/d36073?feature=watch" rel="nofollow">http://www.youtube.com/user/d36073?feature=watch</a>
 v.01 Arduino управление servo любым ИК пультом Control IR + speed
 Version 0.1-2013/08/16
 -----------------------------
 изменения; в Version 0.1-2013/
 1. 
 2. 
 ------------------------------
 идеология;
 управление двумя servo любым (ИК) инфракрасным пультом,для управления задействуем 5 кнопок  ИК пульта,
 4 кнопки для плавного поворота вправо или влево, а одну кнопку для регулировки скорости поворота.
 Рекомендую использовать конденсаторы для сглаживания электрических колебаний которые создают servo во время работы.
 
 ------------------------------------------ 
 скетч sketch:  v.01 Arduino управление servo любым ИК пультом Control IR + speed
 <a data-cke-saved-href="http://yadi.sk/d/aZVvva147zkqu" href="http://yadi.sk/d/aZVvva147zkqu" rel="nofollow">http://yadi.sk/d/aZVvva147zkqu</a>
 ================================ 
 что нам понадобиться. 
 Аппаратное:
 1.servo
 2. любая Arduino
 3. ИК инфракрасный приёмник 
 4. Светодиоды нужны только для визуального контроля за процессом. 
 5. конденсаторы
 --------------------------------
 программное:
 Библиотеки.
 
 1.IRremote, библиотека для работы с ИК сигналом.
 Скачать библиотеку IRremote для ИК пульта
 <a data-cke-saved-href="https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkxmhW4Xt0%3D" href="https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkxmhW4Xt0%3D" rel="nofollow">https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkxmhW4Xt0%3D</a>
 
 IRremote эта библиотека кажется по новее будет
 <a data-cke-saved-href="http://yadi.sk/d/0jIS1tfw6tbb7" href="http://yadi.sk/d/0jIS1tfw6tbb7" rel="nofollow">http://yadi.sk/d/0jIS1tfw6tbb7</a>
 
 <a data-cke-saved-href="https://github.com/shirriff/Arduino-IRremote" href="https://github.com/shirriff/Arduino-IRremote" rel="nofollow">https://github.com/shirriff/Arduino-IRremote</a>
 
 =======================================================
 подробную видео инструкцию выложу здесь
 v.01 Arduino управление servo любым ИК пультом Control IR + speed
 <a data-cke-saved-href="http://www.youtube.com/watch?v=KYNoWX4yG8s&feature=c4-overview&list=UU7aH7HVqDvwB1xNHfSl-fDw" href="http://www.youtube.com/watch?v=KYNoWX4yG8s&feature=c4-overview&list=UU7aH7HVqDvwB1xNHfSl-fDw" rel="nofollow">http://www.youtube.com/watch?v=KYNoWX4yG8s&feature=c4-overview&list=UU7aH7HVqDvwB1xNHfSl-fDw</a>
 ++++++++++++++++++++++++++++++ 
 Вспомогательные видео обзоры, скетчи.....
 
 скетч arduino чтобы узнать код кнопки ИК пульта
 sketch arduino buttons on the remote to learn the code
 <a data-cke-saved-href="https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5QKJHGRQ%3D" href="https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5QKJHGRQ%3D" rel="nofollow">https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5QKJHGRQ%3D</a> 
 
 4/6 как ? узнать код - кнопки своего ИК пульта
 <a data-cke-saved-href="http://www.youtube.com/watch?v=InZuGntH_wk" href="http://www.youtube.com/watch?v=InZuGntH_wk" rel="nofollow">http://www.youtube.com/watch?v=InZuGntH_wk</a>
 
 
 v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
 <a data-cke-saved-href="https://www.youtube.com/watch?v=AjIASUNiWkY" href="https://www.youtube.com/watch?v=AjIASUNiWkY" rel="nofollow">https://www.youtube.com/watch?v=AjIASUNiWkY</a>
 
 
 Самый дешевый Arduino Uno 5$ Minimal Atmega328 without Arduino Board
 <a data-cke-saved-href="http://www.youtube.com/watch?v=joSc-AT8o5k" href="http://www.youtube.com/watch?v=joSc-AT8o5k" rel="nofollow">http://www.youtube.com/watch?v=joSc-AT8o5k</a>
 
 */



#include <Servo.h> //библиотека для Servo
#include <IRremote.h> // это скачанная библиотека IRremote для ИК пульта


int RECV_PIN = 2; //вход ИК инфракрасного приемника 
IRrecv irrecv(RECV_PIN);
decode_results results;

Servo dimkaservo_1; //даём имена servo
Servo dimkaservo_2;

//Pin для светодиодов,светодиоды для визуального контроля за процессом
int ledPin_1 = 15; //PIN 15, на Arduino Uno, Atmega328 (A1)
int ledPin_2 = 16;
int ledPin_3 = 17;
int ledPin_4 = 18;

// 1. для сглаживания пульсирующего ИК сигнала.
// 2. для отключения светодиодов ledPin после пропадания ИК сигнала, без использования delay.
int timer_ledPIN = 14; //индикация таймера //PIN 14, на Arduino Uno, Atmega328 (A0)

// для визуального контроля яркостью светодиода, изменения (увеличения или уменьшения) скорости работы servo.
int speed_PWM_ledPin = 5;

// переменная для плавного вращения servo,чтоб не использовать delay.
// промежуточная переменная для хранения (увеличенного диапазона от 0 до 30000)значений (увеличения или уменьшения)PWM,
// с последующей конвертации в переменную(val) диапазон градусов поворота доступных для servo.
int a =0;
int d =0;

//переменная для конвертации (увеличенного диапазона значений от 0 до 30000) (a),(d),в значения требуемые для поворота servo.
int val_1; 
int val_2;

//переменная для (увеличения или уменьшения)скорости поворота servo.
int speed_PWM=1;

//переменная eventTime, для паузы,  вместо delay,будем использовать функцию millis.
unsigned long eventTime=0;

void setup() {              
  // Serial.begin(9600);
  irrecv.enableIRIn(); // включить ИК приёмник

  dimkaservo_1.attach(9); // серво подключён на цифровой вход (pin 9)
  dimkaservo_2.attach(10); // серво подключён на цифровой вход (pin 10)

  pinMode(ledPin_1, OUTPUT);
  pinMode(ledPin_2, OUTPUT);
  pinMode(ledPin_3, OUTPUT);
  pinMode(ledPin_4, OUTPUT);


  pinMode(timer_ledPIN, OUTPUT);

  pinMode(speed_PWM_ledPin, OUTPUT);

}

void loop() {
  // По приёму и обработки сигнала от ИК инфракрасного пульта. 
  //Мой опыт работы с ИК пультами выявил разные принципы отправки ИК сигналов кодов у разных производителей техники (пультов) 
  //мне нужно, чтоб система могла работать и в режиме удержания кнопки, для этого нужно постоянно слать ИК код с пульта
  // пока кнопка на пульте нажата.
  //Увы, есть пульты которые шлют код только один раз, в момент нажатия кнопки.  
  // послав 1 код, пульт далее продолжает, слать (в момент удержания кнопки), (назовем его (пустой инфракрасный сигнал).
  // после отпускания кнопки (пустой инфракрасный сигнал) исчезает.
  // Задача такая, после приёма определённого кода кнопки,сразу перехватывать идущий за ним (кодом), (пустой инфракрасный сигнал)
  // и считать его, (пустой инфракрасный сигнал), за код кнопки. 
  //после пропадания (пустого инфракрасного сигнала), будем считать, что код перестал слаться

  // Эта конструкция нужна чтобы. 
  //1.после приёма определённого кода кнопки,перехватывать  (пустой инфракрасный сигнал)
  //2.конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
  //После появления и пропадания сигнала, состояние сразу не меняется! а ждет  100 миллисекунд.
  //Если 100 миллисекунд не прошло, и поступил еще один ИК сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

  //Проще говоря, пока кнопка на ИК пульте нажата timer_ledPIN остается HIGH
  //если кнопка на пульте отпущена, LOW.



  // Читаем состояние ноги у (ИК) преемника. В момент приема данных, у (ИК) 
  //приемника на выходе появляется пульсирующий (-)отрицательный сигнал


  if (digitalRead(RECV_PIN) == LOW)     
    eventTime=millis(),digitalWrite(timer_ledPIN, HIGH);  
  if(millis()-eventTime>100) digitalWrite(timer_ledPIN, LOW),digitalWrite(ledPin_1, LOW),digitalWrite(ledPin_2, LOW),
  digitalWrite(ledPin_3, LOW),digitalWrite(ledPin_4, LOW);


  //если ledPin_1) ==, выставляем ограничение для переменной(a) до (&& a<30000).и Начинаем увеличивать
  // значения переменной(a), на значение переменной speed_PWM,
  //и также выставляем ограничение при убывании (&& a>0)
  if(digitalRead(ledPin_1) == HIGH && a<30000  ) a=a+speed_PWM;
  if(digitalRead(ledPin_2) == HIGH && a>0  ) a=a-speed_PWM;


  //читаем значение (a) и конвертируем его в значение val, то бишь в значение поворота в градусов доступных для servo.
  // правильно было бы конвертировать в, (от 0, до 180) градусов, но мои дешёвые servo доходя до краёв,
  //начинают дребезжать,поэтому я кастрировал их (края) по 10 градусов (10, 170);)
  val_1 = a;           
  val_1 = map(val_1, 0, 30000, 10, 170);     // scale it to use it with the servo (val_1ue between 10 and 170) 
  dimkaservo_1.write(val_1);                  // sets the servo position according 

  //делаем тоже самое и для dimkaservo_2
  if(digitalRead(ledPin_3) == HIGH && d<30000  ) d=d+speed_PWM;
  if(digitalRead(ledPin_4) == HIGH && d>0  ) d=d-speed_PWM;

  val_2 = d;           
  val_2 = map(val_2, 0, 30000, 10, 170);     
  dimkaservo_2.write(val_2);  //записываем значения  val_2 в dimkaservo_2               



    // Эта часть отвечает за приём и обработку ИК кодов
  // здесь считываем коды от ИК пульта



  // У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала,  чтобы обойти эту проблему
  //я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77
  // Теперь неважно какой код отправлен  с кнопки пульта, первый или второй
  // Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809 
  //также мною замечено при использовании разных ИК приемников, частотой 36,или 38, кГц, библиотека IRremote
  // выдает Разные коды.
  //можно сделать 4 "или" (||), чтобы можно было управлять с двух разных ИК пультов

  //ВАЖНО !!! (1000809) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
  //-у вашего пульта будет другой код, замените на свой!

  if (irrecv.decode(&results)) {
    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1000809 || results.value == 0xF7283C77))digitalWrite(ledPin_1, HIGH);  
    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1008889 || results.value == 0x757FB4DF))digitalWrite(ledPin_2, HIGH);

    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1004849 || results.value == 0xB33B4597))digitalWrite(ledPin_3, HIGH);  
    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x100C8C9 || results.value == 0x3C03E507))digitalWrite(ledPin_4, HIGH);



    //эта кнопка пульта для (увеличения или уменьшения)скорости поворота servo.
    // начинаем увеличивать скорость на одну позицию speed_PWM++;
    // и ставим ограничение на количество скоростей if (speed_PWM > 20)
    // дойдя до 20 скорости,сбрасываемся на первую скорость > 20)speed_PWM=1;



    if(digitalRead(timer_ledPIN) == HIGH && (results.value == 0x1002829 || results.value == 0xE705551F))speed_PWM++;
    if (speed_PWM > 20)speed_PWM=1;


    //для визуального контроля за состоянием скоростной коробки передач (спидометр),используем светодиод speed_PWM_ledPin
    //(увеличивая или уменьшая)PWM сигнал (analogWrite) "записываем в светодиод" значения от переменной speed_PWM,
    // для контрастности изменений в яркости, умножаем speed_PWM в 4 раза (speed_PWM*4)

    analogWrite(speed_PWM_ledPin,speed_PWM*4);
    //Serial.println(speed_PWM);

    irrecv.resume(); 
  }
} 

// уникальность этого sketch в том, что не используется ни одного delay();.
// Благодаря этому, значение (плавность поворота servo) высокое. 
// Есть возможность параллельно выполнять в постоянном режиме другие процессы.

 

leshak
Offline
Зарегистрирован: 29.09.2011

2dimka: может вы просто заведете себе отдельную темку? Скажем в разделе "проекты"?  И кидайте туда. А в тематических ветках, если они "чем-то похожи" - можно просто ссылочку давать. На свою темку. На этом сайте.

Зачем это все раскопипащивать по всем темам? Вдруг у кого-то вопросы возникнут по вашему коду? Не обсуждать же его сразу в 20-ти ветках.

Да и если честно, SEO это попахивает. Понятно что хочется совместить приятное с полезным. И свою известность приподнять. Сам иногда даю ссылочку на свой бложик. Но.... не в таких же количествах, простите. Да еще не глядя во все ветки где попались ключевые слова.

Кстати - постарайтесь что-нибудь ответить на это. Что-бы было понятно, мы вообще с живым человеком общаемся, или с SEO-роботом, который продвигает вас.

 

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

leshak, с живым 

[leshak: Удалено  за откровенное SEO]

Клапауций
Offline
Зарегистрирован: 10.02.2013

Караул - zомби!

Кто-нибудь, сообщите куда-нибудь!

leshak
Offline
Зарегистрирован: 29.09.2011

dimka пишет:

leshak, с живым 

С живым, но явно глупым. Намеков - не понимающего.

Клапауций
Offline
Зарегистрирован: 10.02.2013

leshak пишет:

С живым, но явно глупым. Намеков - не понимающего.

Да, чего с ним сюсюкаться? - выпилить, нахрен, всЁ его творчество и забанить за тупой спам.

esau
Offline
Зарегистрирован: 06.02.2012

dimka пишет:

v.01 Arduino управление servo любым ИК пультом Control IR 

Добрго времени суток Дмитрий .  Делаю управлене усилителем на основе вашего кода ,немного подправив пришел к следкющим результатам . 1 управление моторизировоным потонциометром ., 2 переключением меж 5 каналами . 3 включение ,и выключение. Не моглибы вы выручить . Задача стоит чтоб от одной кнопки пульта ИК последовательно переключались реле селектора входов усилителя . Заранее спасибо. 


#include <IRremote.h> 

int RECV_PIN = 10;
IRrecv irrecv(RECV_PIN);
decode_results results;





  unsigned long eventTime=0;



  int timer = 7;

  int Motor1 = 11; 
  int Motor2 = 12;
  int RELAY1 = 2;
  int RELAY2 = 3;
  int RELAY3 = 4;
  int RELAY4 = 5;
  int RELAY5 = 6;
  int RELAY6 =13;


  void setup(){

  irrecv.enableIRIn(); 
  pinMode(Motor1, OUTPUT); 
  pinMode(Motor2, OUTPUT);
  pinMode(RELAY1, OUTPUT); 
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  pinMode(RELAY5, OUTPUT);
  pinMode(RELAY6, OUTPUT);
  

  pinMode(timer, OUTPUT);
  } 
  void loop() {
  
  

    eventTime=millis(),digitalWrite(timer, HIGH);

    if(millis()-eventTime>100) digitalWrite(timer, LOW)

    ,digitalWrite(Motor1, LOW),digitalWrite(Motor2, LOW);

    if (irrecv.decode(&results)) {
  
    if (results.value == 0x6421) 
    {  // мотор потенциометра  АЛПС
    digitalWrite(Motor1, HIGH);
    digitalWrite(Motor2, LOW);
    }
    
    
    if (results.value == 0x2421) 
    {  // двигун потенциометра  Алпс
    digitalWrite(Motor2, HIGH);
    digitalWrite(Motor1, LOW);
    }
    
    // 1 Реле
    if (results.value == 0x4021) 
    {  
    digitalWrite(RELAY1, HIGH);
    digitalWrite(RELAY2, LOW);
    digitalWrite(RELAY3, LOW);
    digitalWrite(RELAY4, LOW);
    digitalWrite(RELAY5, LOW);
    }
   
    
    // 2 Реле
    if (results.value == 0x2021) 
    {  
    digitalWrite(RELAY1, LOW );
    digitalWrite(RELAY2,HIGH);
    digitalWrite(RELAY3, LOW);
    digitalWrite(RELAY4, LOW);
    digitalWrite(RELAY5, LOW);
    }
    
    // 3 Реле
    if (results.value == 0x6021) 
    {  
    digitalWrite(RELAY1, LOW );
    digitalWrite(RELAY2, LOW);
    digitalWrite(RELAY3,HIGH);
    digitalWrite(RELAY4, LOW);
    digitalWrite(RELAY5, LOW);
    }
    
    // 4  Реле
    if (results.value == 0x1021) 
    {  
    digitalWrite(RELAY1, LOW );
    digitalWrite(RELAY2, LOW);
    digitalWrite(RELAY3, LOW);
    digitalWrite(RELAY4, HIGH);
    digitalWrite(RELAY5, LOW);
    }
   // 5  Реле
    if (results.value == 0x5021) 
    {  
    digitalWrite(RELAY1, LOW );
    digitalWrite(RELAY2, LOW);
    digitalWrite(RELAY3, LOW);
    digitalWrite(RELAY4, LOW);
    digitalWrite(RELAY5, HIGH);
    }
   //Реле включения
     if 
     (results.value == 0x5821) digitalWrite(RELAY6, !digitalRead(RELAY6));                              
 
    
    irrecv.resume(); 
    }
  }