Странное поведение сервы.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем pasha08, 2 апр 2013.

  1. pasha08

    pasha08 Нерд

    Написал программу для управления сервой SM-S4315R через сериал рид. Заметил кое что странное, если включить сервопривод против часовой, а потом по часовой то серва идет против часовой, но с низкой скоростью. В чем дело?
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Можно таки вашу программу увидеть?
     
  3. pasha08

    pasha08 Нерд

    Код (Text):
    #include <Servo.h>
    Servo myservo;
    int serial = 0;
    void setup() {
      //
      // 3 - номер ноги
      //
      myservo.attach(3);
      Serial.begin(9600);
      // Длительность импульсов в микросекундах:
      // Рабочий дапазон: 1250 - 1750 мксю. Определено опытным путем.
      // 1250-1470 - против часовой, от максимальной до 0.
      // 1500 - стоп, нейтральная точка регулирулируется встроенным потенциометром
      // 1520-1750 - по часовой, от 0 до максимальной
      // 1751 и больше возможно неправильное вращение
      //
      }
     
    void loop() {
     
      serial = Serial.read();
      if(serial == 49)
      {
        myservo.writeMicroseconds(1750);
      }
     
      if(serial == 50)
      {
        myservo.writeMicroseconds(1250);
      }
     
      if(serial == 51)
      {
        myservo.writeMicroseconds(1500);
      }
       
     
    }
     
  4. Megakoteyka

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

    http://arduino.ru/Reference/Serial/Read
    Сначала убеждаемся, что в порт что-то пришло, и только затем читаем.
    Код (Text):
    if(Serial.available() > 0)
    {
      int value = Serial.read();
      switch(value)
      {
        case 49:
          [SIZE=13px][FONT=Consolas]myservo.writeMicroseconds(1750);[/FONT][/SIZE]
          break;
        case 50:
          [SIZE=13px][FONT=Consolas]myservo.writeMicroseconds(1250);[/FONT][/SIZE]
          break;
        case 51:
          [SIZE=13px][FONT=Consolas]myservo.writeMicroseconds(1500);[/FONT][/SIZE]
          break;
        default:
          break;
      }
    }
    Попробуйте поиграться со значениями, которые Вы отправляете на серву. Или отрегулировать центральную точку на серве.
     
  5. source

    source Нуб

    у меня похожая ситуация была из-за питания
    не хватало тока от встроенного в Arduino стабилизатора
    Решение - запитать сервопривод отдельно. В моем случае, я перенес питающий провод сервопривода (средний) на контакт внешнего источника питания Motor Shield.
     
  6. pasha08

    pasha08 Нерд

    Так я его от Vin запитал! То есть напрямую от источника, без стабилизатора
     
  7. Unixon

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

    А сам Vin откуда питается? Какой ток серва ест?
    По поводу направления это все же скорее программное.
     
  8. pasha08

    pasha08 Нерд

    Vin oт USB. Сколько ест не знаю
     
  9. roggedhorse

    roggedhorse Гик


    Vin согласно первоисточника (http://arduino.cc/en/Main/ArduinoBoardUno) двунаправленный пин:
    "You can supply voltage through this pin, or, if supplying voltage via the power jack, access it through this pin."

    То есть можно записать Ардуино через него, а можно снять с него напряжение, подаваемое через разъем Power.


    Имхо, корректно запитывать нагрузку и Ардуино через раздельные источники.
    При определенных обстоятельствах питающее Ардуину напряжение может просесть, что в свою очередь может вызвать BOD RESET или сбой. Хотя на мой взгляд причина странного поведения сервы иная.
     
  10. pasha08

    pasha08 Нерд

    Я сделал робота на двух сервах, вот там была проблема с просадкой, запитал отдельно и все стало норм
     
  11. Mitrandir

    Mitrandir Гуру

    У ардуины хватит мощи прокормить вот эту серву: http://amperka.ru/collection/servo/product/servo-fs5109m?

    подключил через мега ио шилд к 20-тому пину, когда она подключена ком порт ведет себя как сумасшедший то появляется то исчезает.. мб тока нехватает и ардуино ребутается?

    к серве ничего не подключено
     
  12. Megakoteyka

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

    По идее, не должно ребутиться, хотя очень похоже. А какие-нибудь еще потребители к ардуино подключены?
    Чем питаете?
     
  13. Mitrandir

    Mitrandir Гуру

    Нету других, питаю от компа по юсб, убрал ио шилд, подрубил напрямую та же фигня...
    вот скетч:
    Код (C):
    #define SENSOR_PIN A6
    #include <Servo.h>
     
    Servo srv;
    void setup()
    {
        Serial.begin(9600);
        srv.attach(7);
    }
     
    void loop()
    {
        delay(1000);
        int val = analogRead(SENSOR_PIN);
        val = constrain(val,100,600);
        val = map(val,100,600,0,180);
        srv.write(val);
        Serial.println(val);
    }
    на шестом был дальномер, его отсоединил.

    Кстати можно отсоединять/присоединять провода на включенной ардуине? или погорит?
     
  14. Mitrandir

    Mitrandir Гуру

    Запитал от кроны только диодом моргает..
     
  15. Mitrandir

    Mitrandir Гуру

    сколько напруги можно подать на клемму ио шилда? попробую к нему бп присоединить
     
  16. nailxx

    nailxx Официальный Нерд Администратор

    Можно сколь угодно, но серва имеет вполне конкретные рамки. Для названной: 4,8 — 6 В.
     
  17. Mitrandir

    Mitrandir Гуру

    Что самое странное, если взять пример из IDE все работает...

    но вот так нет:
    Код (C):

    #include <Servo.h>
     
    Servo myservo;  // create servo object to control a servo
                    // a maximum of eight servo objects can be created
     
    int pos = 0;    // variable to store the servo position
     
    void setup()
    {
      Serial.begin(9600);
      myservo.attach(20);  // attaches the servo on pin 9 to the servo object
    }
     
     
    void loop()
    {
     while(Serial.available())
     {
       char c = Serial.read();
       if(c == 'a') myservo.write(0);
       if(c == 's') myservo.write(90);
       if(c == 'd') myservo.write(180);  
       Serial.println(c);
     }
    }
     
  18. _Ev_

    _Ev_ Нерд

    В третьей строке не должно быть 'd' ?
     
  19. Mitrandir

    Mitrandir Гуру

    да опечака, но сути не меняет так и так одинаково не работает
    вначале пытался с примером для лсд экрана скрестить, что бы кнопками управлять сервой, но те же симптомы, серва не крутится, ком порт мигает, но код для лсд работает( счетчик сеунд тикает, экран пишет названия кнопок).

    решил что проблема в питании, снял лсд и перевел кнопки на сериал, но проблема осталась.
     
  20. Mitrandir

    Mitrandir Гуру

    Разобрался с этой проблемой, не хватало питания, подрубил к внешнему питанию на мега ио шилде зарядку от мобилы, перезагружаться перестало.
    Но что-то все равно не корректно работает Servo.write Не на все углы поворачивает http://amperka.ru/collection/servo/product/servo-fs5109m.

    Может у неё тайминги нестандартные?

    если запустить из примера код, где серва в цикле поворачивается на 1 градус каждый шаг, она крутится, если указываю конкретный угол, то нет, если делаю шаг не 1 градус а 10, то тоже не крутится.