arduino uno и сервопривод

buffol
Offline
Зарегистрирован: 14.10.2011

Хотел заставить серву двигаться. Простой код: сервопривод должен повернуться на 180 градусов.

Подключаю вот так: красный провод +5, коричневый gnd, желтый A0. 

Когда даю питание (usb) серва в течении доль секунд дергается и все. Пробовал 2 сервопривода, оба ведут себя одинаково.

 

 

 

 

Заранее спасибо.

Mogalkov
Offline
Зарегистрирован: 23.06.2011

Почему А0? серва подключается к любому цыфровому выходу.

step962
Offline
Зарегистрирован: 23.05.2011

buffol пишет:

Подключаю вот так: красный провод +5, коричневый gnd, желтый A0. 

Когда даю питание (usb) серва в течении доль секунд дергается и все. Пробовал 2 сервопривода, оба ведут себя одинаково.

Скорее всего - мощности источника не хватает...

Подключите так:

коричневый провод - gnd

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

красный провод соедините с плюсом ВНЕШНЕГО источника питания 5-7 В, способного выдавать ток 1-2 А.

и еще одним проводом минус внешнего источника соедините с gnd.

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Учитывая попытку подключить серву к A0, думаю будет не лишним если вы приведете тут  "Простой код: сервопривод должен повернуться на 180 градусов.". 

Попробуйте собрать, выполнить стандартный пример http://arduino.cc/en/Tutorial/Sweep

Так же, если вы не пытаетесь делать ШИМ программно, почитайте тут arduino.ru/Reference/AnalogWrite на каких портах ваша ардуина поддерживает ШИМ (как видидте на A0 не поддерживает ни одна).

Mogalkov
Offline
Зарегистрирован: 23.06.2011

Причем тут шим? Для управления сервой шим не нужен.

Берешь любой цифровой выход, запускаешь екземпл серво, меняешь в нем номер выхода на свой.

 

robocraft.ru/blog/arduino/245.html

leshak
Offline
Зарегистрирован: 29.09.2011

 >Причем тут шим? Для управления сервой шим не нужен.

Да ну? А что, по вашему подается на управляющий вход сервы? Псалмы? Именно PWM. И он должен "откуда-то братся".

Братся он может либо из "аппаратных пинов", либо нужно "программно". Если апаратно то вам нужно смотреть на каких пинах он бывает. 

Что-бы не морочится со всем этим, действительно можно взять библиотеку, которая все эти "нюансы" учтет за нас. Если вы заметили то я тоже посоветовал просто "собрать пример" на Servo Library.

Кстати по вашей ссылке читаем ""На платах, отличных от Mega, использование библиотеки отключает возможность использования analogWrite() (PWM) на пинах 9 и 10...". Наверное это тоже от того что "для управления сервой шим не причем" ;).

Библиотека безусловно удобный путь, но не единственно возможный. Вот почитайте как это бывает без библиотеки robocraft.ru/blog/mechanics/240.html 

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

step962
Offline
Зарегистрирован: 23.05.2011

leshak пишет:

Да ну? А что, по вашему подается на управляющий вход сервы? Псалмы? Именно PWM. И он должен "откуда-то братся".

Не совсем так.

Я бы даже сказал - в мире Arduino совсем не так. Ибо в мире Arduino PWM (то, что генерируется с использованием функции AnalogWrite) - это пульсирующий сигнал с частотой импульсов около 500 Гц (период 2 мс) с коэффициентом заполнения от 0% до 100%.

А сервоприводы управляются пульсирующим сигналом с частотой импульсов 50 Гц (период 20 мс) и длительностью импульса от 0,9 до 2,1 мс (к-т заполнения примерно 5%-10%).

Так что тот ШИМ-сигнал, который можно сгенерировать на аналоговых выводах ардуины стандартными средствами (AnalogWrite), лежит далеко за диапазоном частот, подходящим для сервомашинок. А посему использование выводов Ax для управления сервомашинкой не имеет тех преимуществ перед выводами Dx, на которые, надо полагать, надеялся топикстартер.

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 В конечном итоге это все-таки PWM :) . Другое дело, как выяснилось, что сгенерировать для сервы такой PWM "как нужно", аппаратно сложней чем я думал (но думаю все-таки возможно, правда не через AnalogWrite а уже напрямую через порты, руцями настраивать делители и проч. темный лес).

Но, в любом случае, спасибо за разъяснение отличий. Теперь буду лучше понимать область применимости "AnalogWrite".

buffol
Offline
Зарегистрирован: 14.10.2011

Большое спасибо за ответы, но проблема не решена.

 

Я пробовал собрать пример, который показал leshak, но как только я подключал сервопривод к ардуино, как показано на рисунке, светодиодик "on" погасал. Такое ощущение, что поступаемого тока хватало только на сервопривод. Но тк я подключал к usb, то напряжение нормальное.

В общем думаю нужен внешний источник. Что может им послужить? 4АА батарейки потянут?

 

 

 

Заранее спасибо.

step962
Offline
Зарегистрирован: 23.05.2011

buffol пишет:

В общем думаю нужен внешний источник. Что может им послужить? 4АА батарейки потянут?

Почитайте это.

crabne
Offline
Зарегистрирован: 15.12.2011

 Добрый день, 

простите за ламеркий вопрос - только начинаю осваивать Arduino Mega 

1. Подключил контроллер и залил скетч-пример sweep. Но серва не проходит угол 180 град. Градусов 165-170, не больше. Как такое может быть? Как-то можно исправить (Серва 9g с dealextreme.com)

Mastino
Offline
Зарегистрирован: 03.12.2011

crabne пишет:

 Добрый день, 

простите за ламеркий вопрос - только начинаю осваивать Arduino Mega 

1. Подключил контроллер и залил скетч-пример sweep. Но серва не проходит угол 180 град. Градусов 165-170, не больше. Как такое может быть? Как-то можно исправить (Серва 9g с dealextreme.com)

у каждой серво свой механический предел движения.

crabne
Offline
Зарегистрирован: 15.12.2011

 Mastino, спасибо =)

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

( может угол 0 - это всегда ноль, а противоположное крайнее положение надо искать?

или наоборот 180 - это всегда 180,  и противоположное положение надо искать?)
 

Mastino
Offline
Зарегистрирован: 03.12.2011

crabne пишет:

 Mastino, спасибо =)

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

( может угол 0 - это всегда ноль, а противоположное крайнее положение надо искать?

или наоборот 180 - это всегда 180,  и противоположное положение надо искать?)
 

начинай с 90 и по десять градусов иди вверх, если конечная точка будет 160, то начальная 20..и так дале

crabne
Offline
Зарегистрирован: 15.12.2011

 Mastino, понял спасибо =)

А с кодом не поможете? Чет не хочет мой первый скетч работать =) Вроде слепил его из кусков примеров...

// прога для поворота сервы командой в СОМ порт

#include <Servo.h>

Servo serva; // объявить серву
int angle = 90; // задать переменную для угла

void setup ()
{
Serial.begin(9600); // открыть порт
serva.attach(9); // присоединить серву к пину 9
serva.write(angle); // поставить серву в центральное положение
Serial.println("I am ready"); //
}
void loop ()
{
angle = Serial.read(); // cчитать СОМ порт
serva.write(angle); // отправить на серву команду
delay(1000); // ждем секунду
Serial.print("servo is in position: ");
Serial.println(angle, DEC); // написать в порте че-нить

}

 

Mastino
Offline
Зарегистрирован: 03.12.2011
// zoomkat 12-13-11 serial servo (2) test
// for writeMicroseconds, use a value like 1500
// for IDE 1.0
// Powering a servo from the arduino usually DOES NOT WORK.
// two servo setup with two servo commands
// send eight character string like 15001500 or 14501550

#include <Servo.h> 
String readString, servo1, servo2;
Servo myservo1;  // create servo object to control a servo 
Servo myservo2;

void setup() {
  Serial.begin(9600);
  myservo1.attach(6);  //the pin for the servo control 
  myservo2.attach(7);
  Serial.println("two-servo-test-1.0"); // so I can keep track of what is loaded
}

void loop() {

  while (Serial.available()) {
    delay(3);  //delay to allow buffer to fill 
    if (Serial.available() >0) {
      char c = Serial.read();  //gets one byte from serial buffer
      readString += c; //makes the string readString
    } 
  }

  if (readString.length() >0) {
      Serial.println(readString); //see what was received
      
      // expect a string like 07002100 containing the two servo positions      
      servo1 = readString.substring(0, 4); //get the first four characters
      servo2 = readString.substring(4, 8); //get the next four characters 
      
      Serial.println(servo1);  //print to serial monitor to see results
      Serial.println(servo2);

      int n1 = servo1.toInt();
      int n2 = servo2.toInt();
      
      myservo1.writeMicroseconds(n1); //set servo position 
      myservo2.writeMicroseconds(n2);
    readString="";
  } 
}
triada13
Offline
Зарегистрирован: 04.01.2013

Решил поднять тему, потому как пока не нашел ответ на мучающий меня вопрос. Пытаюсь освоить сервоприводы, подключил, залил скетч из примера, серва двигается, но не 180 градусов а примерно 90. Серва которую применяю фирмы Hitec HC55 ее физичиский ход 0-180 градусов,  знаю это не по наслышке, такие у меня стоят на самолете. Может кто подскажет как от нее добиться полного хода. Вот код который я использую:

// Sweep
// by BARRAGAN <http://barraganstudio.com> 
// This example code is in the public domain.


#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() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 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(20);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(20);                       // waits 15ms for the servo to reach the position 
  } 
} 

 

leshak
Offline
Зарегистрирован: 29.09.2011

triada13 пишет:

Решил поднять тему, потому как пока не нашел ответ на мучающий меня вопрос. Пытаюсь освоить сервоприводы, подключил, залил скетч из примера, серва двигается, но не 180 градусов а примерно 90. 

http://arduino.ru/Reference/Library/Servo/attach

второй и третий параметры

triada13
Offline
Зарегистрирован: 04.01.2013

Спасибо за подсказку, уже читаю.

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

GND=A0      Вот и всё... 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Извиняюсь, не в ту ветку залез...

FranCuZik
Offline
Зарегистрирован: 16.01.2014

leshak пишет:

triada13 пишет:

Решил поднять тему, потому как пока не нашел ответ на мучающий меня вопрос. Пытаюсь освоить сервоприводы, подключил, залил скетч из примера, серва двигается, но не 180 градусов а примерно 90. 

http://arduino.ru/Reference/Library/Servo/attach

второй и третий параметры

Leshak говорит истину, если у Вас есть вопросы: "ПОчему серва дергается в крайних положениях?"

Ответ кроется в указание ширины импульса серве. Или минимальный и максимальный градус. По ссылке выше можно посмотреть где и как вписать их. (Спасибо Leshak'у)

И все, кто питает серву от ардуины - ничего не получится. Необходимо доп. питание (как сказано выше 1-2 А). Не забывайте!