"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

пятница, 24 ноября 2017 г.

Подключение сервоприводов к Arduino

Сервопривод это точный исполнитель который получая на вход значение управляющего параметра стремится создать и поддерживать значение на выходе исполнительного элемента. Управляющий сигнал представляет из себя импульсы с нужной нам шириной, которые посылаются с определенной частотой. Для рассматриваемых нами сервоприводов частота посылания импульса почти всегда будет около 50 Гц (это примерно 1 раз в 20мс), а ширина импульса будет лежать в пределе от 544мкс до 2400мкс.

Как видно из картинке, импульс шириной в 544мкс выставит выводной вал в положение 0°, 1520мск соответствует углу в 90°, а 2400мкс соответствует 180°. 
Изменяя ширину импульсов в данных пределах мы сможем точно задавать угол поворота выводного вала, но об этом чуть позже. 


Для подключения к контроллеру от сервопривода тянется 3 провода обжатых стандартным 3 пиновым разъемом с шагом 2.54мм . Цвета проводов могут варьироваться. Коричневый или черный - земля (GND), красный - плюс источника питания (VTG), оранжевый или белый - управляющий сигнал (SIG).


Подключение сервоприводов к Arduino

У старых Ардуин, укомплектованных мегой 8, имеется всего три ШИМ вывода (digital 9,10,11), у Ардуин укомплектованных мегой 168 или 328 их 6 (digital 3,5,6,9,10,11). Семейство Arduino MEGA имеет на своем борту целых 14 ШИМ выводов.
Один 9G сервопривод, потребляющий слабый ток, еще можно подключить напрямую к Arduino.

GND на любой из GND пинов­­­ ардуино
VTG на + 5 вольт на ардуино
SIG на ШИМ (PWM) вывод ардуино
Подключение пары сервоприводов 9G либо одного мощного сервоприводов, к примеру MG995, может вызвать большую просадку напряжения и контроллеру не хватит питания, мега8 очень привередлива и из-за этого контроллеру не хватит напряжения и он отключится. Так же на плате Arduino установлен маломощный стабилизатор не рассчитанный на потребление большого тока и чрезмерное потребление может перегреть его и повредить плату.  Во избежание этого, при использовании мощных серв, либо больше одной слабой, рекомендуем подавать питание на сервопривод отдельно.

• ​ Вариант 1

Можно приобрести блок питания на 5 или 6 вольт, в зависимости от напряжения питания вашего сервопривода и питать сервопривод от него.

• ​ Вариант 2

В случае, если под рукой нет стабилизированного источника питания на 5Вольт, но имеется любой другой источник питания (блок, аккумулятор, сборка из батареек) с напряжением 6-12В, то из него можно легко получить требуемое напряжение для сервопривода. Поможет нам в этом стабилизатор. Рассмотрим самый простой L7805/L7806, требующий минимум деталей внешней обвязки.

Стабилизатор имеет 3 ноги:
1 - Вход. На него подается напряжение от 6 или 7(в зависимости от модели) до 12Вольт
2 - Общий минус
3 - Выход 5 или 6 вольт (в зависимости от  модели)

7805 отечественный аналог КР142ЕН5А - выходное напряжение 5Вольт.
7806 отечественный аналог КР142ЕН5Б - выходное напряжение 6Вольт
Как видно из рисунка необходима установка конденсаторов, можно и без них, но выходное напряжение будет не стабильным. Рекомендуемые номиналы конденсаторов: на входе 0.33 мкФ, на выходе 0.1 мкФ. Я всегда ставлю два электорлита по 100мкФ. Чем больше - тем лучше. 

P.S. Не забудьте соединить земли источников питания 


Программный код управления

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

• ​ Вариант 1

В данном скетче зададим 3 угла поворота выходного вала сервопривода используя управление изменением непосредственно значения ширины импульса. Данный метод самый точный, однако для каждого угла ширину импульсов придется подбирать индивидуально. 
пример программного кода:
//Тестировалось на Arduino IDE 1.0.1
// добавляем библиотеку для работы с сервоприводами
#include <Servo.h> 
// для дальнейшей работы назовем 9 пин как servoPin
#define servoPin 9
// 544 это эталонная длина импульса при котором сервопривод должен принять положение 0°
#define servoMinImp 544 
// 2400 это эталонная длина импульса при котором сервопривод должен принять положение 180°
#define servoMaxImp 2400 
Servo myServo;
void setup()
{
myServo.attach(servoPin, servoMinImp, servoMaxImp);
// устанавливаем пин как вывод управления сервоприводом,
// а также для работы сервопривода непосредственно в диапазоне углов от 0 до 180° задаем мин и макс значения импульсов.
// импульсы с большей или меньшей длиной восприниматься не будут.
// для сервоприводов даже одной партии значения длин импульсов могут отличаться, может быть даже и 584-2440.
// поэкспериментируйте и найдите идеальные длины импульсов конкретно для вашего сервопривода.
}
void loop()
{
  // устанавливаем качалку сервопривода в положение 0°(т.к.импульс равен 544мкс)
  myServo.writeMicroseconds(servoMinImp);
  delay(2000);
  // в данной функции можно задавать длины импульсов непосредственно числами.
  // 90°(т.к.vимпульс равен 1520мкс)
  myServo.writeMicroseconds(1520);
  delay(2000);
  // 180°(т.к. импульс равен 2400мкс)
  myServo.writeMicroseconds(servoMaxImp);
  delay(2000);
}
КАК ЭТО ВЫГЛЯДИТ В ДРАКОНЕ
Третий квадрат модуль
Третий квадрат Setup
Третий квадрат Loop
Листинг


• ​ Вариант 2

В этом же скетче зададим теже 3 угла поворота выходного вала сервопривода используя команду myservo.write. В данной команде мы уже не задаем ширину импульсов, а просто пишем нужный нам угол. Данный вариант намного удобнее, однако настройка не такая точная как при первом.
пример программного кода:
//Тестировалось на Arduino IDE 1.0.1
#include <Servo.h> 
Servo myservo;

void setup() { 
  // устанавливаем пин как вывод управления сервой  
  myservo.attach(9);
}

void loop() {  
  // устанавливаем угол 0°  
  myservo.write(0);  
  delay(2000);
  // устанавливаем угол 90°  
  myservo.write(90);  
  delay(2000);
  // устанавливаем угол 180°  
  myservo.write(180);  
  delay(2000);
}







Также вам могут понадобиться следующие команды:

myservo.read();
Считывает текущий угол поворота сервопривода, возвращает значение типа int — угол от 0 до 180 градусов.

myservo.attached();
Проверяем, привязан ли сервопривод. Возвращает логическое значение bool.

myservo.detach();
Отключает сервопривод от пина.

Цикл статей о сервоприводах: