почему серва шумит?

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

  1. Rustam

    Rustam Нерд

    Здравствуйте. подключил к ардуинке 4х строчный лсд экран, термометр и серву. экран каждую секунду обновляет показания температуры, а серва в зависимости от этого крутит ручку. но даже когда серве не надо ничего крутить, она каждую секунду издает звуки. короткие, вроде как крутануть хочет, или угол поправляет. и делает это даже если в скетче закаментить все действия сервы. серву подключил через конденсатор 10мкф, термометр через резистор 1ком. ардуинка питается от юсб и от адаптера. что с сервой не так? как сделать чтоб не шумела?
     
  2. acos

    acos Официальный гик Команда форума

    Серва запитана от Arduino?
     
  3. Rustam

    Rustam Нерд

    при запитки от адаптера так же шумит
     
    Последнее редактирование: 6 май 2014
  4. acos

    acos Официальный гик Команда форума

    Скетч и схему в студию)
     
  5. Rustam

    Rustam Нерд

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LiquidCrystal.h>
    #include <Servo.h>

    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    #define ONE_WIRE_BUS 6
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    Servo myServo;

    void setup(void)
    {
    // start serial port
    myServo.attach(9);
    // Serial.begin(9600);

    sensors.begin();

    lcd.begin(16, 4);
    lcd.print("ALCO MATIC v1.0");
    }

    void loop(void)
    {
    sensors.requestTemperatures();
    int t = sensors.getTempCByIndex(0);

    if (t >= 0 && t<=59)
    {
    myServo.write(180);
    }
    if (t >= 60 && t<=80)
    {
    myServo.write(0);
    }
    if (t >= 81 && t<=94)
    {
    myServo.write(180);
    }
    if (t>=95)
    {
    myServo.write(0);
    }

    {
    lcd.clear();
    lcd.print("ALCO MATIC v1.0");
    lcd.setCursor(0, 1);
    lcd.println ("Temp ");
    lcd.setCursor(5, 1);
    lcd.print(sensors.getTempCByIndex(0));
    lcd.setCursor(11, 1);
    lcd.print ("C");
    lcd.setCursor(0, 3);
    lcd.print ("Heat ");
    lcd.print (myServo.read());
    delay(1000);
    }
    }
     

    Вложения:

    • alco 1.jpg
      alco 1.jpg
      Размер файла:
      872,8 КБ
      Просмотров:
      603
  6. acos

    acos Официальный гик Команда форума

    А так ?
    Код (Text):

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LiquidCrystal.h>
    #include <Servo.h>

    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    #define ONE_WIRE_BUS 6
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    Servo myServo;

    int servoPos = 0;

    void setup(void)
    {
      // start serial port
      myServo.attach(9);
      // Serial.begin(9600);

      sensors.begin();

      lcd.begin(16, 4);
      lcd.print("ALCO MATIC v1.0");
    }

    void loop(void)
    {
      sensors.requestTemperatures();
      int t = sensors.getTempCByIndex(0);

      int lastServoPos = servoPos;

      if ((t >= 0 && t <= 59) || (t >= 81 && t <= 94))
      {
        servoPos = 180;
      }
      else if ((t >= 60 && t <= 80) || (t >= 95))
      {
        servoPos = 0;
      }

      if (servoPos != lastServoPos)
        myServo.write(servoPos);

      lcd.clear();
      lcd.print("ALCO MATIC v1.0");
      lcd.setCursor(0, 1);
      lcd.println ("Temp ");
      lcd.setCursor(5, 1);
      lcd.print(sensors.getTempCByIndex(0));
      lcd.setCursor(11, 1);
      lcd.print ("C");
      lcd.setCursor(0, 3);
      lcd.print ("Heat ");
      lcd.print (myServo.read());
      delay(1000);

    }
     
     
  7. Rustam

    Rustam Нерд

    код стал красивым, но ничего не поменялось. серва издает полусекундный жжж в момент обновления информации на LCD экране. ардуинка запитана от 9 вольт через адаптор + юсб подключение. при отключении юсб или 9 вольт ничего не меняется, от юсб только подсветка экрана тускнеет при срабатывании сервы.
     
  8. Mitrandir

    Mitrandir Гуру

    9 вольт случаем не с кроны?
     
  9. Rustam

    Rustam Нерд

    9 вольт с блока питания ROBITON EN1000s. с регулятором от 3 до 12 вольт.
    [​IMG]
     
  10. Tomasina

    Tomasina Иномирянин

    убери из кода все, что не относится к серве. Если поведение то же - что-то с блоком питания (или пульсирует, или просадка напряжения).
     
  11. acos

    acos Официальный гик Команда форума

    Возможно блок питания. Ну и попробуй на всякий пожарный серву на другой пин перекинуть - на А0 например.
     
  12. Rustam

    Rustam Нерд

    А0 аналоговый же. как там серва работать будет?
     
  13. Mitrandir

    Mitrandir Гуру

    Аналоговый можно юзать как цифровой. Но серве же нужен шим. Разве аналоговые могут шим выдавать?
     
  14. acos

    acos Официальный гик Команда форума

    эмм. Давайте-ка немного разберёмся) В Arduino все пины цифровые. Но некоторые из них могут быть подключены к аналогово-цифровому преобразователю. Одному единственному на весь контроллер. Конфигурируя этот АЦП можно подключить к нему один из этих выводов и считать аналоговое значение с него. Вот те цифровые пины, которые имеют возможность быть покдлючёнными к АЦП и обозначены как А0-А5. При этом цифровыми они быть не перестают. канал АЦП это такая же доп функция ножки, как например UART TX или скажем RESET, или SPI MISO. и вот такой вот код
    Код (Text):

    int led = A0;

    // the setup routine runs once when you press reset:
    void setup() {
      // initialize the digital pin as an output.
      pinMode(led, OUTPUT);
    }

    // the loop routine runs over and over again forever:
    void loop() {
      digitalWrite(led, HIGH);  // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);              // wait for a second
    }
    будет работать точно так же, как обычный Blink.

    Далее серво. Сервы могут быть подключены к любому цифровому пину, и библиотеке Servo.h абсолютно по барабану, есть на этой ноге шим или нет - она берёт у системы один таймер (первый обычно) и на прерываниях этого таймера формирует нужный для управления сервами сигнал на той цифровой ноге, которую ей дали
    Код (Text):
    #include <Servo.h>
    Servo myservo;  // create servo object to control a servo
                    // twelve servo objects can be created on most boards
    int pos = 0;    // variable to store the servo position
    void setup()
    {
      myservo.attach(A0);  // attaches the servo on pin A0 to the servo object
    }
    void loop()
    {
      for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
      {                                  // in steps of 1 degree
        myservo.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);                      // waits 15ms for the servo to reach the position
      }
      for(pos = 180; pos>=0; pos-=1)    // goes from 180 degrees to 0 degrees
      {                            
        myservo.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);                      // waits 15ms for the servo to reach the position
      }
    }
     
    Именно поэтому при работе Servo.h не работает шим на ноге 9 и 10 - потому что шим этих ног работает на первом таймере, а библиотека его отбирает.
    Ну и серам для управления нужен не ШИМ а PDM (Pulse Duration Modulation).
    [​IMG]
    Вот из нашей вики:
     
    Yaroduino, f10, Megakoteyka и 2 другим нравится это.
  15. Rustam

    Rustam Нерд

    спасибо. я подозревал это =)
     
  16. vvr

    vvr Инженерище

    Запитайте серву от отдельного источника питания + 5 в(ВСЕГДА) и соедините землю сервы с землёй ардуины.
    Если дрожит, то это джиттер. С ним надо бороться программно.
     
    Hank Hill нравится это.
  17. Megakoteyka

    Megakoteyka Оракул

    Некоторые сервы дергаются и шумят в крайних положениях (0 и 180). Такова особенность их исполнения.
    На авиамоделях встречается иногда, например. Не тот случай?
     
  18. vvr

    vvr Инженерище

    Я боролся с джиттером так

    Код (Text):
    int valPot;
    int  oldvalPot;  
    #define K 0.3

    valPot = analogRead(potpin);
    valPot = (valPot * K) + (oldvalPot * (1.0 - K));
    oldvalPot = valPot;
    myServo.writeMicroseconds(valPot);              
    delay(10);



     
     
  19. Rustam

    Rustam Нерд

    спасибо. попробую. еще у меня есть ощущение, что серва не докручивает до 180. это в пределах нормы?
     
  20. ANV

    ANV Оракул

    Имеет право :) Т.к. в радиоуправляемых моделях редко когда надо ход 0-180 градусов.
    Это можно исправить, но надо лезть внутрь сервы.