Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Как управлять серводвигателями с помощью Arduino — полное руководство

<основной класс="главный сайт" id="главный">

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

Сервоприводы — отличный выбор для проектов робототехники, автоматизации, радиоуправляемых моделей и так далее. Я уже использовал их во многих своих проектах Arduino, и вы можете ознакомиться с некоторыми из них здесь:

Вы можете посмотреть следующее видео или прочитать письменный учебник ниже. Он включает в себя несколько примеров использования серводвигателя с Arduino, схему подключения и коды. Кроме того, в нем есть руководство по управлению несколькими серводвигателями с помощью Arduino с помощью ШИМ-драйвера PCA9685.

Что такое серводвигатель?

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

В серводвигателях промышленного типа датчик обратной связи по положению обычно представляет собой высокоточный энкодер, в то время как в меньших сервоприводах RC или хобби датчик положения обычно представляет собой простой потенциометр. Фактическое положение, зафиксированное этими устройствами, передается обратно в детектор ошибок, где оно сравнивается с целевым положением. Затем в соответствии с ошибкой контроллер корректирует фактическое положение двигателя, чтобы оно соответствовало целевому положению.

В этом уроке мы подробно рассмотрим серводвигатели для хобби. Мы объясним, как работают эти сервоприводы и как ими управлять с помощью Arduino.

Хобби-сервоприводы – это приводы небольшого размера, которые используются для управления игрушечными радиоуправляемыми машинками, лодками, самолетами и т. д. Они также используются студентами инженерных специальностей для создания прототипов в области робототехники, создания роботизированных манипуляторов, биологически вдохновленных роботов, роботов-гуманоидов и т. д.

Как работают серводвигатели?

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

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

Серводвигатель управляется путем отправки серии импульсов через сигнальную линию. Частота управляющего сигнала должна быть 50 Гц или импульс должен возникать каждые 20 мс. Ширина импульса определяет угловое положение сервопривода, и сервоприводы этого типа обычно могут вращаться на 180 градусов (у них есть физические пределы перемещения).

Как правило, импульсы длительностью 1 мс соответствуют положению 0 градусов, длительностью 1,5 мс — 90 градусам, а длительностью 2 мс — 180 градусам. Хотя минимальная и максимальная продолжительность импульсов иногда может различаться у разных марок и может составлять 0,5 мс для положения 0 градусов и 2,5 мс для положения 180 градусов.

Популярные радиоуправляемые сервоприводы для проектов Arduino

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

Вот две самые популярные среди производителей модели сервоприводов:SG90 Micro Servo и MG996R.

Микросервопривод SG90 технические характеристики:

Остановка крутящего момента 1,2 кг·см при 4,8 В, 1,6 кг·см при 6 В,
Рабочее напряжение 3,5–6 В
Ток без нагрузки 100 мА
Остановить текущий 650 мА
Максимальная скорость 60 градусов за 0,12 с
Вес 9g

Сервопривод MG996R технические характеристики:

Остановка крутящего момента 11 кг.см при 4,8 В, 13 кг.см при 6 В
Рабочее напряжение 4,8–7,2 В
Ток без нагрузки 220 мА при 4,8 В, 250 мА при 6 В
Остановить текущий 650 мА
Максимальная скорость 60 градусов за 0,20 с
Вес 55g

Управление сервоприводом Arduino

Давайте проверим сказанное выше и сделаем практический пример управления сервоприводом для хобби с помощью Arduino. Я буду использовать MG996R, который представляет собой сервопривод с высоким крутящим моментом и металлической передачей с крутящим моментом 10 кг-см. Высокий крутящий момент имеет свою цену, и это ток остановки сервопривода, который составляет 2,5 А. Рабочий ток составляет от 500 мА до 900 мА, а рабочее напряжение - от 4,8 до 7,2 В.

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

Схема

Вот принципиальная схема для этого примера.

Нам просто нужно подключить контакт управления сервопривода к любому цифровому контакту платы Arduino, подключить заземление и положительный провод к внешнему источнику питания 5 В, а также подключить заземление Arduino к заземлению сервопривода.

Если мы используем меньший сервопривод для хобби, S90 Micro Servo, его можно запитать напрямую от контакта 5V Arduino.

S90 Micro Servo имеет более низкое потребление тока, около 100-200 мА рабочего тока без нагрузки, но около 500-700 мА тока остановки. С другой стороны, контакт Arduino 5V может выдавать только около 500 мА при питании от USB или до 1 А при питании от цилиндрического разъема.

Несмотря на то, что эти серводвигатели 9g можно подключить напрямую к Arduino, для более стабильной работы я бы посоветовал всегда использовать для них внешний источник питания.

Компоненты, необходимые для этого примера, можно получить по ссылкам ниже:

  • Серводвигатель MG996R ………………………….
  • или S90 Micro Servo ………..……………………
  • Плата Arduino ……………………………………….
  • Блок питания постоянного тока 5 В, 2 А …………………..…..

Код Arduino для управления серводвигателем

Теперь давайте посмотрим на код Arduino для управления серводвигателем. Код очень простой. Нам просто нужно определить контакт, к которому подключен сервопривод, определить этот контакт как выход, а в секции цикла генерировать импульсы с определенной длительностью и частотой, как мы объясняли ранее.

/*
     Servo Motor Control - 50Hz Pulse Train Generator
           by Dejan, https://howtomechatronics.com
*/

#define servoPin 9

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
   // A pulse each 20ms
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(1450); // Duration of the pusle in microseconds
    digitalWrite(servoPin, LOW);
    delayMicroseconds(18550); // 20ms - duration of the pusle
    // Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
}Code language: Arduino (arduino)

После некоторого тестирования я пришел к следующим значениям длительности импульсов, которые работают с моим сервоприводом. Импульсы длительностью 0,6 мс соответствовали положению 0 градусов, 1,45 мс — 90 градусам и 2,3 мс — 180 градусам.

Я подключил мультиметр последовательно с сервоприводом, чтобы проверить потребляемый ток. Максимальный потребляемый ток, который я заметил, составлял до 0,63 А при остановке. Это потому, что это не оригинальный сервопривод TowerPro MG996R, а более дешевая копия с явно худшими характеристиками.

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

/*
     Servo Motor Control using the Arduino Servo Library
           by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9,600,2300);  // (pin, min, max)
}

void loop() {
  myservo.write(0);  // tell servo to go to a particular angle
  delay(1000);
  
  myservo.write(90);              
  delay(500); 
  
  myservo.write(135);              
  delay(500);
  
  myservo.write(180);              
  delay(1500);                     
}Code language: Arduino (arduino)

Здесь нам просто нужно подключить библиотеку, определить объект сервопривода и с помощью функции attach() определить вывод, к которому подключен сервопривод, а также определить минимальное и максимальное значения длительности импульсов. Затем с помощью функции write() мы просто устанавливаем положение сервопривода от 0 до 180 градусов.

Управление несколькими серводвигателями с помощью Arduino

Библиотека сервоприводов Arduino поддерживает одновременное управление до 12 сервоприводов с помощью большинства плат Arduino и 48 сервоприводов с помощью платы Arduino Mega. Кроме того, управлять несколькими серводвигателями с помощью Arduino так же просто, как и одним.

Вот пример кода для управления несколькими сервоприводами:

/*
     Controlling multiple servo motors with Arduino
     by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

void setup() {
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
}

void loop() {
  // move all servos to position 0
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
  servo4.write(0);
  servo5.write(0);
  delay(2000);

  // move all servos to position 90
  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  delay(2000);

  // move all servos to position 180
  servo1.write(180);
  servo2.write(180);
  servo3.write(180);
  servo4.write(180);
  servo5.write(180);
  delay(2000);
}Code language: Arduino (arduino)

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

В качестве примера вы также можете посмотреть мой проект Arduino Ant Hexapod Robot, в котором я использовал плату Arduino MEGA для управления 22 серводвигателями.

ШИМ-драйвер Arduino и PCA9685/Сервопривод

Есть еще один способ управления сервоприводами с помощью Arduino — использование серводрайвера PCA9685. Это 16-канальный 12-битный ШИМ-драйвер и сервопривод, который взаимодействует с Arduino по шине I2C. Он имеет встроенные часы, поэтому он может управлять 16 сервоприводами независимо от Arduino.

Что еще круче, мы можем последовательно подключить до 62 таких драйверов на одну шину I2C. Таким образом, теоретически мы можем управлять до 992 сервоприводами, используя только два контакта I2C на плате Arduino. 6 контактов выбора адреса используются для установки разных адресов I2C для каждого дополнительного драйвера. Нам просто нужно соединить контактные площадки в соответствии с этой таблицей.

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

Компоненты, необходимые для этого примера, можно получить по ссылкам ниже:

  • Серводвигатель MG996R ………………………….
  • PCA9685 ШИМ-драйвер сервопривода  ……………….
  • Плата Arduino ……………………………………….
  • Блок питания постоянного тока 5 В, 6 А …………………..…..

Теперь давайте посмотрим на код Arduino. Для управления этим сервоприводом мы будем использовать библиотеку PCA9685, которую можно загрузить с GitHub.

Код Arduino и PCA9685

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

Итак, сначала нам нужно включить библиотеки и определить объект PCA9685. Затем с помощью экземпляра Servo_Evaluator определите длительность импульсов или выход ШИМ драйвера. Обратите внимание, что выходные данные 12-битные, или это разрешение 4096 шагов. Таким образом, минимальная длительность импульса 0,5 мс или положение 0 градусов будет соответствовать 102 шагам, а максимальная длительность импульса 2,5 мс или положение 180 градусов — 512 шагам. Но, как объяснялось ранее, эти значения должны быть скорректированы в соответствии с вашим серводвигателем. У меня было значение от 102 до 470, что соответствовало положению от 0 до 180 градусов.

В разделе настройки нам нужно определить тактовую частоту I2C, установить адрес драйвера и установить частоту на 50 Гц.

В разделе циклов с помощью setChannelPWM() и pwmForAngle() функций мы просто устанавливаем сервопривод на нужный угол.

Я подключил второй сервопривод к драйверу, и, как я и ожидал, он не позиционировался так же, как первый, и это потому, что сервоприводы, которые я использую, являются дешевыми копиями и они не такие надежные. Однако это не является большой проблемой, поскольку использование Servo_Evaluator Например, мы можем установить разные выходные параметры для каждого сервопривода. Мы также можем настроить положение под углом 90 градусов, если оно не точно посередине. Таким образом, все сервоприводы будут работать одинаково и располагаться под определенным углом.

Управление множеством сервоприводов с помощью Arduino и драйверов PCA9685

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

Для этого нам нужно соединить драйверы друг с другом и подключить соответствующие контактные площадки выбора адреса. Вот принципиальная схема:

Давайте теперь посмотрим на код Arduino.

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

Таким образом, мы должны создать отдельный объект PCA9685 для каждого драйвера, определить адреса для каждого драйвера, а также установить частоту 50 Гц. Теперь, просто используя функции setChannelPWM() и pwmForAngle(), мы можем настроить любой сервопривод в любом драйвере на любой желаемый угол.

Устранение неполадок

Серводвигатель дрожит и сбрасывает мою плату Arduino

Это обычная проблема с серводвигателями для хобби, микро-сервоприводом SG90 и MG996R. Причина этого в том, что, как упоминалось ранее, они могут потреблять довольно значительный ток, когда находятся под нагрузкой. Это может привести к перезагрузке платы Arduino, особенно если вы питаете сервопривод напрямую от контакта Arduino 5V.

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

Серводвигатель не двигается во всем диапазоне от 0 до 180 градусов

Это еще одна распространенная проблема с сервоприводами для хобби. Как мы объясняли ранее, ширина импульса 1 мс (0,5 мс) соответствует положению 0 градусов, а 2 мс (2,5 мс) — 180 градусам. Однако эти значения могут варьироваться от сервопривода к сервоприводу и у разных производителей.

Чтобы решить эту проблему, нам нужно настроить ширину импульса, который мы отправляем на серводвигатель с помощью Arduino. К счастью, используя библиотеку Arduino Servo, мы можем легко настроить значения ширины импульса в attach(). функция.

attach() Функция может принимать два дополнительных параметра, а это минимальная и максимальная ширина импульса в микросекундах. Значения по умолчанию:544 микросекунды (0,544 миллисекунды) для минимального (0 градусов) угла и 2400 микросекунд (2,4 мс). Таким образом, регулируя эти значения, мы можем точно настроить диапазон момента сервопривода.

  myservo.attach(9,600,2300);  // (pin, min, max)Code language: Arduino (arduino)

Размеры и 3D-модель

Я сделал 3D-модели двух самых популярных серводвигателей:микро-серводвигателя SG90 и серводвигателя MG996R. Вы можете загрузить их по ссылкам ниже.

Микросервопривод SG90

3D-модель:скачать с Thangs.

Размеры:

Серводвигатель MG996R

3D-модель серводвигателя MG996R:скачать с Thangs.

Размеры:

Заключение

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

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

Надеюсь, вам понравился этот урок и вы узнали что-то новое. Не стесняйтесь задавать любые вопросы в разделе комментариев ниже, а также убедитесь, что вы можете использовать мою коллекцию проектов Arduino.

Часто задаваемые вопросы (FAQ)

Как использовать серводвигатель с Arduino?

Использовать серводвигатель с Arduino довольно просто. Серводвигатель имеет всего 3 провода, два из которых GND и 5V для питания, а третий провод — это линия управления, которая идет к плате Arduino.

Может ли Arduino запускать серводвигатели?

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

Сколькими серводвигателями может управлять Arduino?

Используя библиотеку Arduino Servo, мы можем управлять до 12 серводвигателями с большинством плат Arduino и до 48 серводвигателей с платой Arduino Mega. Конечно, нам нужно использовать отдельный источник питания для серводвигателей.


Производственный процесс

  1. Управление монетоприемником с помощью Arduino
  2. Робот с сервомотором избегает препятствий
  3. Arduino с Bluetooth для управления светодиодом!
  4. Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
  5. Управление серводвигателем с помощью Arduino и MPU6050
  6. ThimbleKrox - управление мышью пальцами
  7. Как создавать музыку с помощью Arduino
  8. Как использовать NMEA-0183 с Arduino
  9. Как паять алюминий — полное руководство
  10. Как работает сцепление:полное руководство