Наводки от моторов? Бракованная troyka_shield?

Тема в разделе "Arduino & Shields", создана пользователем B52, 16 май 2013.

  1. B52

    B52 Нерд

    Доброго всем дня.
    Появилась серьезная проблема при соеденении всех элементов в одно целое (снизу вверх):
    Гусеничная платформа Rover 5 + Arduino Uno + Motor Shield + Troyka Shield + 2*Инфракрасный датчик препятствий. Трактор без датчиков бегает отлично, перелезает через тапки, буксует упершись в стену и т.д. Датчики отдельно тоже работают, они у меня стоят в 20см друг от друга (ширина ровера), закрываешь то один рукой, то второй - отладчик показывает всё как есть.
    Теперь запускаем моторы, и как только датчики начинают подавать сигналы в troyka_shield, сигнал проходит насквозь motor_shield и приходит в Uno - там обрабатывается, и из Unо соответствующий управляющий сигнал идет в motor_shield, а потом на моторы - происходит что-то непонятное...
    Вот пример:
    показания с левого и правого датчиков delay(1000):
    left = 0 right = 1
    left = 0 right = 1
    left = 0 right = 1
    left = 1 right = 1
    left = 0 right = 1
    left = 0 right = 1
    left = 1 right = 1
    left = 1 right = 1
    left = 1 right = 1

    хотя датчики были направлены в небо, я пробовал закрывать правый датчик - но он никак не реагировал.
    Запускаем другой скетч(где моторы не используются) - и датчики снова ведут себя адекватно.
    Вот листинг:
    Код (C):

    int PIN_speed_left = 5;
    int PIN_course_left = 4;
    int PIN_speed_right = 6;                   
    int PIN_course_right = 7;  

    int PIN_sensor_left = 10;
    int PIN_sensor_right = 12;               
     
    void setup()
    {
        pinMode(PIN_course_left, OUTPUT);   //моторы, направление и скорость.
        pinMode(PIN_course_right, OUTPUT);
        pinMode(PIN_speed_left, OUTPUT);
        pinMode(PIN_speed_right, OUTPUT);
           
            pinMode(PIN_sensor_left, INPUT);   //датчики препятствий
            pinMode(PIN_sensor_right, INPUT);
           
            Serial.begin(9600); //Для отладки
    }
     
    void GO (boolean course_left, boolean course_right, int speed_left, int speed_right)
    {
      digitalWrite(PIN_course_left, !course_left);  // провода к моторам не правильно подсоединили!!!!!
      digitalWrite(PIN_course_right, course_right);// нужно поменять местами питание и землю на левом моторе.
      analogWrite(PIN_speed_left, speed_left);  
      analogWrite(PIN_speed_right, speed_right);  
      delay(200);
    }

    void STOP ()
    {
      analogWrite(PIN_speed_left, 0);  
      analogWrite(PIN_speed_right, 0);
      delay(200);
    }

    void loop()
    {
      boolean left = digitalRead(PIN_sensor_left);  //Если 1, значит путь свободен, можно ехать,
      boolean right = digitalRead(PIN_sensor_right);  //если 0, прохода нет.

      Serial.print("left = "); Serial.print(left); // Для отладки датчиков
      Serial.print("   right = "); Serial.println(right);
      delay(2000);
     
      if (left && right)
      {
        // Вперед
        GO(HIGH, HIGH, 255, 255);
      }
     
      if (!left && !right)
      {
        //останавливаемся
        STOP();
        //крутимся на месте, будем искать выход
        GO(HIGH, LOW, 255, 255);
      }
     
      if (left && !right)
      {
        // надо повернуть левее, левую сторону останавливаем, правую разгоняем.
        GO(HIGH, HIGH, 0, 255);
      }
     
      if (!left && right)
      {
        // надо повернуть правее, правую сторону останавливаем, левую разгоняем.
        GO(HIGH, HIGH, 255, 0);
      }
    }
     
    Причем эта программа в первый свой запуск отработала отлично, трактор поездил по кухне, аккуратно объезжая препятствия, а потом началось "то в лес, то по дрова".
    Питание моторов от 6 аккумуляторов в сумме 7,5 вольт. Питание ардуины от кроны на 9 вольт, либо от USB(хожу за трактором с ноутбуком).
    Менял пины подключения датчиков, почти все варианты перебрал - не сработало.
    P.S. убрал тройку_шилд и собрал на макетке - не помогло.

    Может кто сталкивался с такой проблемой? Можете подсказать что происходит?
     
  2. B52

    B52 Нерд

    Значит так, проблема была вот в чём: не хватало питания для датчиков (5 В, 100 мА - каждый), поэтому иногда они показывали что вздумается. Отказался от тройки_шилд, пусть пока в сторонке полежит. Запитал весь бутерброд от 6 аккумуляторов, которые стоят в Ровере, на моторшилде есть перемычка такая PWRIN - VIN. А датчики подключил к разъёмам моторшилда:
    левый на Vin-GND-10pin
    правый на 5V-GND-12pin
    Да, конечно, провода теперь торчат в разные стороны, но с тройкой_шилд датчики работают черт знает как ((.

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