Серво и помпа не хотят дружить

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем beivev, 12 июл 2016.

  1. beivev

    beivev Нуб

    Здравствуйте!
    Столкнулся с проблемой, что при включении помпы начинает дергаться серво и со временем вообще уходит в одно и тоже положение. Сначала помпа подключалась через транзистор думал в этом проблема, подключил все от разных источников питания тоже самое, ни какой связи нет между ними. Между землей и сигнальным проводом возрастает напряжение с 17 до 25 мВ. При отключении помпы серво работает стабильно.
    Питание помпы 12 вольт.
    Питание сервы 6 вольт.

    В чем может быть проблема?
     
  2. DIYMan

    DIYMan Guest

    В том, что вы не привели ни схемы, ни кода. Сейчас экстрасенсы достанут хрустальные шары, глянут в них - и всё поймут сразу!
     
  3. beivev

    beivev Нуб

    Хорошо.
    Код приведу так, если нужно могу скинуть сам проект

    #include <Servo.h>

    #define MOTO_PIN 10
    #define SERVO_PIN 9
    #define SERVO_ON_PIN 11
    #define PIP_PIN 12
    #define LOW_LEVEL_PIN 8
    #define HUM_LEV_PIN A0
    #define HUM_PRAV_PIN A1

    #define TIMEOUT 15000


    #define PUSE 10000

    #define HUM_LEV 300
    #define HUM_PRAV 600

    Servo myServo;

    int LEV = 116;
    int CENT = 60;
    int PRAV = 0;

    int val_LEV = 0;
    int val_PRAV = 0;

    unsigned long time_LEV = 1; // Переменная для хранения времени
    unsigned long time_PRAV = 1; // Переменная для хранения времени

    void setup()
    {
    Serial.begin(9600);
    myServo.attach(SERVO_PIN);
    myServo.write(CENT);
    pinMode(MOTO_PIN, OUTPUT);
    pinMode(SERVO_ON_PIN, OUTPUT);
    pinMode(PIP_PIN, OUTPUT);
    pinMode(LOW_LEVEL_PIN, INPUT);
    }





    void loop()
    {
    delay(50);
    val_LEV = analogRead(HUM_LEV_PIN); // считываем значение
    delay(50);
    val_PRAV = analogRead(HUM_PRAV_PIN); // считываем значение
    Serial.print("LEV=");
    Serial.println(val_LEV);
    Serial.print("PRAV=");
    Serial.println(val_PRAV);
    if( digitalRead(LOW_LEVEL_PIN) == HIGH){
    if((val_LEV > HUM_LEV) && (millis()-time_LEV) > TIMEOUT){

    digitalWrite(SERVO_ON_PIN, HIGH);
    myServo.write(LEV);
    for(int i=0; i<=255; i=i+5){
    analogWrite(MOTO_PIN, i);
    delay(10);
    }
    delay(PUSE);
    for(int i=255; i>=0; i=i-5){
    analogWrite(MOTO_PIN, i);
    delay(10);
    }
    analogWrite(MOTO_PIN, 0);
    myServo.write(CENT);
    digitalWrite(SERVO_ON_PIN, LOW);
    time_LEV = millis(); }


    if((val_PRAV > HUM_PRAV) && (millis()-time_PRAV) > TIMEOUT){

    digitalWrite(SERVO_ON_PIN, HIGH);
    myServo.write(PRAV);
    for(int i=0; i<=255; i=i+5){
    analogWrite(MOTO_PIN, i);
    delay(10);
    }
    delay(PUSE);
    for(int i=255; i>=0; i=i-5){
    analogWrite(MOTO_PIN, i);
    delay(10);
    }
    analogWrite(MOTO_PIN, 0);
    myServo.write(CENT);
    digitalWrite(SERVO_ON_PIN, LOW);
    time_PRAV = millis(); }

    }
    else{

    for(int i=0; i<5; i++){
    digitalWrite(PIP_PIN, HIGH);
    delay(1000);
    digitalWrite(PIP_PIN, LOW);
    delay(1000);}
    delay(TIMEOUT);
    }
    }
     

    Вложения:

  4. beivev

    beivev Нуб

    При включении помпы серво всегда занимает одно и тоже крайнее положение
     
  5. DIYMan

    DIYMan Guest

    А теперь сделайте плз ещё шаг и вставьте код в теги code, чтобы читать было удобней. На тулбаре редактора сообщений есть кнопочка для этого.

    И да - схема плохая, неправильная.
     
  6. Securbond

    Securbond Гуру

    Пишите что питание сервы 6в, помпы 12в. А на схеме все запитано от vin arduino. ???? Где правда?
    Если правда питали от разных источников земли не забыли объединить?
     
    Последнее редактирование: 12 июл 2016
  7. beivev

    beivev Нуб

    Код (C++):
    #include <Servo.h>

    #define MOTO_PIN 10 // Подключена помпа
    #define SERVO_PIN 9 // Подключен серво
    #define SERVO_ON_PIN 11 // Реле отключение питания у сервы, не реализовано
    #define PIP_PIN 12 // Звуковое оповещение
    #define LOW_LEVEL_PIN 8 // Датчик уровня воды
    #define HUM_LEV_PIN A0 // Датчик влажности 1
    #define HUM_PRAV_PIN A1 // Датчик влажности 2

    #define TIMEOUT 15000 // Время бездействия


    #define PUSE 10000 // Время плива

    #define HUM_LEV 300 // влажность для 1
    #define HUM_PRAV 600 // влажность для 2

    Servo myServo;


    // Значения для положения серва
    int LEV = 116;
    int CENT = 60;
    int PRAV = 0;

    // переменная для храния значений с датчиков
    int val_LEV = 0;
    int val_PRAV = 0;

    // Время последнего полива
    unsigned long time_LEV = 1; // Переменная для хранения времени
    unsigned long time_PRAV = 1; // Переменная для хранения времени

    void setup()
    {
      // Инициализация устройств
      Serial.begin(9600);
      myServo.attach(SERVO_PIN);
       myServo.write(CENT);
       pinMode(MOTO_PIN, OUTPUT);
      pinMode(SERVO_ON_PIN, OUTPUT);
      pinMode(PIP_PIN, OUTPUT);
      pinMode(LOW_LEVEL_PIN, INPUT);
    }





    void loop()
    {
      delay(50);
      val_LEV = analogRead(HUM_LEV_PIN);     // считываем значение 1
      delay(50);
      val_PRAV = analogRead(HUM_PRAV_PIN);     // считываем значение 2
      Serial.print("LEV=");
      Serial.println(val_LEV);
      Serial.print("PRAV=");
      Serial.println(val_PRAV);
     
      // Если вода есть
      if( digitalRead(LOW_LEVEL_PIN) == HIGH){
        // Влажность меньше допустимой и прошло достаточно времени, поливаем левый цветок
      if((val_LEV > HUM_LEV) && (millis()-time_LEV) > TIMEOUT){
       
      // Включаем и устанавливаем серво
      digitalWrite(SERVO_ON_PIN, HIGH);
      myServo.write(LEV);
     
      // Разгоняем помпу поливаем отключаем помпу
      for(int i=0; i<=255; i=i+5){
      analogWrite(MOTO_PIN, i);
      delay(10);
      }
     
      delay(PUSE);
     
      for(int i=255; i>=0; i=i-5){
      analogWrite(MOTO_PIN, i);
      delay(10);
      }
        analogWrite(MOTO_PIN, 0);
      myServo.write(CENT); // устанавливаем серво в центральное положение и отключаем
      digitalWrite(SERVO_ON_PIN, LOW);
      time_LEV = millis();  }// запоминем время
     
     
       // Справой стороной все тоже самое
       if((val_PRAV > HUM_PRAV) && (millis()-time_PRAV) > TIMEOUT){
       
      digitalWrite(SERVO_ON_PIN, HIGH);
      myServo.write(PRAV);
     
      for(int i=0; i<=255; i=i+5){
      analogWrite(MOTO_PIN, i);
      delay(10);
      }
     
      delay(PUSE);
     
      for(int i=255; i>=0; i=i-5){
      analogWrite(MOTO_PIN, i);
      delay(10);
      }
     
      analogWrite(MOTO_PIN, 0);
      myServo.write(CENT);
      digitalWrite(SERVO_ON_PIN, LOW);
      time_PRAV = millis();  }
     
       
      }
    else{
    //если воды нет говорим об этом, повторяя со временем
    for(int i=0; i<5; i++){
    digitalWrite(PIP_PIN, HIGH);
    delay(1000);
    digitalWrite(PIP_PIN, LOW);
    delay(1000);}
    delay(TIMEOUT);
     
    }
    }
     
     
  8. DIYMan

    DIYMan Guest

    В общем, не вчитываясь особо в код, скажу, что проблема в схеме, надо её переделывать, помпа даёт дикие наводки во время работы, это раз. Два - запитано это всё неправильно.
     
  9. beivev

    beivev Нуб

    В интернете нашел что серво и 7 выдержит, а помпа слишком мощная для 12, вот и убавил напряжение.
    Земли я объединять не забывал.

    Подключаю ардуино и серво от одного источника питания, резистором меняю положения ротора, ставлю примерно по середине. Тем временем от другого источника (БП от ПК) подключаю помпу на прямую без всего, и все равно серво уходит в одну и ту же сторону.
     
  10. beivev

    beivev Нуб

    Вот мне и нужна в этом помощь.
    подключал все от аккумулятора 12В, серво подключал через линейный стабилизатор LM7805, помпу от аккумулятора через транзистор, вроде работает, только время работы помпы почему-то сократилось, работает не 10 секунд, а буквально 1-2.
     
  11. DIYMan

    DIYMan Guest

    Для того, чтобы сделать нормальную схему, надо, во-первых, знать характеристики всех используемых компонентов. Во-вторых - как минимум не хватает защитного диода на помпу. По остальному - можно долго гадать, и так и не угадать, не зная характеристик компонентов.
     
  12. beivev

    beivev Нуб

    Про первое, нашел я характеристики, там где покупал, серво 4.8-7.2 В (красный провод), 4.8-6.0 В(рабочее напряжение) - не знаю чему верить. Помпа 2.5-6.0 В, думал что 12 В заказывал.

    Про второе, да гадать можно бесконечно, и тратить на это время, а можно забросить и заняться чем-то другим более полезным.
     
  13. DIYMan

    DIYMan Guest

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

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