Motor Shield v3 подключение TSOP

nikola
Offline
Зарегистрирован: 24.01.2013

 

Помогите разобраться пожалуйсто.Купил Motor Shield v3 подключил к Ардуино Uno залил приложенный внизу скетч мониторинг порта выводит все действия, но мотор не запускается.Почему?
// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
 
#include <AFMotor.h>
#include <IRremote.h>
 
int RECV_PIN = 14;
 
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
 
AF_DCMotor motor(1);
 
void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");
irrecv.enableIRIn(); // Start the receiver
  // turn on motor
  motor.setSpeed(200);
 
  motor.run(RELEASE);
}
 
void loop() {
   if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
   if (results.value == 0xFFDA25){ 
  
  
  uint8_t i;
  Serial.print("tick");
  
  motor.run(FORWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  
  Serial.print("tock");
 
  motor.run(BACKWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  
 
  Serial.print("tech");
  motor.run(RELEASE);
  delay(1000);}
  irrecv.resume(); // Receive the next value
   }
}
 
maksim
Offline
Зарегистрирован: 12.02.2012

Причин может быть много. И почему вы решили что дело к коде, выбрав этот раздел форума...

0. Что за шилд? Описание на него есть? Они разные бывают.
1. Вы внешнее питание к шилду подключили? 
2. Куда подключили?
3. Что за мотор?
4. Куда мотор подключили?

Так же посмотрите как правильно всталять код в сообщение.

nikola
Offline
Зарегистрирован: 24.01.2013

написал же Motor Shield v3 

подключил движек от какой то радиоуправляемой игрушки к контактам M1.Он работает в тестовом режими скетч которого идет с библиотекой   http://www.ladyada.net/make/mshield/download.html на данный шилд.Питание шилда идет от платы ардуино которая запитана блокм питания 5 V

nikola
Offline
Зарегистрирован: 24.01.2013


// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!

#include <AFMotor.h>
#include <IRremote.h>

int RECV_PIN = 14;


IRrecv irrecv(RECV_PIN);

decode_results results;

AF_DCMotor motor(1);

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");
irrecv.enableIRIn(); // Start the receiver
  // turn on motor
  motor.setSpeed(200);
 
  motor.run(RELEASE);
}

void loop() {
   if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
   if (results.value == 0xFFDA25){ 
  
  
  uint8_t i;
  Serial.print("tick");
  
  motor.run(FORWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  
  Serial.print("tock");

  motor.run(BACKWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  

  Serial.print("tech");
  motor.run(RELEASE);
  delay(1000);}
  irrecv.resume(); // Receive the next value
   }
}


// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!

#include <AFMotor.h>
#include <IRremote.h>

int RECV_PIN = 14;


IRrecv irrecv(RECV_PIN);

decode_results results;

AF_DCMotor motor(1);

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");
irrecv.enableIRIn(); // Start the receiver
  // turn on motor
  motor.setSpeed(200);
 
  motor.run(RELEASE);
}

void loop() {
   if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
   if (results.value == 0xFFDA25){ 
  
  
  uint8_t i;
  Serial.print("tick");
  
  motor.run(FORWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  
  Serial.print("tock");

  motor.run(BACKWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  

  Serial.print("tech");
  motor.run(RELEASE);
  delay(1000);}
  irrecv.resume(); // Receive the next value
   }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

 

nikola пишет:

написал же Motor Shield v3 

подключил движек от какой то радиоуправляемой игрушки к контактам M1.Он работает в тестовом режими скетч которого идет с библиотекой   http://www.ladyada.net/make/mshield/download.html на данный шилд.Питание шилда идет от платы ардуино которая запитана блокм питания 5 V

Arduino Motor Shield V3

Motor Shield v3

А то что у вас на картинке это вообще Motor Shield v2 так что если спрашивают, то не просто так.

Перемычка в каком RWR Sel в каком положении стоит? в Ext или Ard?

 

nikola
Offline
Зарегистрирован: 24.01.2013

в правом

nikola
Offline
Зарегистрирован: 24.01.2013

тестовый режим работает отлично


// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!

#include <AFMotor.h>

AF_DCMotor motor(4);

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");

  // turn on motor
  motor.setSpeed(200);
 
  motor.run(RELEASE);
}

void loop() {
  uint8_t i;
  
  Serial.print("tick");
  
  motor.run(FORWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  
  Serial.print("tock");

  motor.run(BACKWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
 }
 
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
 }
  

  Serial.print("tech");
  motor.run(RELEASE);
  delay(1000);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Значит не работает ИК-приемник или пульт.

nikola
Offline
Зарегистрирован: 24.01.2013

по поводу шилда у меня 3 версия,картинку не ту выложил просто

 

 

nikola
Offline
Зарегистрирован: 24.01.2013

конечно

 

nikola
Offline
Зарегистрирован: 24.01.2013

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

maksim
Offline
Зарегистрирован: 12.02.2012

Так, давайте по порядку - как и куда подключаете ИК приемник и каким пультом пользуетесь?

UPD: вот опять вопрос позже чем ответ.

maksim
Offline
Зарегистрирован: 12.02.2012

Проверьте так работает?

#include <IRremote.h>
#include <AFMotor.h>

AF_DCMotor motor(4);
int RECV_PIN = 14;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  Serial.begin(9600);         
  Serial.println("Motor test!");
  motor.setSpeed(200);
  motor.run(RELEASE);
}

void loop() {
  byte i;
  Serial.print("tick");
  motor.run(FORWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
  }
  Serial.print("tock");
  motor.run(BACKWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
  }
  Serial.print("tech");
  motor.run(RELEASE);
  delay(1000);
}

 

nikola
Offline
Зарегистрирован: 24.01.2013

ик сначало подключил ко второму пину потом уже нерекинул на 14 (аналоговый 0), пульт от проигрывателя mystery MDV-729U.tsop 2238 снять с проигрывателя самсунг подключен к питанию средней ногой 5v, правая нога gnd платы шилда левая соответственно сигнал на 14 пине

maksim
Offline
Зарегистрирован: 12.02.2012

Если работает, то проверьте работает ли так

#include <IRremote.h>
#include <AFMotor.h>

AF_DCMotor motor(4);
int RECV_PIN = 14;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  Serial.begin(9600);         
  Serial.println("Motor test!");
  motor.setSpeed(200);
  motor.run(RELEASE);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  byte i;
  Serial.print("tick");
  motor.run(FORWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
  }
  Serial.print("tock");
  motor.run(BACKWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
  }
  Serial.print("tech");
  motor.run(RELEASE);
  delay(1000);
}
nikola
Offline
Зарегистрирован: 24.01.2013

обычный тестовый режим вот наблюдаю разгон и замедление

maksim
Offline
Зарегистрирован: 12.02.2012

И первый и второй примеры работают?

nikola
Offline
Зарегистрирован: 24.01.2013

я так понимаю разница состоит во включении ик?в этот раз не пошло!

nikola
Offline
Зарегистрирован: 24.01.2013

вот убрал включение ик и работает

AF_DCMotor motor(4); у меня мотор на первомAF_DCMotor motor(1);

maksim
Offline
Зарегистрирован: 12.02.2012

В общем вы были правы, дело именно в программной части, дело в несовместимости библиотек, так как у вас УНО они обе используют TIMER1. Так как обе библиотеки используют 16-битный таймер, а у Уны он один, то просто сменить в одной из библиотек номер таймера думаю не получится, поэтому вам нужно либо отказаться от использования от одной из библиотек, либо найти/переписать библиотеку под 8-битный таймер.

nikola
Offline
Зарегистрирован: 24.01.2013

хм не лучшая перспектива.а в принципе наверно можно напряму обращаться к пинам которые управляют шилдам?я нуб в програмирование и чаще жму ctrl/c/v ))

 

nikola
Offline
Зарегистрирован: 24.01.2013

большое спасибо 

maksim
Offline
Зарегистрирован: 12.02.2012

nikola пишет:

хм не лучшая перспектива.а в принципе наверно можно напряму обращаться к пинам которые управляют шилдам?я нуб в програмирование и чаще жму ctrl/c/v ))

Направление двигателей задается через сдвиговый регистр, а скорость ШИМом (по-моему 9 и 10 вывод), но если вы будете искользовать функцию analogWrite(), то двигатели будут пищать на неполных оборотах, поэтому лучше таймер пожертвовать на управление двигателями. Я бы на вашем месте написал код для демодуляции и дешифровки ИК-сигнала, использовав внешнее прерывание и функцию micros(). Но решать вам, что для вас приорететнее или проще реализуемо.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

При использовании таймера1 пользоваться analogWrite() на этих пинах уже нельзя.

Посмотрел исходники. Для М1 М2 используется TIMER2, для М3 и М4 - TIMER0 (Для случая УНО и подобных, на МЕГЕ - другие) На сколько мне помнится, IRremote использует TIMER2. Так что можно попробовать пользоваться только М3 и М4 и инициализировать пульт после моторов. Ну или заремарить TIMER2 в библиотеке (и все равно забить на М1 и М2)

maksim
Offline
Зарегистрирован: 12.02.2012

Да ,точно, на 9 и 10 выводах воспользоваться функцией analogWrite() не получится, после того как проинициализируете IRremote. Так что лучше еще один аргумент что бы отказаться от библиотеки IRremote.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Да, точно. Посмотрел исходник IRremote - используется TIMER2 и весьма непросто ее переписать на другой таймер. Так что только 2 мотора или один шаговик.

maksim
Offline
Зарегистрирован: 12.02.2012

Действительно, TIMER2
 

#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
  #define IR_USE_TIMER1   // tx = pin 9

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif

хотя всегда думал, что первый.

nikola
Offline
Зарегистрирован: 24.01.2013

Как все сложно.На M(3) заработало.А шаговый только на эти же клемы посадить можно?

nikola
Offline
Зарегистрирован: 24.01.2013

А в принцепи можно как то выключать библиотеку на время а потом включать или я чушь несу?

maksim
Offline
Зарегистрирован: 12.02.2012

Да, шаговик тоже только на М3 и М4.
Попеременно таймер можно использовать, только как это поможет?

nikola
Offline
Зарегистрирован: 24.01.2013

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

 

nikola
Offline
Зарегистрирован: 24.01.2013

отключать именно таймер надо или все же библиотеку?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

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

Так что библиотеки и таймеры не надо отключать, надо "дестроить" объекты, их использующие.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

maksim пишет:

Действительно, TIMER2
 

#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
  #define IR_USE_TIMER1   // tx = pin 9

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif

хотя всегда думал, что первый.

У нас еще и библиотеки разные, у меня жестко timer2. У меня такая:

/*
 * IRremote
 * Version 0.11 August, 2009
 * Copyright 2009 Ken Shirriff
 * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
 *
 * Interrupt code based on NECIRrcv by Joe Knapp
 * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
 * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
 */

 

nikola
Offline
Зарегистрирован: 24.01.2013

то есть при необходимости отключить програмным путем датчик?

 irrecv.enableIRIn(); // Start the receiver

nikola
Offline
Зарегистрирован: 24.01.2013

irrecv.disabledIRIn();\\это отключит ик?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

disabledIRIn() - такой функции нет (я не нашел).

enableIRIn() - как раз захватывает таймер. Да, включит.

nikola
Offline
Зарегистрирован: 24.01.2013

а как тогда его отключить ?

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Да, собственно, никак... Объявляете AF_DCMotor myMotor(1);

и все! Таймер перехвачен. Приемник перестает работать. Точнее, не перестает, но не принимает, потому что настройки таймера уже другие.

maksim
Offline
Зарегистрирован: 12.02.2012

Вот что я нашел в либе IRremote

// defines for timer1 (16 bits)
#elif defined(IR_USE_TIMER1)
#define TIMER_RESET
#define TIMER_ENABLE_PWM     (TCCR1A |= _BV(COM1A1))
#define TIMER_DISABLE_PWM    (TCCR1A &= ~(_BV(COM1A1)))
#if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
  #define TIMER_ENABLE_INTR    (TIMSK = _BV(OCIE1A))
  #define TIMER_DISABLE_INTR   (TIMSK = 0)
#else
  #define TIMER_ENABLE_INTR    (TIMSK1 = _BV(OCIE1A))
  #define TIMER_DISABLE_INTR   (TIMSK1 = 0)
#endif
#define TIMER_INTR_NAME      TIMER1_COMPA_vect
#define TIMER_CONFIG_KHZ(val) ({ \
  const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
  TCCR1A = _BV(WGM11); \
  TCCR1B = _BV(WGM13) | _BV(CS10); \
  ICR1 = pwmval; \
  OCR1A = pwmval / 3; \
})
#define TIMER_CONFIG_NORMAL() ({ \
  TCCR1A = 0; \
  TCCR1B = _BV(WGM12) | _BV(CS10); \
  OCR1A = SYSCLOCK * USECPERTICK / 1000000; \
  TCNT1 = 0; \
})
#if defined(CORE_OC1A_PIN)
#define TIMER_PWM_PIN        CORE_OC1A_PIN  /* Teensy */
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define TIMER_PWM_PIN        11  /* Arduino Mega */
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
#define TIMER_PWM_PIN        13 /* Sanguino */
#else
#define TIMER_PWM_PIN        9  /* Arduino Duemilanove, Diecimila, LilyPad, etc */
#endif

а значит она может работать и с 16-битным таймером.

В общем делаете так - находите файл arduino\libraries\IRremote\IRremoteInt.h, открываете его (например с помощью WordPad), находите строки:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif

и делаете так:

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  #define IR_USE_TIMER1   // tx = pin 9
  //#define IR_USE_TIMER2     // tx = pin 3
#endif

После данных манипуляций перезапускаете ArduinoIDE и пробуете, теперь IRremote должна использовать TIMER1, а AFMotor таймеры TIMER0 и TIMER2.

nikola
Offline
Зарегистрирован: 24.01.2013

не нашел


/*
 * IRremote
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
 *
 * Interrupt code based on NECIRrcv by Joe Knapp
 * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
 * Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
 */

#ifndef IRremoteint_h
#define IRremoteint_h

#include <Arduino.h>

#define CLKFUDGE 5      // fudge factor for clock interrupt overhead
#define CLK 256      // max value for clock (timer 2)
#define PRESCALE 8      // timer2 clock prescale
#define SYSCLOCK 16000000  // main Arduino clock
#define CLKSPERUSEC (SYSCLOCK/PRESCALE/1000000)   // timer clocks per microsecond

#define ERR 0
#define DECODED 1

#define BLINKLED 13

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// clock timer reset value
#define INIT_TIMER_COUNT2 (CLK - USECPERTICK*CLKSPERUSEC + CLKFUDGE)
#define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT2

// pulse parameters in usec
#define NEC_HDR_MARK	9000
#define NEC_HDR_SPACE	4500
#define NEC_BIT_MARK	560
#define NEC_ONE_SPACE	1600
#define NEC_ZERO_SPACE	560
#define NEC_RPT_SPACE	2250

#define SONY_HDR_MARK	2400
#define SONY_HDR_SPACE	600
#define SONY_ONE_MARK	1200
#define SONY_ZERO_MARK	600
#define SONY_RPT_LENGTH 45000

#define RC5_T1		889
#define RC5_RPT_LENGTH	46000

#define RC6_HDR_MARK	2666
#define RC6_HDR_SPACE	889
#define RC6_T1		444
#define RC6_RPT_LENGTH	46000

#define TOLERANCE 25  // percent tolerance in measurements
#define LTOL (1.0 - TOLERANCE/100.) 
#define UTOL (1.0 + TOLERANCE/100.) 

#define _GAP 5000 // Minimum map between transmissions
#define GAP_TICKS (_GAP/USECPERTICK)

#define TICKS_LOW(us) (int) (((us)*LTOL/USECPERTICK))
#define TICKS_HIGH(us) (int) (((us)*UTOL/USECPERTICK + 1))

#ifndef DEBUG
#define MATCH(measured_ticks, desired_us) ((measured_ticks) >= TICKS_LOW(desired_us) && (measured_ticks) <= TICKS_HIGH(desired_us))
#define MATCH_MARK(measured_ticks, desired_us) MATCH(measured_ticks, (desired_us) + MARK_EXCESS)
#define MATCH_SPACE(measured_ticks, desired_us) MATCH((measured_ticks), (desired_us) - MARK_EXCESS)
// Debugging versions are in IRremote.cpp
#endif

// receiver states
#define STATE_IDLE     2
#define STATE_MARK     3
#define STATE_SPACE    4
#define STATE_STOP     5

// information for the interrupt handler
typedef struct {
  uint8_t recvpin;           // pin for IR data from detector
  uint8_t rcvstate;          // state machine
  uint8_t blinkflag;         // TRUE to enable blinking of pin 13 on IR processing
  unsigned int timer;     // state timer, counts 50uS ticks.
  unsigned int rawbuf[RAWBUF]; // raw data
  uint8_t rawlen;         // counter of entries in rawbuf
} 
irparams_t;

// Defined in IRremote.cpp
extern volatile irparams_t irparams;

// IR detector output is active low
#define MARK  0
#define SPACE 1

#define TOPBIT 0x80000000

#define NEC_BITS 32
#define SONY_BITS 12
#define MIN_RC5_SAMPLES 11
#define MIN_RC6_SAMPLES 1

#endif

 

maksim
Offline
Зарегистрирован: 12.02.2012

Скачайте вот эту либу. Только переименуйте папку Arduino-IRremote-master в IRremote.

nikola
Offline
Зарегистрирован: 24.01.2013

она уже измененная по таймеру?

maksim
Offline
Зарегистрирован: 12.02.2012

Нет, в ней есть те строки, которые вы не нашли в своей.

nikola
Offline
Зарегистрирован: 24.01.2013

мне свою библиотеку заменить этой?

 

maksim
Offline
Зарегистрирован: 12.02.2012

Конечно.

Тимур
Тимур аватар
Offline
Зарегистрирован: 30.04.2014

#include <AFMotor.h>
#include <IRremote.h>  
#include <CyberLib.h>
 
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);


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


void setup()  
{   
  motor1.setSpeed(200);
  motor2.setSpeed(200);
 
  motor1.run(RELEASE);
  motor2.run(RELEASE);
 

  D14_Out; //пищалкка
  D15_In;  //вход кнопки
  D15_High;  //включить подтяжку

  
  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);  

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

   if (irrecv.decode(&results))   //если был сигнал с пульта
     { 
        ir_tmp=results.value;
        
      if(ir_go==ir_tmp) //если принятый код равен коду который в памяти то вперед
        {
          motor1.run(FORWARD);
          motor2.run(FORWARD);
         
        
          beep(100,300);
        } else  
        
      if(ir_back==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          motor1.run(BACKWARD);
          motor2.run(BACKWARD);
          
         
          beep(100,400);  
        } else
        
      if(ir_left==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
          motor2.run(BACKWARD);
          motor1.run(FORWARD);
          
          beep(100,450);  
        } else   
        
      if(ir_right==ir_tmp) //если принятый код равен коду который в памяти то назад
        {
         motor1.run(BACKWARD);
         motor2.run(FORWARD);
          beep(100,500);  
        } else         
        
      if(ir_stop==ir_tmp) //если принятый код равен коду который в памяти то стоп
        {
        motor1.run(RELEASE);
        motor2.run(RELEASE);
         beep(10,300);
         beep(10,400); 
         beep(10,300);
        } 
     irrecv.resume();            //очистить входящий буфер 
     
    } 
  
 //покормить собаку, что бы она не сбежала    
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;                  //прервать цикл
          }

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

void beep(byte dur, word frq)
{
  dur=(1000/frq)*dur;  //расчет длительности бипа
  for(byte i=0; i<dur; i++)
  {
   D14_High; 
   delay_us(frq); 
   D14_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);   
   } 
}

совместил пару программ

Modsley
Offline
Зарегистрирован: 14.01.2018

maksim пишет:

Скачайте вот эту либу. Только переименуйте папку Arduino-IRremote-master в IRremote.

 

Прошу прощения, скачал по ссылке. Указанных строк тоже не нахожу... 

За все эти долгие годы придумано, как подружить IRRemote и Tone?

cyberman
Offline
Зарегистрирован: 30.10.2018

Эти строки находятся в файле boarddefs.h