Робот управляемый с любого ИК пульта

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Робот собирается за 10 минут и состоит из следующих деталей

1-Платформа робота

2-Мотор редукторы

3-Заднее колесо

Схема робота простейшая и имеет всего 4 компонента

1-Arduino Nano

2-Драйвер двигателя (Motor Shield)

3-ИК приемник TSOP

4-Любой динамик или звуковой капсуль с сопротивлением не менее 16ом

После сборки приступаем к программированию робота

Для этого сначала кладем библиотеку CyberLib и Remote в папку /libraries/ и заливаем в скетчь



#include <IRremote.h>  
#include <CyberLib.h>
#include <avr/wdt.h> 

#define robot_pins D4_Out; D5_Out; D6_Out; D7_Out
#define robot_go D4_Low; D5_High; D6_High; D7_Low
#define robot_back D4_High; D5_Low; D6_Low; D7_High
#define robot_left  D4_Low; D5_High; D6_Low; D7_Low
#define robot_right D4_Low; D5_Low; D6_High; D7_Low;
#define robot_stop D4_Low; D5_Low; D6_Low; D7_Low

IRrecv irrecv(8);  //вход для ик приемника
decode_results results;  
unsigned long ir_go, ir_back, ir_left, ir_right, ir_stop, ir_tmp;


void setup()  
{  
  robot_pins; //управление мотрами
  D11_Out; //пищалкка
  D15_In;  //вход кнопки
  D15_High;  //включить подтяжку
  robot_stop;
  
  irrecv.enableIRIn(); // включить приемник 
  irrecv.blink13(true);  // включить мигание светодиода при приеме
  
  ProgPush() ; //программирование кнопок
  
  ir_go=ReadEEPROM_Long(0);//прочитать команду из EEPROM 
  ir_back=ReadEEPROM_Long(1);//прочитать команду из EEPROM
  ir_left=ReadEEPROM_Long(2);//прочитать команду из EEPROM
  ir_right=ReadEEPROM_Long(3);//прочитать команду из EEPROM
  ir_stop=ReadEEPROM_Long(4);//прочитать команду из EEPROM   
  
         beep(50,100);
         beep(50,1000); 
         beep(50,500);
         beep(50,300);
         beep(50,500); 
         beep(50,600);
         beep(50,200);
         beep(50,170); 
         beep(50,900);
         beep(50,1000);  

wdt_enable (WDTO_8S);    //Сторожевая собака 8сек.
}  
   
void loop() 
{   Start

   if (irrecv.decode(&results))   //если был сигнал с пульта
     { 
        ir_tmp=results.value;
        
      if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед
        {
          robot_go;
          beep(100,300);
        } else  
        
      if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_back;
          beep(100,400);  
        } else
        
      if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_right;
          beep(100,450);  
        } else   
        
      if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_left;
          beep(100,500);  
        } else         
        
      if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп
        {
         robot_stop; 
         beep(10,300);
         beep(10,400); 
         beep(10,300);
        } 
     irrecv.resume();            //очистить входящий буфер 
     
    } 
  
wdt_reset(); //покормить собаку, что бы она не сбежала    
End }
//////////////////////////////////////////////////////////////////////////////////////////////
void SavePush(uint8_t addr)  //сохранить нажатие кнопки
{
delay_ms(400);  //задержка для крректной работы
       for(uint32_t i=0; i<2000000; i++)//ждем нажатия кнопки пульта
       {
         if (irrecv.decode(&results))   //если был сигнал с пульта
          {                              // то сохраняем результат в EEPROM 
            WriteEEPROM_Long(addr, results.value);            
            break;                  //прервать цикл
          }
         wdt_reset();           //покормить собаку
        }
      delay_ms(100);  
       irrecv.resume();            //очистить входящий буфер
}

void beep(byte dur, word frq)
{
  dur=(1000/frq)*dur;  //расчет длительности бипа
  for(byte i=0; i<dur; i++)
  {
   D11_High; 
   delay_us(frq); 
   D11_Low;
   delay_us(frq);
  } 
}
//////////////////////////////////////////////////////////////////////////////////////////////////
void ProgPush() 
{
if(D15_Read==0)//если кнопка нажата
   {
         beep(30,800); 
          beep(30,900);
         beep(30,1000);
          SavePush(0);  //сохранить первое кодовое значение пульта
         beep(50,800); 
          SavePush(1);  //сохранить второе кодовое значение пульта
         beep(50,900);  
          SavePush(2);  //сохранить третье кодовое значение пульта
         beep(50,850);  
          SavePush(3); //сохранить четвертое кодовое значение пульта
          beep(50,950);  
          SavePush(4);  //сохранить пятое кодовое значение пульта       
         beep(30,1000); 
          beep(30,900);
         beep(30,800);   
   } 
}

Теперь остается привязать кнопки Вашего пульта к командам робота

Для этого потребуется установить перемычку на пин (A1) и GND Arduino и нажать кнопку сброса,
после сброса прозвучит сигнал готовности.
Вы заранее должны выбрать на пульте удобные для управления роботом кнопки. Теперь после сигнала готовности, последовательно нажимайте выбранные Вами кнопки

Порядок назначения кнопок будет такой:
1-вперед
2-назад
3-влево
4-вправо
5-стоп

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

И можете управлять своим роботом

Видео

В следующей статье опишу как использовать оптические энкодеры на этом роботе, управление по Bluetooth и подключение к нему видеокамеры

vvadim
Offline
Зарегистрирован: 23.05.2012

Для кого то готовое решение для игрушки и знакомства с ардуиной. И это ХОРОШО! 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Например для меня.

Я люблю программировать, но не люблю пилить и сверлить. Руки у меня не из того места растут :)

Даже не представляю как можно сделать в домашних условиях диск энкодера?

Если бы не готовая платформа, я бы еще 5 лет готовился бы совершить этот подвиг и наврятли бы совершил :)

А с готовой платформой можно практически сразу приступать к программированию робота

 

triada13
Offline
Зарегистрирован: 04.01.2013

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Всё нормально, но вот такие конструкции

#define robot_stop D4_Low; D5_Low; D6_Low; D7_Low

лучше писать так:

#define robot_stop { D4_Low; D5_Low; D6_Low; D7_Low; }

чтобы не нарваться на проблемы, которые возникнут при написании конструкции типа:

if( code < 0 ) robot_stop;

а потом искать проблему.
Хотя еще и по этой причине всегда пишу:

if( code < 0 )
{
  robot_stop;
}

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Спасибо. 

Я написал код на скорую руку за 1 час и не успел оптимизировать его.

Сейчас смотрю на него и кое что подправил бы. Например сохранение кодов кнопок можно выполнить в цикле for, но вот только нет возможности отредактировать сообщение  в шапке темы

 

triada13
Offline
Зарегистрирован: 04.01.2013

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

carduino.ru
Offline
Зарегистрирован: 06.12.2011







#include <IRremote.h>  
#include <CyberLib.h>
#include <avr/wdt.h> 

#define robot_pins {D4_Out; D5_Out; D6_Out; D7_Out;}
#define robot_go {D4_Low; D5_High; D6_High; D7_Low;}
#define robot_back {D4_High; D5_Low; D6_Low; D7_High;}
#define robot_left  {D4_Low; D5_High; D6_Low; D7_Low;}
#define robot_right {D4_Low; D5_Low; D6_High; D7_Low;}
#define robot_stop {D4_Low; D5_Low; D6_Low; D7_Low;}

IRrecv irrecv(8);  //вход для ик приемника
decode_results results;  
unsigned long ir_go, ir_back, ir_left, ir_right, ir_stop, ir_tmp;


void setup()  
{  
  robot_pins; //управление мотрами
  D11_Out; //пищалкка
  D15_In;  //вход кнопки
  D15_High;  //включить подтяжку
  robot_stop;
  
  irrecv.enableIRIn(); // включить приемник 
  irrecv.blink13(true);  // включить мигание светодиода при приеме
  
  ProgPush() ; //программирование кнопок
  
  ir_go=ReadEEPROM_Long(0);//прочитать команду из EEPROM 
  ir_back=ReadEEPROM_Long(1);//прочитать команду из EEPROM
  ir_left=ReadEEPROM_Long(2);//прочитать команду из EEPROM
  ir_right=ReadEEPROM_Long(3);//прочитать команду из EEPROM
  ir_stop=ReadEEPROM_Long(4);//прочитать команду из EEPROM   
  for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000));
         
 wdt_enable (WDTO_8S);    //Сторожевая собака 8сек.        
}  
   
void loop() 
{   Start

   if (irrecv.decode(&results))   //если был сигнал с пульта
     { 
        ir_tmp=results.value;
        
      if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед
        {
          robot_go;
          beep(100,300);
        } else  
        
      if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_back;
          beep(100,400);  
        } else
        
      if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_right;
          beep(100,450);  
        } else   
        
      if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_left;
          beep(100,500);  
        } else         
        
      if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп
        {
         robot_stop; 
         beep(10,300);
         beep(10,400); 
         beep(10,300);
        } 
     irrecv.resume();            //очистить входящий буфер 
     
    } 
  
wdt_reset(); //покормить собаку, что бы она не сбежала    
End }
//////////////////////////////////////////////////////////////////////////////////////////////
void SavePush(uint8_t addr)  //сохранить нажатие кнопки
{
delay_ms(400);  //задержка для крректной работы
       for(uint32_t i=0; i<2000000; i++)//ждем нажатия кнопки пульта
       {
         if (irrecv.decode(&results))   //если был сигнал с пульта
          {                              // то сохраняем результат в EEPROM 
            WriteEEPROM_Long(addr, results.value);            
            break;                  //прервать цикл
          }
         wdt_reset();           //покормить собаку
        }
      delay_ms(100);  
       irrecv.resume();            //очистить входящий буфер
}
////////////////////////////////////////////////////////////////////////////////////////////////
void beep(byte dur, word frq)
{
  dur=(1000/frq)*dur;  //расчет длительности бипа
  for(byte i=0; i<dur; i++)
  {
   D11_High; 
   delay_us(frq); 
   D11_Low;
   delay_us(frq);
  } 
}
//////////////////////////////////////////////////////////////////////////////////////////////////
void ProgPush() 
{
if(D15_Read==0)//если кнопка нажата
   {
     for(uint8_t i=0; i<5; i++) 
       {
         beep(200, random(100, 1000));
         SavePush(i); //сохранить кодовое значение пульта
       }   
   } 
}   

 

berkyt321
Offline
Зарегистрирован: 09.05.2013

приветствую участников форума. у меня возникла вот такая проблемка в место нано я иполльзую уно на ней нет вывода SPK .По этому я немагу подключить денамик и обучить пульт. Можно как то сделать свето диод для этой цели .Ещё прозьба поподробней описать порядок абучения пульта зарание спосибо запомощ

berkyt321
Offline
Зарегистрирован: 09.05.2013

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

carduino.ru
Offline
Зарегистрирован: 06.12.2011

У меня нет проблем с помехами, работает стабильно. Если что можно питание ИК приемника отфильтровать с помощью резистора 100ом и конденсаторами керамика 0,1мкф и электролит 10мкф 

Можно так же поставить конденсаторы 0,1 мкф на моторы, по 4шт на каждый

berkyt321
Offline
Зарегистрирован: 09.05.2013

первый вариант скандёрами памог спасибо

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Перепрограммировал робота для работы с оптическими энкодерами и детектором препядствий

На видео видно что робот едет синхронизируя вращение колес

Компоненты и Инструкция по сборки робота 

Посмотреть Видео

Код

#include <CyberLib.h>

#define encoders_init D2_In; D3_In; D2_High; D3_High
#define motors_init D4_Out; D5_Out; D6_Out; D7_Out
#define robot_go D4_Low; D5_High; D6_High; D7_Low
#define robot_stop D4_Low; D5_Low; D6_Low; D7_Low
#define robot_left  D4_Low; D5_High; D6_Low; D7_Low
#define robot_right D4_Low; D5_Low; D6_High; D7_Low
#define robot_rotation_left D4_Low; D5_High; D6_Low; D7_High

#define size_buff 5 //размер массива sensor
uint16_t sensor[size_buff]; //массив для хранения замеров дальномера
volatile int8_t course=0;

void setup()  
{
  motors_init;  //инициализация выходов моторов
  encoders_init;  //инициализация входов Энкодеров
  D14_Out; D14_Low; //пин trig ультразвукового сонара
  D15_In; //пин echo  ультразвукового сонара
  for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000)); //звуковое оповещение готовности робота
  IntOn();  //включить прерывания
  robot_go;  //поехали!!!
}

void loop()
{Start   
      uint16_t dist=GetDistance(); //делаем замер 
      if( dist < 38)  Rotation(); //если дистанция меньше 38см
      if( dist > 37 && course==0)  robot_go;
End;}

//***************************************************
void  MotorL()  // обработка внешнего прерывания левое колесо
{ 
  course--; 
  if(course > 0) { robot_left; }else{ robot_right;}
}  

void  MotorR()  // обработка внешнего прерывания правое колесо
{
   course++; 
   if(course < 0){ robot_right; }else{ robot_left;}
} 
//*************************************************** 
uint16_t GetDistance() 
{
 uint16_t dist;
 for (uint8_t i = 0; i < size_buff; ++i) //производим несколько замеров
  { 
  D14_High; delay_us(10);  D14_Low;  //запустить измерение
   dist = pulseIn(15,HIGH); //считываем длительность времени прохождения эха 
   delay_ms((50000-dist)/1000); //задержка между посылками
   sensor[i]=dist;
  }
  dist=(find_similar(sensor, size_buff, 58))/58; // //фильтруем показания датчика и переводим в см
  return dist;
} 
//*************************************************** 
void Rotation()
{  
                IntOff();
                robot_rotation_left;
                delay_ms(180);
                robot_stop; 
                course=0; 
                IntOn();  
}   

//*************************************************** 
void IntOn()
{
  attachInterrupt(0, MotorL, RISING);  // настроить срабатывание прерывания interrupt0 pin 2 по перерпапду с низкого (Low) на высокий(HIGH)
  attachInterrupt(1, MotorR, RISING);  // настроить срабатывание прерывания interrupt1 pin 3 по перерпапду с низкого (Low) на высокий(HIGH) 
}

void IntOff()
{
  detachInterrupt(0);  // отключить срабатывание прерывания interrupt0
  detachInterrupt(1);  // отключить срабатывание прерывания interrupt1
} 
//*************************************************** 
void beep(byte dur, word frq)
{
  dur=(1000/frq)*dur;  //расчет длительности бипа
  for(byte i=0; i<dur; i++)
  {
    D11_High; 
    delay_us(frq); 
    D11_Low;
    delay_us(frq);
  } 
} 

 

rischat
Offline
Зарегистрирован: 08.08.2013

Запрограммировал ИК пульт вашей программой (сообщение №7), но при нажатии клавиш пульта выдаются случайные команды. В чем загвоздка? 

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012
/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
Розетки, Управление любым ИК пультом, (программируемые на лету)
socket IR remote control
1/6 Управление Arduino с ИК пульта - начало http://www.youtube.com/watch?v=PjR9jlP4644
*/
#include <IRremote.h> //это скачанная библиотека

/* Скачать библиотеку 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... 
*/

unsigned long Value1 = 0xEE008FC0; // переменная для хранения кода кнопки пульта
/* ВАЖНО !!! (EE008FC0 ) это код кнопки - моего пульта - у вашего пульта будет другой код - замените на свой 
4/6 как ? узнать код - кнопки своего пульта  http://www.youtube.com/watch?v=InZuGntH_wk
*/

int RECV_PIN =11; //вход ИК приемника
int butpin = 10; //можно подать положительный сигнал на пин 10  для начала программирования (как альтернатива программирования на лету с пульта)
int ledpin[] = {2, 3, 4, 5, 6, 7, 8, 9}; // номера задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int ledstate[] = {0, 0, 0, 0, 0, 0, 0, 0}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int butrec = 0;
long prevcode[] = {1, 1, 1, 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 <= 8; i++){   // цифру 8 и все восьмёрки ниже заменяем на цифру задействованных пинов (по желанию)
    pinMode(ledpin[i],OUTPUT);
  }
  for (int i=0; i <= 8; i++){  
  }
  pinMode(butpin, INPUT); 
  irrecv.enableIRIn();
}
void loop()
{
 if(results.value == Value1)digitalWrite(butpin, HIGH);digitalWrite(butpin, LOW); // кнопкой от пульта запускаем режим программируемые на лету
{
  if (irrecv.decode(&results)){
    delay(150);
    for(int i=0; i<8; i++)    
      if (results.value == prevcode[i]){
        ledstate[i] = !ledstate[i];
        digitalWrite(ledpin[i], ledstate[i]);        
      }
    irrecv.resume();
  }
  butrec = digitalRead(butpin);
  if (butrec == HIGH){
    for (int i=0; i<8; i++){      
      ledstate[i] = 0;
      digitalWrite(ledpin[i], ledstate[i]);     
    }
    timeEx = millis() - prevM1;
    for (int i=0; i<8; 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);

    }
  }
}}
/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
 v.03 Розетки, Управление любым ИК пультом, (программируемые на лету)
 socket IR remote control 
Version 0.3 2013/06/29
====================================
идеология;
Для начала программирования розеток, нажимаем на заранее прописанную в скетче кнопку пульта, ИЛИ нажимаем физический кнопку на Arduino, запускается режим программирования,  последовательным нажатием на кнопки пульта мы программируем 8 розеток. Arduino Запоминает эти кнопки пульта. 
Далее мы можем управлять розетками, тем пультом котором мы программировали.
====================================
 
 изменение:
 1. Добавлена возможность самостоятельно прописывать коды кнопок своего пульта
 2. Кнопку butpin перенес с пин 10 на пин 14 (A0). Соседство с 9 пином иногда
 приводило к ложному срабатыванию. 
 Кнопкой этой я вообще не пользуюсь, заменил ее сигналом от ИК пульта
 // unsigned long Value100 = 0xEE008FD4;
 // if(results.value == Value100)digitalWrite(butpin, HIGH);digitalWrite(butpin, LOW);
 3. Добавил возможность включения сразу всех, и выключения сразу всех задействованных пинов
 
 ********************************************************************************
подробную видео инструкцию выложу здесь
v.03 Arduino Розетки, Управление любым ИК пультом (программируемые на лету) socket IR remote control 
https://www.youtube.com/watch?v=Hwd4KgZiKpg
=======================================
 Скачать sketch
 v.03 Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
 http://yadi.sk/d/S6J5iPPx6pZeA
***********************************

 v.01 Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
 http://www.youtube.com/watch?v=Nx6DUQ7Tx1w
 
 1/6 Управление Arduino с ИК пульта - начало http://www.youtube.com/watch?v=PjR9jlP4644
 
 4/6 как ? узнать код - кнопки своего пульта  http://www.youtube.com/watch?v=InZuGntH_wk
 
 Скачать библиотеку 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... 
 
 
 */

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

int RECV_PIN = 11; //вход ИК приемника

IRrecv irrecv(RECV_PIN);

decode_results results;


unsigned long Value100 = 0xEE008FC0; // переменная для хранения кода кнопки пульта

//Этот блог дает возможность физический прописывать коды кнопок своего пульта
// (как альтернатива программирования на лету с пульта)
// ВАЖНО !!! (1000809) это код кнопки - моего пульта - у вашего пульта будет другой код - замените на свой 

unsigned long Value2 = 0x1000809;
unsigned long Value3 = 0x1008889;
unsigned long Value4 = 0x1004849;
unsigned long Value5 = 0x100C8C9;
unsigned long Value6 = 0x1002829;
unsigned long Value7 = 0x100A8A9;
unsigned long Value8 = 0x1006869;
unsigned long Value9 = 0x100E8E9;
unsigned long Value10 = 0x1001819;
unsigned long Value0 = 0x1009899;


unsigned long Value11 = 0x180C041;
unsigned long Value12 = 0x180A021;
unsigned long Value13 = 0x1801091;
unsigned long Value14 = 0x1809011;
unsigned long Value15 = 0x1000E0F;
unsigned long Value16 = 0x1008E8F;
unsigned long Value17 = 0x1004E4F;
unsigned long Value18 = 0x100CECF;




//можно подать положительный сигнал на пин 14 (A0)  для начала программирования 
//(как альтернатива начала программирования на лету с пульта)//unsigned long Value100 = 0xEE008FD4;

int butpin = 14;


//Даем имена пинам
int pultpin2 = 2;
int pultpin3 = 3;
int pultpin4 = 4;
int pultpin5 = 5;
int pultpin6 = 6;
int pultpin7 = 7;
int pultpin8 = 8;
int pultpin9 = 9;
//***

int ledpin[] = {
  2, 3, 4, 5, 6, 7, 8, 9}; // номера задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int ledstate[] = {
  0, 0, 0, 0, 0, 0, 0, 0}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int butrec = 0;
long prevcode[] = {
  1, 1, 1, 1, 1, 1, 1, 1}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
long prevM = 0;
long prevM1 = 0;
long timeEx = 0;
boolean expr = true;

void setup()


{
  for (int i=0; i <= 8; i++){   // цифру 8 и все восьмёрки ниже заменяем на цифру задействованных пинов (по желанию)
    pinMode(ledpin[i],OUTPUT);
  }
  for (int i=0; i <= 8; i++){  
  }
  pinMode(butpin, INPUT); 
  digitalWrite(butpin, LOW);



  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);


  {
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver. включить приемник
  }
}

void loop()


{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }


  {
    if (irrecv.decode(&results)) {
      Serial.println(results.value, HEX);
    }
  }


  {
    if(results.value == Value100)digitalWrite(butpin, HIGH);
    digitalWrite(butpin, LOW); // кнопкой от пульта запускаем режим программируемые на лету





    //Управляем с заранее записанных кодов кнопок своего пульта
    //unsigned long Value2 = 0xF7283C77;


    if(results.value == Value2)digitalWrite(pultpin2, HIGH);
    if(results.value == Value3)digitalWrite(pultpin3, HIGH);
    if(results.value == Value4)digitalWrite(pultpin4, HIGH);
    if(results.value == Value5)digitalWrite(pultpin5, HIGH);
    if(results.value == Value6)digitalWrite(pultpin6, HIGH);
    if(results.value == Value7)digitalWrite(pultpin7, HIGH);
    if(results.value == Value8)digitalWrite(pultpin8, HIGH);
    if(results.value == Value9)digitalWrite(pultpin9, HIGH);


    if(results.value == Value10)digitalWrite(pultpin2, LOW);
    if(results.value == Value0)digitalWrite(pultpin3, LOW);
    if(results.value == Value11)digitalWrite(pultpin4, LOW);
    if(results.value == Value12)digitalWrite(pultpin5, LOW);
    if(results.value == Value13)digitalWrite(pultpin6, LOW);
    if(results.value == Value14)digitalWrite(pultpin7, LOW);
    if(results.value == Value15)digitalWrite(pultpin8, LOW);
    if(results.value == Value16)digitalWrite(pultpin9, LOW);


    //вКлючаем все 
    if(results.value == Value17)digitalWrite(pultpin9, HIGH)
      ,digitalWrite(pultpin2, HIGH),digitalWrite(pultpin3, HIGH)
        ,digitalWrite(pultpin4, HIGH),digitalWrite(pultpin5, HIGH)
          ,digitalWrite(pultpin6, HIGH),digitalWrite(pultpin7, HIGH)
            ,digitalWrite(pultpin8, HIGH),digitalWrite(pultpin9, HIGH);

    //вЫключаем все
    if(results.value == Value18)digitalWrite(pultpin9, LOW)
      ,digitalWrite(pultpin2, LOW),digitalWrite(pultpin3, LOW)
        ,digitalWrite(pultpin4, LOW),digitalWrite(pultpin5, LOW)
          ,digitalWrite(pultpin6, LOW),digitalWrite(pultpin7, LOW)
            ,digitalWrite(pultpin8, LOW),digitalWrite(pultpin9, LOW);







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

      }
      butrec = digitalRead(butpin);
      if (butrec == HIGH){
        for (int i=0; i<8; i++){      
          ledstate[i] = 0;
          digitalWrite(ledpin[i], ledstate[i]);     
        }
        timeEx = millis() - prevM1;
        for (int i=0; i<8; i++){
          expr = true;
          timeEx = 0;
          prevM1 = millis();   
          // < 5000)время ожидания сигнала с пульта, для перехода к следующему пину (в момент программирования)              
          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);

        }
      }
    }
  }
}

Для начала программирования розеток, нажимаем на заранее прописанную в скетче кнопку пульта, ИЛИ нажимаем физический кнопку на Arduino, запускается режим программирования, последовательным нажатием на кнопки пульта мы программируем 8 розеток. Arduino Запоминает эти кнопки пульта. Далее мы можем управлять розетками, тем пультом котором мы программировали.

Kolchugin
Offline
Зарегистрирован: 15.12.2013

Добрый день.

Я новичок, по этому сильно не пинайте. Для начала фотография (чтобы понимание было)

Ардуино UNO и моторшилд. В программу добавил библиотеку AFMotor. ИК-приёмник переподключил на пин А0, бипер -  на пин D10, т.к. сервы не используются и этот контакт не занят. Кнопка ИК программирования осталась на А1.

Теперь программа:





















#include <IRremote.h>  
#include <CyberLib.h>
#include <avr/wdt.h> 
#include <AFMotor.h>

AF_DCMotor motorA(2);
AF_DCMotor motorB(3);

#define robot_go{motorA.run(FORWARD);motorB.run(FORWARD);}
#define robot_back{motorA.run(BACKWARD);motorB.run(BACKWARD);}
#define robot_left{motorA.run(FORWARD);motorB.run(BACKWARD);}
#define robot_right{motorA.run(BACKWARD);motorB.run(FORWARD);}
#define robot_stop{motorA.run(RELEASE);motorB.run(RELEASE);}

IRrecv irrecv(14);  //вход для ик приемника
decode_results results;  
unsigned long ir_go, ir_back, ir_left, ir_right, ir_stop, ir_tmp;


void setup()  
{  

  D10_Out; //пищалкка
  D15_In;  //вход кнопки
  D15_High;  //включить подтяжку
  irrecv.enableIRIn(); // включить приемник 
  irrecv.blink13(true);  // включить мигание светодиода при приеме
 
  motorA.setSpeed(255);
  motorA.run(RELEASE);
  motorB.setSpeed(255);
  motorB.run(RELEASE);
  
  ProgPush() ; //программирование кнопок
  
  ir_go=ReadEEPROM_Long(0);//прочитать команду из EEPROM 
  ir_back=ReadEEPROM_Long(1);//прочитать команду из EEPROM
  ir_left=ReadEEPROM_Long(2);//прочитать команду из EEPROM
  ir_right=ReadEEPROM_Long(3);//прочитать команду из EEPROM
  ir_stop=ReadEEPROM_Long(4);//прочитать команду из EEPROM   
  for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000));
         
 wdt_enable (WDTO_8S);    //Сторожевая собака 8сек.        
}  
   
void loop() 
{   Start

   if (irrecv.decode(&results))   //если был сигнал с пульта
     { 
        ir_tmp=results.value;
        
      if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед
        {
          robot_go;
          beep(100,300);
        } else  
        
      if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_back;
          beep(100,400);  
        } else
        
      if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_right;
          beep(100,450);  
        } else   
        
      if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          robot_left;
          beep(100,500);  
        } else         
        
      if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп
        {
         robot_stop; 
         beep(10,300);
         beep(10,400); 
         beep(10,300);
        } 
     irrecv.resume();            //очистить входящий буфер 
     
    } 
  
wdt_reset(); //покормить собаку, что бы она не сбежала    
End }
//////////////////////////////////////////////////////////////////////////////////////////////
void SavePush(uint8_t addr)  //сохранить нажатие кнопки
{
delay_ms(400);  //задержка для крректной работы
       for(uint32_t i=0; i<2000000; i++)//ждем нажатия кнопки пульта
       {
         if (irrecv.decode(&results))   //если был сигнал с пульта
          {                              // то сохраняем результат в EEPROM 
            WriteEEPROM_Long(addr, results.value);            
            break;                  //прервать цикл
          }
         wdt_reset();           //покормить собаку
        }
      delay_ms(100);  
       irrecv.resume();            //очистить входящий буфер
}
////////////////////////////////////////////////////////////////////////////////////////////////
void beep(byte dur, word frq)
{
  dur=(1000/frq)*dur;  //расчет длительности бипа
  for(byte i=0; i<dur; i++)
  {
   D10_High; 
   delay_us(frq); 
   D10_Low;
   delay_us(frq);
  } 
}
//////////////////////////////////////////////////////////////////////////////////////////////////
void ProgPush() 
{
if(D15_Read==0)//если кнопка нажата
   {
     for(uint8_t i=0; i<5; i++) 
       {
         beep(200, random(100, 1000));
         SavePush(i); //сохранить кодовое значение пульта
       }   
   } 
}   

 

То есть программа не изменилась, лишь изменились переменные для библиотеки AFMotor.

А теперь такая проблема. На мотор шилде две L293D. Одна управляет М1 и М2, вторая М3 и М4. Чтобы микросхемы меньше грелись, я решил раскидать моторы на М2 и М3.  Но при таком раскладе  работает только М3. Если в программе прописать:

 AF_DCMotor motorA(3)                                                                                                                                                  AF_DCMotor motorB(4) 

ну и соответсвенно переподключить моторы на эти контакты - то всё прекрасно работает. Если запрограммировать М1 и М2 - то не работает (при соответсвующем подключении). 

Сначала подумал, что может быть не исправна L293D которая управляет М1 и М2, но при таком коде работают все моторы:



















#include <AFMotor.h> 
 
AF_DCMotor motor1(1);  
AF_DCMotor motor2(2);  
AF_DCMotor motor3(3); 
AF_DCMotor motor4(4); 
  

void setup() { 
 
motor1.setSpeed(255); 
motor2.setSpeed(255); 
motor3.setSpeed(255); 
motor4.setSpeed(255); 

}

void loop() { 
  
motor1.run(FORWARD); 
motor2.run(FORWARD); 
motor3.run(FORWARD); 
motor4.run(FORWARD); 

}

 

Kolchugin
Offline
Зарегистрирован: 15.12.2013

Вопрос снимается, ответ нашёл здесь на форуме (конфликт библиотек)

gega
Offline
Зарегистрирован: 27.01.2015

[quote=carduino.ru]

два вопроса новичка! 

1. подходит ли код на ардуино уно

2. в каой пин на уно подключить спикер?

gega
Offline
Зарегистрирован: 27.01.2015

по спикеру не актуально, по коду д11

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

gega
Offline
Зарегистрирован: 27.01.2015

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

carduino.ru
Offline
Зарегистрирован: 06.12.2011

gega]</p> <p>[quote=carduino.ru пишет:

два вопроса новичка! 

1. подходит ли код на ардуино уно

2. в каой пин на уно подключить спикер?

1-Подойдет

2-на D11, но желательно через транзистор

carduino.ru
Offline
Зарегистрирован: 06.12.2011

gega пишет:

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

убери из кода строки 

wdt_enable (WDTO_8S);

и 

wdt_reset();

Возможно что у тебя прошивка не поддерживает работу с WDT

anarhist1
Offline
Зарегистрирован: 04.06.2016

Добрый день!

Требуется помощь форумчан. Собрал робота на ардуино уно _ мотор шилд  Motor Shield V1 для Arduino. + плата расширения. Все это бутербродом собрано. На моторшилд напаял гнезда для проводов как и на ардуино уно и все собрал одним бутербродам. 

Код

#include <IRremote.h> 
#include <IRremote.h> 
#include <CyberLib.h>
#include <avr/wdt.h>
#include <AFMotor.h>

AF_DCMotor motorA(1);
AF_DCMotor motorB(2);
AF_DCMotor motorC(3);
AF_DCMotor motorD(4);

#define robot_go {motorA.run(FORWARD);motorB.run(FORWARD);motorC.run(FORWARD);motorD.run(FORWARD);}
#define robot_back {motorA.run(BACKWARD);motorB.run(BACKWARD);motorC.run(BACKWARD);motorD.run(BACKWARD);}
#define robot_left {motorA.run(FORWARD);motorB.run(BACKWARD);motorC.run(FORWARD);motorD.run(BACKWARD);}
#define robot_right {motorA.run(BACKWARD);motorB.run(FORWARD);motorC.run(BACKWARD);motorD.run(FORWARD);}
#define robot_stop {motorA.run(RELEASE);motorB.run(RELEASE);motorC.run(RELEASE);motorD.run(RELEASE);}

IRrecv irrecv(3);  //вход для ик приемника
decode_results results; 

unsigned long ir_go, ir_back, ir_left, ir_right, ir_stop, ir_tmp;


void setup() 
{ 

  irrecv.enableIRIn(); // включить приемник
  irrecv.blink13(true);  // включить мигание светодиода при приеме
  D15_High;  //включить подтяжку
  D10_Out; //пищалкка

  motorA.setSpeed(255);
  motorA.run(RELEASE);
  motorB.setSpeed(255);
  motorB.run(RELEASE);
  motorC.setSpeed(255);
  motorC.run(RELEASE);
  motorD.setSpeed(255);
  motorD.run(RELEASE);
   
  ProgPush() ; //программирование кнопок

ir_go=ReadEEPROM_Long(0);//прочитать команду из EEPROM
ir_back=ReadEEPROM_Long(1);//прочитать команду из EEPROM
ir_left=ReadEEPROM_Long(2);//прочитать команду из EEPROM
ir_right=ReadEEPROM_Long(3);//прочитать команду из EEPROM
ir_stop=ReadEEPROM_Long(4);//прочитать команду из EEPROM  

  for(uint8_t i=0; i<12; i++) beep(50, random(100, 1000));

 wdt_enable (WDTO_8S);    //Сторожевая собака 8сек.       
} 

void loop()
{   Start

 if (irrecv.decode(&results))   //если был сигнал с пульта
   {
  ir_tmp=results.value;

   if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед

        {

          robot_go;
          beep(100,300);

        } else 

         

      if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад

        {

          robot_back;
          beep(100,400); 
          

        } else

         

      if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад

        {

          robot_right;
          beep(100,450); 
          

        } else  

         

      if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад

        {

          robot_left;
          beep(100,500);          

        } else        

         

      if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп

        {

         robot_stop;
         beep(10,300);
         beep(10,400);
         beep(10,300);

        }

     irrecv.resume();            //очистить входящий буфер

      

    }

   

wdt_reset(); //покормить собаку, что бы она не сбежала   

End }

//////////////////////////////////////////////////////////////////////////////////////////////

void SavePush(uint8_t addr)  //сохранить нажатие кнопки

{

delay_ms(400);  //задержка для крректной работы

       for(uint32_t i=0; i<2000000; i++)//ждем нажатия кнопки пульта

       {

         if (irrecv.decode(&results))   //если был сигнал с пульта

          {                              // то сохраняем результат в EEPROM

            WriteEEPROM_Long(addr, results.value);           

            break;                  //прервать цикл

          }

         wdt_reset();           //покормить собаку

        }

      delay_ms(100); 

       irrecv.resume();            //очистить входящий буфер

}

////////////////////////////////////////////////////////////////////////////////////////////////

void beep(byte dur, word frq)

{

  dur=(1000/frq)*dur;  //расчет длительности бипа

  for(byte i=0; i<dur; i++)

  {

   D10_High;

   delay_us(frq);

   D10_Low;

   delay_us(frq);

  }

}

//////////////////////////////////////////////////////////////////////////////////////////////////

void ProgPush()

{

if(D15_Read==0)//если кнопка нажата

   {

     for(uint8_t i=0; i<5; i++)

       {

         beep(200, random(100, 1000));

         SavePush(i); //сохранить кодовое значение пульта

       }  

   }

}
 

Ничем особо не отличается, но один мотор не крутится AF_DCMotor motorC(3);. В чем может быть проблема? Где моя ошибка?

 
saund
saund аватар
Offline
Зарегистрирован: 20.10.2016

Добрый день или ночи

возможноли добавить в скеч чтобы при включении пин3 и пи4 мигали а 5 пин срабатывал на удержание

плиз очень надо!

#include <IRremote.h> // это скачанная библиотека
048  
049 int RECV_PIN = 11; //вход ИК приемника
050  
051 IRrecv irrecv(RECV_PIN);
052  
053 decode_results results;
054  
055  
056 unsigned long Value100 = 0xEE008FC0; // переменная для хранения кода кнопки пульта
057  
058 //Этот блог дает возможность физический прописывать коды кнопок своего пульта
059 // (как альтернатива программирования на лету с пульта)
060 // ВАЖНО !!! (1000809) это код кнопки - моего пульта - у вашего пульта будет другой код - замените на свой
061  
062 unsigned long Value2 = 0x1000809;
063 unsigned long Value3 = 0x1008889;
064 unsigned long Value4 = 0x1004849;
065 unsigned long Value5 = 0x100C8C9;
066 unsigned long Value6 = 0x1002829;
067 unsigned long Value7 = 0x100A8A9;
068 unsigned long Value8 = 0x1006869;
069 unsigned long Value9 = 0x100E8E9;
070 unsigned long Value10 = 0x1001819;
071 unsigned long Value0 = 0x1009899;
072  
073  
074 unsigned long Value11 = 0x180C041;
075 unsigned long Value12 = 0x180A021;
076 unsigned long Value13 = 0x1801091;
077 unsigned long Value14 = 0x1809011;
078 unsigned long Value15 = 0x1000E0F;
079 unsigned long Value16 = 0x1008E8F;
080 unsigned long Value17 = 0x1004E4F;
081 unsigned long Value18 = 0x100CECF;
082  
083  
084  
085  
086 //можно подать положительный сигнал на пин 14 (A0)  для начала программирования
087 //(как альтернатива начала программирования на лету с пульта)//unsigned long Value100 = 0xEE008FD4;
088  
089 int butpin = 14;
090  
091  
092 //Даем имена пинам
093 int pultpin2 = 2;
094 int pultpin3 = 3;
095 int pultpin4 = 4;
096 int pultpin5 = 5;
097 int pultpin6 = 6;
098 int pultpin7 = 7;
099 int pultpin8 = 8;
100 int pultpin9 = 9;
101 //***
102  
103 int ledpin[] = {
104   2, 3, 4, 5, 6, 7, 8, 9}; // номера задействованных пинов, количество можно уменьшить или увеличить (по желанию)
105 int ledstate[] = {
106   0, 0, 0, 0, 0, 0, 0, 0}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
107 int butrec = 0;
108 long prevcode[] = {
109   1, 1, 1, 1, 1, 1, 1, 1}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
110 long prevM = 0;
111 long prevM1 = 0;
112 long timeEx = 0;
113 boolean expr = true;
114  
115 void setup()
116  
117  
118 {
119   for (int i=0; i <= 8; i++){   // цифру 8 и все восьмёрки ниже заменяем на цифру задействованных пинов (по желанию)
120     pinMode(ledpin[i],OUTPUT);
121   }
122   for (int i=0; i <= 8; i++){ 
123   }
124   pinMode(butpin, INPUT);
125   digitalWrite(butpin, LOW);
126  
127  
128  
129   pinMode(2, OUTPUT);
130   pinMode(3, OUTPUT);
131   pinMode(4, OUTPUT);
132   pinMode(5, OUTPUT);
133   pinMode(6, OUTPUT);
134   pinMode(7, OUTPUT);
135   pinMode(8, OUTPUT);
136   pinMode(9, OUTPUT);
137  
138  
139   {
140     Serial.begin(9600);
141     irrecv.enableIRIn(); // Start the receiver. включить приемник
142   }
143 }
144  
145 void loop()
146  
147  
148 {
149   if (irrecv.decode(&results)) {
150     Serial.println(results.value, HEX);
151     irrecv.resume(); // Receive the next value
152   }
153  
154  
155   {
156     if (irrecv.decode(&results)) {
157       Serial.println(results.value, HEX);
158     }
159   }
160  
161  
162   {
163     if(results.value == Value100)digitalWrite(butpin, HIGH);
164     digitalWrite(butpin, LOW); // кнопкой от пульта запускаем режим программируемые на лету
165  
166  
167  
168  
169  
170     //Управляем с заранее записанных кодов кнопок своего пульта
171     //unsigned long Value2 = 0xF7283C77;
172  
173  
174     if(results.value == Value2)digitalWrite(pultpin2, HIGH);
175     if(results.value == Value3)digitalWrite(pultpin3, HIGH);
176     if(results.value == Value4)digitalWrite(pultpin4, HIGH);
177     if(results.value == Value5)digitalWrite(pultpin5, HIGH);
178     if(results.value == Value6)digitalWrite(pultpin6, HIGH);
179     if(results.value == Value7)digitalWrite(pultpin7, HIGH);
180     if(results.value == Value8)digitalWrite(pultpin8, HIGH);
181     if(results.value == Value9)digitalWrite(pultpin9, HIGH);
182  
183  
184     if(results.value == Value10)digitalWrite(pultpin2, LOW);
185     if(results.value == Value0)digitalWrite(pultpin3, LOW);
186     if(results.value == Value11)digitalWrite(pultpin4, LOW);
187     if(results.value == Value12)digitalWrite(pultpin5, LOW);
188     if(results.value == Value13)digitalWrite(pultpin6, LOW);
189     if(results.value == Value14)digitalWrite(pultpin7, LOW);
190     if(results.value == Value15)digitalWrite(pultpin8, LOW);
191     if(results.value == Value16)digitalWrite(pultpin9, LOW);
192  
193  
194     //вКлючаем все
195     if(results.value == Value17)digitalWrite(pultpin9, HIGH)
196       ,digitalWrite(pultpin2, HIGH),digitalWrite(pultpin3, HIGH)
197         ,digitalWrite(pultpin4, HIGH),digitalWrite(pultpin5, HIGH)
198           ,digitalWrite(pultpin6, HIGH),digitalWrite(pultpin7, HIGH)
199             ,digitalWrite(pultpin8, HIGH),digitalWrite(pultpin9, HIGH);
200  
201     //вЫключаем все
202     if(results.value == Value18)digitalWrite(pultpin9, LOW)
203       ,digitalWrite(pultpin2, LOW),digitalWrite(pultpin3, LOW)
204         ,digitalWrite(pultpin4, LOW),digitalWrite(pultpin5, LOW)
205           ,digitalWrite(pultpin6, LOW),digitalWrite(pultpin7, LOW)
206             ,digitalWrite(pultpin8, LOW),digitalWrite(pultpin9, LOW);
207  
208  
209  
210  
211  
212  
213  
214     {
215       if (irrecv.decode(&results)){
216         delay(150);
217         for(int i=0; i<8; i++)   
218           if (results.value == prevcode[i]){
219             ledstate[i] = !ledstate[i];
220             digitalWrite(ledpin[i], ledstate[i]);       
221           }
222  
223       }
224       butrec = digitalRead(butpin);
225       if (butrec == HIGH){
226         for (int i=0; i<8; i++){     
227           ledstate[i] = 0;
228           digitalWrite(ledpin[i], ledstate[i]);    
229         }
230         timeEx = millis() - prevM1;
231         for (int i=0; i<8; i++){
232           expr = true;
233           timeEx = 0;
234           prevM1 = millis();  
235           // < 5000)время ожидания сигнала с пульта, для перехода к следующему пину (в момент программирования)             
236           while (expr == true && timeEx < 5000){    
237             timeEx = millis() - prevM1;
238             if (millis() - prevM > 250){          
239               prevM = millis();
240               int ledstate1 = !ledstate1;
241               digitalWrite(ledpin[i], ledstate1);
242             }                                     
243             if (irrecv.decode(&results)) {        
244               delay(150);
245               prevcode[i] = results.value;
246               irrecv.resume();
247               expr = !expr;
248               prevM1 = millis();
249  
250             }                                     
251           }
252  
253           digitalWrite(ledpin[i], LOW);
254  
255         }
256       }
257     }
258   }
259 }

 

saund
saund аватар
Offline
Зарегистрирован: 20.10.2016

Здарова!парни подскажите как правильно подать тему чтобы умы сего форума помогли я новичёк и с ардуино

и написанием скеча несправляюсь!нужна помощ в написании скеча плиз!

задача вкл выкл 8и светодиодов

пин2 вкл выкл с пульта одной кнопка1 код кнопки/ FD00FF

пин3вкл мигание выкл с пульта кнопка 2/ FD807F

пин4вкл мигание выкл с пульта кнопка 3/FD40BF

пин5вкл при удержании выкл 4/ FD20DF

пин6вкл при удержании выкл 5/ FDA05F

пин7вкл выкл с кнопки6/ FD609F

пин8вкл выкл с кнопки7/ FD10EF

пин9вкл выкл с кнопки8/ FDB04F