Подскажите, что не так?

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

  1. CasperSimfer

    CasperSimfer Нуб

    Доброго времени суток.
    Подскажите, что не так я сделал?
    Хочу сделать машину на управлении с помощью обычного пульта через ИК приемник.


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

    unsigned long Value1 = 0x68733A46;
    unsigned long Value2 = 0x83B19366;
    unsigned long Value3 = 0x5F12E8C4;
    unsigned long Value4 = 0x189D7928;

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


    //задние моторы
    AF_DCMotor motor_b1(1);
    AF_DCMotor motor_b2(2);

    //передние моторы

    AF_DCMotor motor_f1(3);
    AF_DCMotor motor_f2(4);


    void set_speed(int speed)
    {
    motor_b1.setSpeed(speed);
    motor_b2.setSpeed(speed);
    motor_f1.setSpeed(speed);
    motor_f2.setSpeed(speed);
    }

    void robot_forward()
    {
    motor_b1.run(FORWARD);
    motor_b2.run(FORWARD);
    motor_f1.run(FORWARD);
    motor_f2.run(FORWARD);
    delay(1000);
    }

    // едем назад
    void robot_backward()
    {
    motor_b1.run(BACKWARD);
    motor_b2.run(BACKWARD);
    motor_f1.run(BACKWARD);
    motor_f2.run(BACKWARD);
    delay(1000);
    }

    // останавливаемся
    void robot_release()
    {
    motor_b1.run(RELEASE);
    motor_b2.run(RELEASE);
    motor_f1.run(RELEASE);
    motor_f2.run(RELEASE);
    delay(1000);
    }

    //поворот направо
    void turning_to_the_right()
    {
    motor_b1.run(FORWARD);
    motor_f2.run(FORWARD);
    motor_b2.run(BACKWARD);
    motor_f1.run(BACKWARD);
    delay(1000);
    }

    // поворот налево
    void turning_to_the_left()
    {
    motor_b2.run(FORWARD);
    motor_f1.run(FORWARD);
    motor_b1.run(BACKWARD);
    motor_f2.run(BACKWARD);
    delay(1000);
    }


    void setup()
    {
    Serial.begin(9600);
    set_speed(200);
    robot_forward();
    irrecv.enableIRIn();
    }

    void loop()
    {
    if (irrecv.decode(&results));
    {
    irrecv.resume();
    }
    if (results.value == Value1)
    motor_b1.run(FORWARD);
    motor_b2.run(FORWARD);
    motor_f1.run(FORWARD);
    motor_f2.run(FORWARD);
    if (results.value == Value2)
    motor_b1.run(BACKWARD);
    motor_b2.run(BACKWARD);
    motor_f1.run(BACKWARD);
    motor_f2.run(BACKWARD);
    if (results.value == Value3)
    motor_b1.run(FORWARD);
    motor_f2.run(FORWARD);
    motor_b2.run(BACKWARD);
    motor_f1.run(BACKWARD);
    delay(1000);
    if (results.value == Value4)
    motor_b2.run(FORWARD);
    motor_f1.run(FORWARD);
    motor_b1.run(BACKWARD);
    motor_f2.run(BACKWARD);
    delay(1000);
    }
     
  2. Megakoteyka

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

    Скобочки поставить забыли?
    Код (Text):
    if (results.value == Value1)
    {
      motor_b1.run(FORWARD);
      motor_b2.run(FORWARD);
      motor_f1.run(FORWARD);
      motor_f2.run(FORWARD);
    }
     
  3. CasperSimfer

    CasperSimfer Нуб

    поставил скобочки, все равно не работает. Постоянно крутится мотор.
     
  4. rav_75

    rav_75 Гик

    Код (Text):
    void setup()
    {
      //Serial.begin(9600);
      set_speed(200);
      //robot_forward();
      irrecv.enableIRIn();
    }

    void loop(){
      if (irrecv.decode(&results)){
        if (results.value == Value1){
          robot_forward();
        }
        else if (results.value == Value2){
          robot_backward();
        }
        else if (results.value == Value3){
          turning_to_the_right();
        }
        else if (results.value == Value4){
          turning_to_the_left();
        }
        else{
          robot_release();
        };
        irrecv.resume();
      }
    }
    как-то так попробуйте.
    Код (Text):
    unsigned long Value1 = 0x68733A46;
    unsigned long Value2 = 0x83B19366;
    unsigned long Value3 = 0x5F12E8C4;
    unsigned long Value4 = 0x189D7928;
    Это вообще от вашего пульта? Или вместе с кодом к Вам перекочевало?
     
  5. CasperSimfer

    CasperSimfer Нуб

    от моего пульта. Код я сам писал, ориентируясь на разные коды. Скажем так собрал один код из массы других
     
  6. Megakoteyka

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

    Нужно привести код в порядок, добавить отладочный вывод, запустить и посмотреть в монитор последовательного порта. По поведению программы станет понятна причина затыка.
    Код (Text):
    #include <AFMotor.h>
    #include <IRremote.h>

    const unsigned long Value_FORWARD = 0x68733A46;
    const unsigned long Value_BACKWARD = 0x83B19366;
    const unsigned long Value_LEFT = 0x5F12E8C4;
    const unsigned long Value_RIGHT = 0x189D7928;

    const int RECV_PIN = 14;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    //задние моторы
    AF_DCMotor motor_b1(1);
    AF_DCMotor motor_b2(2);

    //передние моторы
    AF_DCMotor motor_f1(3);
    AF_DCMotor motor_f2(4);


    void set_speed(int speed)
    {
      motor_b1.setSpeed(speed);
      motor_b2.setSpeed(speed);
      motor_f1.setSpeed(speed);
      motor_f2.setSpeed(speed);
    }

    void robot_forward()
    {
      motor_b1.run(FORWARD);
      motor_b2.run(FORWARD);
      motor_f1.run(FORWARD);
      motor_f2.run(FORWARD);
      delay(1000);
    }

    // едем назад
    void robot_backward()
    {
      motor_b1.run(BACKWARD);
      motor_b2.run(BACKWARD);
      motor_f1.run(BACKWARD);
      motor_f2.run(BACKWARD);
      delay(1000);
    }

    // останавливаемся
    void robot_release()
    {
      motor_b1.run(RELEASE);
      motor_b2.run(RELEASE);
      motor_f1.run(RELEASE);
      motor_f2.run(RELEASE);
      delay(1000);
    }

    //поворот направо
    void turning_to_the_right()
    {
      motor_b1.run(FORWARD);
      motor_b2.run(BACKWARD);
      motor_f1.run(BACKWARD);
      motor_f2.run(FORWARD);
      delay(1000);
    }

    // поворот налево
    void turning_to_the_left()
    {
      motor_b1.run(BACKWARD);
      motor_b2.run(FORWARD);
      motor_f1.run(FORWARD);
      motor_f2.run(BACKWARD);
      delay(1000);
    }


    void setup()
    {
      Serial.begin(9600);
      set_speed(200);
      robot_forward();
      irrecv.enableIRIn();
    }

    void loop()
    {
      if (irrecv.decode(&results));
      {
        irrecv.resume();
        Serial.println("command received");
      }
      if (results.value == Value_FORWARD)
      {
        robot_forward();
        Serial.println("forward");
      }
      if (results.value == Value_BACKWARD)
      {
        robot_backward();
        Serial.println("backward");
      }
      if (results.value == Value_RIGHT)
      {
        turning_to_the_right();
        Serial.println("right");
      }
      if (results.value == Value_LEFT)
      {
        turning_to_the_left();
        Serial.println("left");
      }
    }
    И еще, наверное, не помешало бы останавливать моторы через некоторое время. Иначе получится так, что робот будет выполнять последнюю команду бесконечно.
     
    Последнее редактирование: 18 ноя 2014
  7. CasperSimfer

    CasperSimfer Нуб

    Залил Ваш код, но от пульта ничего не заработало. Передние колеса постоянно крутятся вперед. Задние просто "стоят" на месте.
     
  8. Megakoteyka

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

    По отдельности работу функций проверяли?
     
  9. CasperSimfer

    CasperSimfer Нуб

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

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

    Вот так, например:
    Код (Text):
    void setup()
    {
      robot_forward();
    }

    void loop()
    {
    }
    Нужно сперва убедиться в работоспособности всех кусков кода по отдельности, а потом уже компоновать из них более сложную программу. И на каждом шаге проверять.
     
  11. Petrovich

    Petrovich Нерд

    AFMotor.h и IRremote.h конфликтуют! Они используют один таймер. Надо править
     
  12. ИгорьК

    ИгорьК Гуру

    В целом это верно, но в частности иногда ставит в тупик. Например ВОЗМОЖНО здесь.
    Библиотека IRremote.h "хватает" таймер и блокирует возможность работы ШИМ на 3 и 11 ноге Ардуино. Когда запускаешь "покусочно" - все работает, вместе - нет.
    От библиотеки IRremote.h можно отказаться, как принимать ИК-сигнал без нее, смотреть здесь. Возможно есть другой путь - отказаться от библиотеки AFMotor.h, если это проще. Но от чего-то придется отказываться точно.
     
    Последнее редактирование: 20 ноя 2014
  13. CasperSimfer

    CasperSimfer Нуб

    Такая ситуация. С пульта все переключается: вперед, назад, налево, направо. Библиотеки никакие не убирал, но как то странно себя ведут моторы. Почему-то работают только два мотора.