[РЕШЕНО] Робот с ИК управлением не слушается...

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Nitro77rus, 5 янв 2015.

  1. Nitro77rus

    Nitro77rus Гик

    Подскажите, пожалуйста, где я накосячил :(
    Проблемы вроде как две:
    1) если дать команду на включение фар или послать его вперёд, то команда Stop или Rev или Ff (после Stop) сработает. А вот если после Rev, то больше ни на какие команды не реагирует. А команды влево и вправо не работают вообще.
    2) Оставил часть кода от робота объезжающего препятствия, хотел чтобы при наличии преграды просто остановился и ждал команды, но почему-то не работает. Хотя в автономном роботе всё работало исправно.

    Код (Text):
    //=====================================================================
    //Прога для танка Гомера Симпсона :)
    //===========================================================================
    /*Контакты Motor Shield (ARDUINO))(DIR_A 12, DIR_B 13, PWM_A 3, PWM_B 11, BRAKE_A 9, BRAKE_B 8)
    (при использовании редуктора TAMIYA правый(A) "+" к "-")*/

    #define SPEED_LEFT    11
    #define SPEED_RIGHT  3
    #define DIR_LEFT      13
    #define DIR_RIGHT    12
    #define BRAKE_LEFT    8
    #define BRAKE_RIGHT  9
    // Датчик
    #define IR_RADAR      A2
    // Расстояние в см
    float dist(){
      float volts = analogRead(IR_RADAR)*0.0048828125;
      float distance = 65*pow(volts, -1.10);
      return distance;
    }
    //Препятствия
    const int dangerThresh = 50;
    //ИК пульт
    #include "IRremote.h"
    const int IR_RC = A3;  //вход ик приёмника к 3
    IRrecv irrecv(IR_RC);  //создаём объект ик приёмника
    decode_results results;
    // Серво
    #include <Servo.h>    //Подключаем библиотеку серво
    #define SERVO        6
    Servo radarServo;
    //Пищалка
    #define BUZZER        5
    //Фары
    #define LED_R        4
    #define LED_L        7
    //===========================================================================
    void setup()
    {
      // Настраиваем порт для мониторинга данных
      Serial.begin(9600);
      irrecv.enableIRIn(); // Запуск ИК
      //Фары
      pinMode(LED_R, OUTPUT);
      pinMode(LED_L, OUTPUT);
      // Выходы двигателей
      pinMode(SPEED_LEFT, OUTPUT);
      pinMode(SPEED_RIGHT, OUTPUT);
      pinMode(DIR_LEFT, OUTPUT);
      pinMode(DIR_RIGHT, OUTPUT);
      pinMode(BRAKE_LEFT, OUTPUT);
      pinMode(BRAKE_RIGHT, OUTPUT);
      // Подключаем пищалку
      pinMode(BUZZER, OUTPUT);
      // Подключение к серво
      radarServo.attach(SERVO);
      // Выставить серво по центру (обычно 90)
      radarServo.write(86);
    }
    //===========================================================================
    void Ff()
    {
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_L, HIGH);
      //Расчет маршрута объезда препятствия
      int dist_f = dist(); //расстояние спереди
      if (dist_f > dangerThresh) //...если больше заданного вначале
        //едем вперёд
      {
        digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
        analogWrite(SPEED_LEFT, 255);
        analogWrite(SPEED_RIGHT, 255);
        digitalWrite(DIR_LEFT, LOW);
        digitalWrite(DIR_RIGHT, LOW);
      }
      else //...иначе
      {
        //Остановка!
        analogWrite(SPEED_LEFT, 0);
        analogWrite(SPEED_RIGHT, 0);
        digitalWrite(BRAKE_LEFT, HIGH); // ТОРМОЗ!
        digitalWrite(BRAKE_RIGHT, HIGH); // ТОРМОЗ!
        //пищим
        delay(100);
        tone(BUZZER, 3500, 500);
        delay(300);
        tone(BUZZER, 4000, 500);
        delay(300);
        tone(BUZZER, 4500, 500);
        delay(100);
      }
    }
    //===========================================================================
    void Rev()
    {
      //Пищим три раза
      tone(BUZZER, 4000, 500);
      delay(1000);
      tone(BUZZER, 4000, 500);
      delay(1000);
      tone(BUZZER, 4000, 500);
      delay(1000);
      //...и едем назад
      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      analogWrite(SPEED_LEFT, 150);
      analogWrite(SPEED_RIGHT, 150);
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, HIGH);
    }
    //===========================================================================
    void Left()
    {
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, LOW);

      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      analogWrite(SPEED_LEFT, 100);
      analogWrite(SPEED_RIGHT, 100);
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, LOW);
    }
    //===========================================================================
    void Righ()
    {
      digitalWrite(DIR_LEFT, LOW);
      digitalWrite(DIR_RIGHT, HIGH);

      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      analogWrite(SPEED_LEFT, 100);
      analogWrite(SPEED_RIGHT, 100);
      digitalWrite(DIR_LEFT, LOW);
      digitalWrite(DIR_RIGHT, HIGH);
    }
    //===========================================================================
    void Stop()
    {
      analogWrite(SPEED_LEFT, 0);
      analogWrite(SPEED_RIGHT, 0);
      digitalWrite(BRAKE_LEFT, HIGH); // ТОРМОЗ!
      digitalWrite(BRAKE_RIGHT, HIGH); // ТОРМОЗ!
      delay(1000);
      digitalWrite(LED_R, LOW);
      digitalWrite(LED_L, LOW);
    }
    //===========================================================================
    void loop()
    {
      //Запускаем программу
      if (irrecv.decode(&results))
      {
        if(results.value==0x77E1A0D9)
        {
          //Включаем фары
          digitalWrite(LED_R, HIGH);
          digitalWrite(LED_L, HIGH);
        }
        else if(results.value==0x77E1C0D9)
        {
          Stop();
        }
        else if(results.value==0x77E150D9)
        {
          Ff();
        }
        else if(results.value==0x77E130D9)
        {
          Rev();
        }
        else if(results.value==0x77E190D9)
        {
          Left();
        }
        else if(results.value==0x77E160D9)
        {
          Righ();
        }
        irrecv.resume();
      }
    }
    //===========================================================================
     
     
  2. ANV

    ANV Гуру

    А там ли irrecv.resume(); стоит?

    Не, вроде где надо :)
     
  3. Nitro77rus

    Nitro77rus Гик

    Самое интересное, что пока отлаживал (т.е. вместо действия выводил на комп название команды) всё работало...
    А когда заменил Serial.println() на реальные действия, перестало работать :(
     
  4. Unixon

    Unixon Оракул Модератор

    А если вернуть отладочные сообщения на место?
     
  5. Nitro77rus

    Nitro77rus Гик

    Код (Text):
    //=========================================================================
    //Прога для танка Гомера Симпсона :)
    //===============================================================================
    /*Контакты Motor Shield (ARDUINO))(DIR_A 12, DIR_B 13, PWM_A 3, PWM_B 11, BRAKE_A 9, BRAKE_B 8)
    (при использовании редуктора TAMIYA правый(A) "+" к "-")*/

    #define SPEED_LEFT    11
    #define SPEED_RIGHT  3
    #define DIR_LEFT      13
    #define DIR_RIGHT    12
    #define BRAKE_LEFT    8
    #define BRAKE_RIGHT  9
    // Датчик
    #define IR_RADAR      A2
    // Расстояние в см
    float dist(){
      float volts = analogRead(IR_RADAR)*0.0048828125;
      float distance = 65*pow(volts, -1.10);
      return distance;
    }
    //Препятствия
    const int dangerThresh = 50;
    //ИК пульт
    #include "IRremote.h"
    const int IR_RC = A3;  //вход ик приёмника к 3
    IRrecv irrecv(IR_RC);  //создаём объект ик приёмника
    decode_results results;
    // Серво
    #include <Servo.h>    //Подключаем библиотеку серво
    #define SERVO        6
    Servo radarServo;
    //Пищалка
    #define BUZZER        5
    //Фары
    #define LED_R        4
    #define LED_L        7
    //===============================================================================
    void setup()
    {
      // Настраиваем порт для мониторинга данных
      Serial.begin(9600);
      irrecv.enableIRIn(); // Запуск ИК
      //Фары
      pinMode(LED_R, OUTPUT);
      pinMode(LED_L, OUTPUT);
      // Выходы двигателей
      pinMode(SPEED_LEFT, OUTPUT);
      pinMode(SPEED_RIGHT, OUTPUT);
      pinMode(DIR_LEFT, OUTPUT);
      pinMode(DIR_RIGHT, OUTPUT);
      pinMode(BRAKE_LEFT, OUTPUT);
      pinMode(BRAKE_RIGHT, OUTPUT);
      // Подключаем пищалку
      pinMode(BUZZER, OUTPUT);
      // Подключение к серво
      radarServo.attach(SERVO);
      // Выставить серво по центру (обычно 90)
      radarServo.write(86);
    }
    //===============================================================================
    void Ff()
    {
      Serial.println("FF");
    }
    //===============================================================================
    void Rev()
    {
    Serial.println("REV");
    }
    //===============================================================================
    void Left()
    {
      Serial.println("LEFT");
    }
    //===============================================================================
    void Righ()
    {
      Serial.println("RIGH");
    }
    //===============================================================================
    void Stop()
    {
      Serial.println("STOP");
    }
    //===============================================================================
    void loop()
    {
      //Запускаем программу
      if (irrecv.decode(&results))
      {
        if(results.value==0x77E1A0D9)
        {
          Serial.println("Light");
          //Включаем фары
          digitalWrite(LED_R, HIGH);
          digitalWrite(LED_L, HIGH);
        }
        else if(results.value==0x77E1C0D9)
        {
          Stop();
        }
        else if(results.value==0x77E150D9)
        {
          Ff();
        }
        else if(results.value==0x77E130D9)
        {
          Rev();
        }
        else if(results.value==0x77E190D9)
        {
          Left();
        }
        else if(results.value==0x77E160D9)
        {
          Righ();
        }
        irrecv.resume();
      }
    }
     
    ...такой код работает исправно
     
  6. Unixon

    Unixon Оракул Модератор

    Не, вы и то и другое одновременно сделайте, чтобы и моторами крутил и в Serial писал. Еще лучше, чтобы сначала писал, чего собирается делать, потом крутил мотор и топал тормоза, а на выходе еще отписывал, как там все прошло.
     
  7. Nitro77rus

    Nitro77rus Гик

    хм.. попробую...
     
  8. Nitro77rus

    Nitro77rus Гик

    Код (Text):
    //=========================================================================
    //Прога для танка Гомера Симпсона :)
    //===============================================================================
    /*Контакты Motor Shield (ARDUINO))(DIR_A 12, DIR_B 13, PWM_A 3, PWM_B 11, BRAKE_A 9, BRAKE_B 8)
    (при использовании редуктора TAMIYA правый(A) "+" к "-")*/

    #define SPEED_LEFT    11
    #define SPEED_RIGHT  3
    #define DIR_LEFT      13
    #define DIR_RIGHT    12
    #define BRAKE_LEFT    8
    #define BRAKE_RIGHT  9
    // Датчик
    #define IR_RADAR      A2
    // Расстояние в см
    float dist(){
      float volts = analogRead(IR_RADAR)*0.0048828125;
      float distance = 65*pow(volts, -1.10);
      return distance;
    }
    //Препятствия
    const int dangerThresh = 50;
    //ИК пульт
    #include "IRremote.h"
    const int IR_RC = A3;  //вход ик приёмника к 3
    IRrecv irrecv(IR_RC);  //создаём объект ик приёмника
    decode_results results;
    // Серво
    #include <Servo.h>    //Подключаем библиотеку серво
    #define SERVO        6
    Servo radarServo;
    //Пищалка
    #define BUZZER        5
    //Фары
    #define LED_R        4
    #define LED_L        7
    //===============================================================================
    void setup()
    {
      // Настраиваем порт для мониторинга данных
      Serial.begin(9600);
      irrecv.enableIRIn(); // Запуск ИК
      //Фары
      pinMode(LED_R, OUTPUT);
      pinMode(LED_L, OUTPUT);
      // Выходы двигателей
      pinMode(SPEED_LEFT, OUTPUT);
      pinMode(SPEED_RIGHT, OUTPUT);
      pinMode(DIR_LEFT, OUTPUT);
      pinMode(DIR_RIGHT, OUTPUT);
      pinMode(BRAKE_LEFT, OUTPUT);
      pinMode(BRAKE_RIGHT, OUTPUT);
      // Подключаем пищалку
      pinMode(BUZZER, OUTPUT);
      // Подключение к серво
      radarServo.attach(SERVO);
      // Выставить серво по центру (обычно 90)
      radarServo.write(86);
    }
    //===============================================================================
    void Ff()
    {
      Serial.println("FF");
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_L, HIGH);
      //Расчет маршрута объезда препятствия
      int dist_f = dist(); //расстояние спереди
      if (dist_f > dangerThresh) //...если больше заданного вначале
        //едем вперёд
      {
        digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
        analogWrite(SPEED_LEFT, 255);
        analogWrite(SPEED_RIGHT, 255);
        digitalWrite(DIR_LEFT, LOW);
        digitalWrite(DIR_RIGHT, LOW);
      }
      else //...иначе
      {
        //Остановка!
        analogWrite(SPEED_LEFT, 0);
        analogWrite(SPEED_RIGHT, 0);
        digitalWrite(BRAKE_LEFT, HIGH); // ТОРМОЗ!
        digitalWrite(BRAKE_RIGHT, HIGH); // ТОРМОЗ!
        //пищим
        delay(100);
        tone(BUZZER, 3500, 500);
        delay(300);
        tone(BUZZER, 4000, 500);
        delay(300);
        tone(BUZZER, 4500, 500);
        delay(100);
      }
    }
    //===============================================================================
    void Rev()
    {
      Serial.println("REV");
      //Пищим три раза
      tone(BUZZER, 4000, 500);
      delay(1000);
      tone(BUZZER, 4000, 500);
      delay(1000);
      tone(BUZZER, 4000, 500);
      delay(1000);
      //...и едем назад
      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      analogWrite(SPEED_LEFT, 150);
      analogWrite(SPEED_RIGHT, 150);
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, HIGH);
    }
    //===============================================================================
    void Left()
    {
    Serial.println("LEFT");
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, LOW);

      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      analogWrite(SPEED_LEFT, 100);
      analogWrite(SPEED_RIGHT, 100);
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, LOW);
    }
    //===============================================================================
    void Righ()
    {
      Serial.println("RIGH");
      digitalWrite(DIR_LEFT, LOW);
      digitalWrite(DIR_RIGHT, HIGH);

      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      analogWrite(SPEED_LEFT, 100);
      analogWrite(SPEED_RIGHT, 100);
      digitalWrite(DIR_LEFT, LOW);
      digitalWrite(DIR_RIGHT, HIGH);
    }
    //===============================================================================
    void Stop()
    {
      Serial.println("STOP");
      analogWrite(SPEED_LEFT, 0);
      analogWrite(SPEED_RIGHT, 0);
      digitalWrite(BRAKE_LEFT, HIGH); // ТОРМОЗ!
      digitalWrite(BRAKE_RIGHT, HIGH); // ТОРМОЗ!
      delay(1000);
      digitalWrite(LED_R, LOW);
      digitalWrite(LED_L, LOW);
    }
    //===============================================================================
    void loop()
    {
      //Запускаем программу
      if (irrecv.decode(&results))
      {
        if(results.value==0x77E1A0D9)
        {
          Serial.println("Light");
          //Включаем фары
          digitalWrite(LED_R, HIGH);
          digitalWrite(LED_L, HIGH);
        }
        else if(results.value==0x77E1C0D9)
        {
          Stop();
        }
        else if(results.value==0x77E150D9)
        {
          Ff();
        }
        else if(results.value==0x77E130D9)
        {
          Rev();
        }
        else if(results.value==0x77E190D9)
        {
          Left();
        }
        else if(results.value==0x77E160D9)
        {
          Righ();
        }
        irrecv.resume();
      }
    }
     
    с этим кодом ситуация следующая:
    Работает фары, вперёд, стоп. Назад срабатывает только один раза, потом не работает ни чего. И сериал перестаёт писать команды.
    Влево и вправо только пишет по сериал, но ни чего не делает...
     
  9. rav_75

    rav_75 Гик

    Либо откажитесь от пищалки (tone()), либо от ШИМ на 3 и 11 ногах
     
  10. Nitro77rus

    Nitro77rus Гик

    Не совсем понял, пищалка на 5 пине мешает 3-му и 11-му?
     
  11. Nitro77rus

    Nitro77rus Гик

    Отключил пищалку... он и назад перестал ездить, только пишет на Serial...
     
  12. rav_75

    rav_75 Гик

    Судя по описанию функции tone(), не пищалка на 5 пине, а именно сама функция tone() мешает использованию ШИМ на 3 и 11 ноге (если у Вас не Мега). Физическое устранение пищалки ничего не даст. Попробуйте из кода убрать функцию tone(). Или SPEED_LEFT и SPEED_RIGHT перекинуть на другие пины с ШИМом (не 3 и 11).
     
  13. Nitro77rus

    Nitro77rus Гик

    Пищалку отключил и в коде тоже. А 3 и 11 перенести не могу, они в ARDUINO Motor Shield зашиты... :(

    А потом, с теми же пинами и пищалкой, всё работало, только автономно (без ИК)

    Вот тот код который работает с тем же железом без ИК
    Код (Text):
    //==================================================================================
    //Прога для танка Гомера Симпсона :)
    //==================================================================================
    /*Контакты Motor Shield (ARDUINO))(DIR_A 12, DIR_B 13, PWM_A 3, PWM_B 11, BRAKE_A 9, BRAKE_B 8)
    (при использовании редуктора TAMIYA правый(A) "+" к "-")*/

    #define SPEED_LEFT    11
    #define SPEED_RIGHT  3
    #define DIR_LEFT      13
    #define DIR_RIGHT    12
    #define BRAKE_LEFT    8
    #define BRAKE_RIGHT  9
    // Датчик
    #define IR_RADAR      A2
    // Расстояние в см
    float dist(){
      float volts = analogRead(IR_RADAR)*0.0048828125;
      float distance = 65*pow(volts, -1.10);
      return distance;
    }
    //Препятствия
    const int dangerThresh = 50;
    const int tupikDis = 250;
    int dist_l, dist_r;
    // Серво
    #include <Servo.h>    //Подключаем библиотеку серво
    #define SERVO        6
    Servo radarServo;
    //Пищалка
    #define BUZZER        5
    //Фары
    #define LED_R        4
    #define LED_L        7

    //==================================================================================
    //Маршрут движения
    void CalcMove()
    {
      // если по бокам мало места...
      if (dist_l < dangerThresh*2 && dist_r < dangerThresh*2)
      {
        //Пищим три раза
        tone(BUZZER, 4000, 500);
        delay(1000);
        tone(BUZZER, 4000, 500);
        delay(1000);
        tone(BUZZER, 4000, 500);
        delay(1000);
        //...и едем назад
        digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
        analogWrite(SPEED_LEFT, 150);
        analogWrite(SPEED_RIGHT, 150);
        digitalWrite(DIR_LEFT, HIGH);
        digitalWrite(DIR_RIGHT, HIGH);
        delay(1500); //длительность заднего хода
        Tupik(); //идем расчитывать маршрут объезда тупика
      }
      else if (dist_r < dist_l) //если справо меньше...
        //...то едем влево
      {
        digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
        analogWrite(SPEED_LEFT, 100);
        analogWrite(SPEED_RIGHT, 100);
        digitalWrite(DIR_LEFT, HIGH);
        digitalWrite(DIR_RIGHT, LOW);
        delay(1000); //время на манёвр
      }
      else if (dist_r > dist_l) //если справа больше...
        //...едем вправо
      {
        digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
        analogWrite(SPEED_LEFT, 100);
        analogWrite(SPEED_RIGHT, 100);
        digitalWrite(DIR_LEFT, LOW);
        digitalWrite(DIR_RIGHT, HIGH);
        delay(1000); //время на манёвр
      }
    }
    //==================================================================================
    //Маршрут объезда тупика
    void Tupik()
    {
        analogWrite(SPEED_LEFT, 0);
        analogWrite(SPEED_RIGHT, 0);
        digitalWrite(BRAKE_LEFT, HIGH); // ТОРМОЗ!
        digitalWrite(BRAKE_RIGHT, HIGH); // ТОРМОЗ!
        radarServo.write(20); //Поварачиваем датчик вправо
        delay(500); //время на поворот сервы
        dist_r = dist(); //расстояние справо
        delay(500); //врямя для измерения
        radarServo.write(150); //поворот датчика влево
        delay(700); //время для поворота сервы
        dist_l = dist(); //растояние слево
        delay(500); //замеряем
        radarServo.write(86); //датчик в центр
        delay(100); //небольшая выдержка
        CalcMove(); //получив данные идём расчитывать маршрут объезда ;)
    }
    //==============================================================================
    void setup()
    {
      //Фары
      pinMode(LED_R, OUTPUT);
      pinMode(LED_L, OUTPUT);
      // Выходы двигателей
      pinMode(SPEED_LEFT, OUTPUT);
      pinMode(SPEED_RIGHT, OUTPUT);
      pinMode(DIR_LEFT, OUTPUT);
      pinMode(DIR_RIGHT, OUTPUT);
      pinMode(BRAKE_LEFT, OUTPUT);
      pinMode(BRAKE_RIGHT, OUTPUT);
      // Подключаем пищалку
      pinMode(BUZZER, OUTPUT);
      // Подключение к серво
      radarServo.attach(SERVO);
      // Выставить серво по центру (обычно 90)
      radarServo.write(86);
      // Настраиваем порт для мониторинга данных
      Serial.begin(9600);
      // Пауза перед началом работы
      delay(4000);
    }
    void loop()
    {
      //Включаем фары
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_L, HIGH);
      //Вывод данных с датчика в см
      Serial.println(dist());
      //Расчет маршрута объезда препятствия
      int dist_f = dist(); //расстояние спереди
      if (dist_f > dangerThresh) //...если больше заданного вначале
      //едем вперёд
      {
        digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
        analogWrite(SPEED_LEFT, 255);
        analogWrite(SPEED_RIGHT, 255);
        digitalWrite(DIR_LEFT, LOW);
        digitalWrite(DIR_RIGHT, LOW);
      }
      else //...иначе
      {
        //Остановка!
        analogWrite(SPEED_LEFT, 0);
        analogWrite(SPEED_RIGHT, 0);
        digitalWrite(BRAKE_LEFT, HIGH); // ТОРМОЗ!
        digitalWrite(BRAKE_RIGHT, HIGH); // ТОРМОЗ!
        //пищим
        delay(100);
        tone(BUZZER, 3500, 500);
        delay(300);
        tone(BUZZER, 4000, 500);
        delay(300);
        tone(BUZZER, 4500, 500);
        delay(100);
        radarServo.write(20); //Поварачиваем датчик вправо
        delay(500); //время на поворот сервы
        dist_r = dist(); //расстояние справо
        delay(500); //врямя для измерения
        radarServo.write(150); //поворот датчика влево
        delay(700); //время для поворота сервы
        dist_l = dist(); //растояние слево
        delay(500); //замеряем
        radarServo.write(86); //датчик в центр
        delay(100); //небольшая выдержка
        CalcMove(); //получив данные идём расчитывать маршрут объезда ;)
      }

    }
     
     
  14. rav_75

    rav_75 Гик

    Да вроде код не фантастический... Явных ошибок не заметно. Про пищалку написал, потому что
    Пищалка у Вас на реверсе пищать начинает. Но если все работало... то наверное можно оставить. Хотя мне кажется, что прежде чем пищать, надо прекратить шимить 3 и 11 ногу.
    Если пишет, то ничего не делать не может, там нет ничего такого. Вы гляньте, когда прием от пульта идет, светодиод, который на 13 пине, мигает? Может библиотека IRremote Вам гадит..
    Не знаю, есть ли смысл, но попробуйте так же ИК приемник повесить не на аналоговый вход, а, например, вместо пищалки, на 5. Хотя не знаю, изменится что либо или нет.
    И приведите в порядок код. Сначала include, потом define, константы - переменные, функции - процедуры. Может где-то здесь "собака порылась".
    И еще... У Вас устройство от чего запитано? Может банально питание проседает или что-то в этом роде?
     
  15. geher

    geher Гуру

    IRremote.h тоже блокирует ШИМ на каких-то ногах (3 и 9, если не ошибаюсь).
    С этим даже пытаются бороться путем модификации библиотек,
    http://bigbarrel.ru/irremote-pwm-error/
    но как бы это не привело к потере ШИМ на других ногах или к конфликту с другими библиотеками.
     
    Nitro77rus нравится это.
  16. Nitro77rus

    Nitro77rus Гик

    Походу оно... В коде заменил "analogWrite()" на "digitalWrite()" и всё заработало...
    Всем ОГРОМНОЕ спасибо!

    Вот только думаю как решить проблему с датчиком препятствий. На него робот по прежнему не реагирует :(
     
    Последнее редактирование: 7 янв 2015
  17. vvr

    vvr Инженерище

    IRremote.h блокирует ШИМ на ногах 3 и 11
     
  18. Nitro77rus

    Nitro77rus Гик

    ...точно :)
     
  19. Nitro77rus

    Nitro77rus Гик

    ...вывел показания дальномера на Serial и выяснил, что он замеряет расстояние только перед запуском, а в процессе движения нет. Где косяк?
     
  20. Nitro77rus

    Nitro77rus Гик

    В итоге всё решил так:
    Код (Text):
    //==================================================================================
    //Прога для танка Гомера Симпсона :)
    //==================================================================================
    /*Контакты Motor Shield (ARDUINO))(DIR_A 12, DIR_B 13, PWM_A 3, PWM_B 11, BRAKE_A 9, BRAKE_B 8)
    (при использовании редуктора TAMIYA правый(A) "+" к "-")*/

    #define SPEED_LEFT    11
    #define SPEED_RIGHT  3
    #define DIR_LEFT      13
    #define DIR_RIGHT    12
    #define BRAKE_LEFT    8
    #define BRAKE_RIGHT  9
    // Датчик
    #define IR_RADAR      A2
    // Расстояние в см
    float dist(){
      float volts = analogRead(IR_RADAR)*0.0048828125;
      float distance = 65*pow(volts, -1.10);
      return distance;
    }
    //Препятствия
    const int dangerThresh = 50;
    //ИК пульт
    #include "IRremote.h"
    const int IR_RC = A3;  //вход ик приёмника к 3
    IRrecv irrecv(IR_RC);  //создаём объект ик приёмника
    decode_results results;
    // Серво
    #include <Servo.h>    //Подключаем библиотеку серво
    #define SERVO        6
    Servo radarServo;
    //Фары
    #define LED_R        4
    #define LED_L        7
    //==================================================================================
    void setup()
    {
      // Настраиваем порт для мониторинга данных
      Serial.begin(9600);
      irrecv.enableIRIn(); // Запуск ИК
      //Фары
      pinMode(LED_R, OUTPUT);
      pinMode(LED_L, OUTPUT);
      // Выходы двигателей
      pinMode(SPEED_LEFT, OUTPUT);
      pinMode(SPEED_RIGHT, OUTPUT);
      pinMode(DIR_LEFT, OUTPUT);
      pinMode(DIR_RIGHT, OUTPUT);
      pinMode(BRAKE_LEFT, OUTPUT);
      pinMode(BRAKE_RIGHT, OUTPUT);
      // Подключение к серво
      radarServo.attach(SERVO);
      // Выставить серво по центру (обычно 90)
      radarServo.write(86);
    }
    //==================================================================================
    void Ff()
    {
      Serial.println("FF");
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_L, HIGH);
      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(SPEED_LEFT, HIGH);
      digitalWrite(SPEED_RIGHT, HIGH);
      digitalWrite(DIR_LEFT, LOW);
      digitalWrite(DIR_RIGHT, LOW);
    }
    //==================================================================================
    void Rev()
    {
      Serial.println("REV");
      digitalWrite(LED_L, LOW);
      digitalWrite(LED_R, LOW);
      //...и едем назад
      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(SPEED_LEFT, HIGH);
      digitalWrite(SPEED_RIGHT, HIGH);
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, HIGH);
    }
    //==================================================================================
    void Left()
    {
      Serial.println("LEFT");
      digitalWrite(LED_L, HIGH);
      digitalWrite(LED_R, LOW);
      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(SPEED_LEFT, HIGH);
      digitalWrite(SPEED_RIGHT, HIGH);
      digitalWrite(DIR_LEFT, HIGH);
      digitalWrite(DIR_RIGHT, LOW);
    }
    //==================================================================================
    void Righ()
    {
      Serial.println("RIGH");
      digitalWrite(LED_L, LOW);
      digitalWrite(LED_R, HIGH);
      digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
      digitalWrite(SPEED_LEFT, HIGH);
      digitalWrite(SPEED_RIGHT, HIGH);
      digitalWrite(DIR_LEFT, LOW);
      digitalWrite(DIR_RIGHT, HIGH);
    }
    //==================================================================================
    void Stop()
    {
      Serial.println("STOP");
      digitalWrite(SPEED_LEFT, LOW);
      digitalWrite(SPEED_RIGHT, LOW);
      digitalWrite(BRAKE_LEFT, HIGH); // ТОРМОЗ!
      digitalWrite(BRAKE_RIGHT, HIGH); // ТОРМОЗ!
      delay(1500);
      digitalWrite(LED_R, LOW);
      digitalWrite(LED_L, LOW);
    }
    //==================================================================================
    void loop()
    {
      //digitalWrite(LED_R, HIGH);
      //digitalWrite(LED_L, HIGH);
      //Расчет маршрута объезда препятствия
      int dist_f = dist();
      Serial.println(dist()); //расстояние спереди
      if (dist_f > dangerThresh)
      { //...если больше заданного вначале //Запускаем программу
        if (irrecv.decode(&results))
        {
          if(results.value==0x77E1A0D9)
          {
            Serial.println("Light");
            //Включаем фары
            digitalWrite(LED_R, HIGH);
            digitalWrite(LED_L, HIGH);
          }
          else if(results.value==0x77E1C0D9)
          {
            Stop();
          }
          else if(results.value==0x77E150D9)
          {
            Ff();
          }
          else if(results.value==0x77E130D9)
          {
            Rev();
          }
          else if(results.value==0x77E190D9)
          {
            Left();
          }
          else if(results.value==0x77E160D9)
          {
            Righ();
          }
          irrecv.resume();
        }
      }
      else
      {
        digitalWrite(BRAKE_LEFT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(BRAKE_RIGHT, LOW); // отпуск тормоза (для тех у кого он есть)
        digitalWrite(SPEED_LEFT, HIGH);
        digitalWrite(SPEED_RIGHT, HIGH);
        digitalWrite(DIR_LEFT, HIGH);
        digitalWrite(DIR_RIGHT, HIGH);
        delay(500);
        Stop();
      }
    }
    //==================================================================================
     
    Осталась маленькая проблемка, при обнаружении препятствия переставал выполнять команды, но всё возобновляется как только препятствие убрать. Что бы не убирать препятствие, запрограмировал остановку после небольшого отката назад ;)

    P.S.: а точное отписани проблемы с ШИМ есть по ссылке от geher, в сообщении выше...
    Пробовал как там описано, тоже работает, но решил не править библиотеку.

    Ещё раз всем СПАСИБО!