Примеры работы с Arduino
Схема подключения
Многие сервоприводы могут быть подключены к Arduino непосредственно. Для этого от них идёт шлейф из трёх проводов:
- красный — питание; подключается к контакту или напрямую к источнику питания
- коричневый или чёрный — земля
- жёлтый или белый — сигнал; подключается к цифровому выходу Arduino.
Для подключения к Arduino будет удобно воспользоваться платой-расширителем портов, такой как Troyka Shield. Хотя с несколькими дополнительными проводами можно подключить серву и через breadboard или непосредственно к контактам Arduino.
Можно генерировать управляющие импульсы самостоятельно, но это настолько распространённая задача, что для её упрощения существует стандартная библиотека .
Ограничение по питанию
Обычный хобби-сервопривод во время работы потребляет более 100 мА. При этом Arduino способно выдавать до 500 мА. Поэтому, если вам в проекте необходимо использовать мощный сервопривод, есть смысл задуматься о выделении его в контур с дополнительным питанием.
Рассмотрим на примере подключения 12V сервопривода:
Ограничение по количеству подключаемых сервоприводов
На большинстве плат Arduino библиотека поддерживает управление не более 12 сервоприводами, на Arduino Mega это число вырастает до значения 48. При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию на 9 и 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет. На Arduino Mega можно подключить до 12 сервоприводов без нарушения функционирования ШИМ/PWM, при использовании большего количества сервоприводов мы не сможем использовать на 11 и 12 контактах.
Пример использования библиотеки Servo
- servo_example.ino
-
// подключаем библиотеку для работы с сервоприводами #include <Servo.h> // создаём объект для управления сервоприводом Servo myservo; void setup() { // подключаем сервопривод к 9 пину myservo.attach(9); } void loop() { // устанавливаем сервопривод в серединное положение myservo.write(90); delay(500); // устанавливаем сервопривод в крайнее левое положение myservo.write(); delay(500); // устанавливаем сервопривод в крайнее правое положение myservo.write(180); delay(500); }
По аналогии подключим 2 сервопривода
- 2servo_example.ino
-
// подключаем библиотеку для работы с сервоприводами #include <Servo.h> // создаём объекты для управления сервоприводами Servo myservo1; Servo myservo2; void setup() { // подключаем сервоприводы к 11 и 12 пину myservo1.attach(11); myservo2.attach(12); } void loop() { // устанавливаем сервопривод в серединное положение myservo1.write(90); myservo2.write(90); delay(500); // устанавливаем сервопривод в крайнее левое положение myservo1.write(); myservo2.write(); delay(500); // устанавливаем сервопривод в крайнее правое положение myservo1.write(180); myservo2.write(180); delay(500); }
Пример использования библиотеки Servo
- servo2_example.ino
-
// подключаем библиотеку для работы с сервоприводами // данная библиотека совместима с библиотекой «VirtualWire» // для работы с приёмником и передатчиком на 433 МГц #include <Servo2.h> // создаём объект для управления сервоприводом Servo2 myservo; void setup() { // подключаем сервопривод к 9 пину myservo.attach(9); } void loop() { // устанавливаем сервопривод в серединное положение myservo.write(90); delay(500); // устанавливаем сервопривод в крайнее левое положение myservo.write(); delay(500); // устанавливаем сервопривод в крайнее правое положение myservo.write(180); delay(500); }
Характеристики сервопривода SG90:
- Вес сервопривода: 9 гр
- Габариты: 21,5мм х 11,8мм х 22,7мм
- Напряжение питания: от 4,8В до 6В
- Крутящий момент: 1,2 кг*см при напряжении питания 4,7В
- Время поворота на угол 60 гр: 0,12 сек. при напряжении питания 4,7В
- Рабочая температура: -30°C…+60°C
Сервоприводы имеют высокие требования к току, поэтому при использовании более одного сервопривода с Ардуино важно подключать их силовые провода (Vcc и GND) к внешнему источнику питания, поскольку источник питания Ардуино не сможет обеспечить ток, необходимый для этих сервоприводов. Поскольку в этом учебном пособии мы будем использовать только один сервопривод, то он будет прекрасно работать от источника питания самого Ардуино
Поскольку в этом учебном пособии мы будем использовать только один сервопривод, то он будет прекрасно работать от источника питания самого Ардуино.
Сервопривод SG90Arduino UNO
Схема подключения сервопривода SG90 к Ардуино
Схема подключения довольно проста, так как к Ардуино мы будем подключать только сервопривод.
Как мы уже сказали ранее — сервомоторы обычно имеют три провода:
- VCC — плюс источника питания (красный провод).
- GND — минус источника питания (черный или коричневый).
- Signal — сигнальный провод (желтый или оранжевый).
Сигнальный провод (обычно оранжевого цвета) — это тот, который используется для подачи управляющего сигнала с микроконтроллера, для того чтобы вращать вал на определенный угол.
Цифровой мультиметр AN8009
Большой ЖК-дисплей с подсветкой, 9999 отсчетов, измерение TrueRMS…
Подробнее
Подключите сервопривод к Ардуино, как показано на схеме ниже.
Сигнальный провод подключен к цифровому выводу D8 (ШИМ) Ардуино, поскольку управляющие сигналы от микроконтроллера Ардуино к сервоприводу отправляются в качестве импульсов ШИМ.
Скетч управления сервоприводом SG90
Скетч для этого проекта довольно прост благодаря функциональной и компактной библиотеке servo.h, разработанной командой Ардуино для облегчения использования серводвигателей в проектах Ардуино.
Библиотека упрощает поворот вала сервопривода под разными углами с помощью всего одной команды. Библиотека поставляется с предустановленной Arduino IDE, и поэтому нет необходимости в ее скачивании и установки.
Начинаем код проекта с подключения библиотек, которые мы будем использовать, в нашем случае это библиотека servo.h.
#include <Servo.h>
Затем мы создаем объект библиотеки, который будет использоваться в качестве ссылки для управления нашим сервомотором по всему коду.
Servo servo;
После этого переходим к функции void setup (). Мы запускаем функцию, прикрепляя объект сервопривода к выводу D8 микроконтроллера, после чего мы центрируем сервопривод, поворачивая его на ноль градусов.
void setup() { servo.attach(8); servo.write(angle); }
Выполнив это, мы можем поворачивать вал сервопривода в любом направлении и делать это мы будем внутри функции void loop().
Благодаря библиотеке servo.h, все что нам нужно сделать, чтобы повернуть сервопривод на нужный угол — это передать желаемый угол в качестве аргумента в функцию servo.write ().
Чтобы продемонстрировать это, используем цикл с несколькими углами поворота в одном направлении, и другой цикл в обратном направлении (для возврата)
void loop() { // поворот от 0 до 180 градусов for(angle = 10; angle < 180; angle++) { servo.write(angle); delay(15); } // возврат от 180 to 0 градусов for(angle = 180; angle > 10; angle—) { servo.write(angle); delay(15); } }
Полный скетч проекта будет выглядеть следующим образом:
#include <Servo.h> Servo servo; int angle = 10; void setup() { servo.attach(8); servo.write(angle); } void loop() { // поворот от 0 до 180 градусов for(angle = 10; angle < 180; angle++) { servo.write(angle); delay(15); } // возврат от 180 to 0 градусов for(angle = 180; angle > 10; angle—) { servo.write(angle); delay(15); } }
Скопируйте приведенный выше код и загрузите его в Ардуино и через несколько секунд вы увидите вращение сервомотора то в одну, то в другую сторону.
Сфера применения
На схеме трехходовой клапан установлен на обратке
Регулировка температуры в помещении чаще всего выполняется двумя способами:
- с помощью терморегуляторов – оптимальный вариант в случае, если используются радиаторы отопления. В таком случае регуляторы устанавливаются перед каждой батареей и автоматически регулируют поступление в радиатор теплоносителя;
- с помощью сервопривода – чаще всего используется при необходимости регулировки температуры теплых полов.
Один из вариантов схемы подключения теплого пола
В случае с теплыми полами особенно важно удерживать теплоноситель не выше определенной температуры. Если, например, регулировать подачу теплоносителя с помощью обычных терморегуляторов, то при пуске системы может возникнуть ситуация, когда в трубы пойдет горячая вода. В результате по полу будет просто некомфортно ходить какое-то время, а возможен и выход из строя части труб
В результате по полу будет просто некомфортно ходить какое-то время, а возможен и выход из строя части труб.
Установка сервопривода с 3-ходовым клапаном до коллектора позволит избежать этого. Обычно так и поступаю, тем более что цена такого устройства минимальна.
Удаленное управление сервоприводом по последовательному порту Ардуино
Иногда нужно удаленно управлять исполнителем, подавая команды по последовательному порту UART Ардуино. Управлять можно с ПК и мобильных телефонов, а также с других устройств по USB, UART или Bluetooth.
Схема не отличается от первой:
Подключение сервопривода к Ардуино для удаленного управления по USB
Программа принимает по последовательному порту строку с числом равным углу требуемого отклонения сервопривода, а затем постепенно переводит рычаг на нужный угол. Затем опять ждет команд. Благодаря этому, есть возможность определить угол поворота сервопривода.
#include <Servo.h> #define servo_pin 8 #define servo_speed 10 // Задержка перемещения рычага сервы uint32_t servo_T = 0; byte pos=90, newpos=90; // текущая и требуемая позиция сервы Servo servo1; void setup() { servo1.attach(servo_pin); servo_T = millis(); Serial.begin(9600); // Запуск последовательного порта servo1.write(pos); // Установка сервы на угол 90* delay(1000); // Ждем пока серва перейдет на нужный угол (не гарантировано!) Serial.println("Ready to command!"); // Подача сообщения о готовности в порт } void loop() { if ( Serial.available()) { // Если принята команда newpos = Serial.parseInt(); // Принять полученную строку и перевести её в целое число newpos = constrain(newpos, 0, 180); // Ограничить число 0…180 } if ((newpos != pos)&&(millis() - servo_T >= servo_speed)) { // Прерывание для обработки перемещения сервы, если позиция отличается servo_T = millis(); if (newpos > pos){ // Если новая позиция больше текущей pos++; // Повысить текущую на 1 } else { // …иначе pos--; // Понизить на 1 } pos = constrain(pos, 0, 180); // Ограничить число 0…180 servo1.write(pos); // Перемесить серву на полученный угол Serial.print("Status: "); // Показать текущий угол оператору через порт Serial.println(pos); if (pos == newpos) Serial.println("Completed!"); // Если угол достиг цели – уведомить оператора } }
Управление может осуществляться через монитор последовательного порта Ардуино, терминал порта или терминал Bluetooth на мобильном устройстве, если подключить Bluetooth модуль к Ардуино.
(с) Роман Исаков, 2020
Области использования устройства
В современном мире, когда автоматизация заняла прочные позиции во всех областях машиностроения, конструкция всех механизмов заметно унифицировалась. При этом применяются современные индивидуальные приводы.
Для того, чтобы понять, сервопривод, что это такое, следует знать сферу применения устройства.
Устройства содержат прецизионные конструкции поддержания скорости в промышленных роботах и станках с высокой точностью. Они монтируются на сверлильных оборудованиях, в различных системах транспорта и механизмах вспомогательного характера.
Самое широкое применение приборы нашли в следующих сферах:
- изготовление бумаги и упаковок;
- изготовление листов из металла;
- обрабатывание материалов;
- производство транспортного оборудования;
- деревообрабатывающая промышленность;
- изготовление стройматериалов.
Сервопривод SG90
Характеристики и подключение SG-90
Если вы собрались купить самый дешевый и простой сервопривод, то SG 90 будет лушим вариантом Этот серво чаще всего используется в управлении небольшими легкими механизмами с углом поворота от 0° до 180°.
Технические характеристики SG90:
- Скорость отработки команды 0,12с/60 градусов;
- Питание 4,8В;
- Рабочие температуры от -30С до 60 С;
- Размеры 3,2 х 1,2 х 3 см;
- Вес 9 г.
Описание SG90
Цвета проводов стандартные. Сервопривод стоит недорого, он не обеспечивает точных настроек начальных и конечных позиций. Для того, чтобы избежать лишних перегрузок и характерного треска в положении 0 и 180 градусов лучше выставлять крайние точки в 10° и 170°
При работе устройства важно следить за напряжением питания. При сильном завышении этого показателя могут повредиться механические элементы зубчатых механизмов
Управление
Для того чтобы серводвигатель мог функционировать в нём используют специальную систему, основанную на G-кодах. Упомянутые коды представлены набором управляющих команд, которые заложены в программе.
Например, в системе ЧПУ сервопривод контактирует с инверторами, способными изменять напряжение, которое соответствует входному, в обмотке электромотора.
Вся система серводвигателя управляется/контролируется блоком управления, из которого поступают различные команды, например, передвижения по оси Х или У. После подачи команды в инверторе создаётся определённое напряжение, питающее привод. Затем серводвигатель начинает своё круговое движение, связанное с главным исполнительным элементом механизма и энкодером.
Энкодер создаёт множество импульсов, которые подсчитываются блоком, осуществляемыми управление устройством. Для каждой позиции исполнительного элемента в программе установлено определённое количество импульсов. Так под их влиянием либо подаётся напряжение на моторчик, либо прекращается.
Библиотека Servo
Можно генерировать управляющие импульсы самостоятельно, но это настолько распространённая задача, что для её упрощения существует стандартная библиотека Servo.
Сервопривод постоянного вращения можно управлять с помощью библиотек Servo или Servo2. Отличие заключается в том, что функция Servo.write(angle) задаёт не угол, а скорость вращения привода.
Библиотека Servo позволяет осуществлять программное управление сервоприводами. Управление осуществляется следующими функциями:
В библиотеке Servo для Arduino по умолчанию выставлены следующие значения длин импульса: 544 мкс — для 0° и 2400 мкс — для 180°.
Пример подключения двух сервоприводов.
Библиотека Servo не совместима с библиотекой VirtualWire для работы с приёмником и передатчиком на 433 МГц, так как они используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2. Все методы библиотеки Servo2 совпадают с методами Servo.
При работе с сервоприводами на 360 градусов функции работают по другому.
Функция Arduino | Сервопривод 180° | Сервопривод 360° |
---|---|---|
Servo.write(0) | Крайне левое положение | Полный ход в одном направлении |
Servo.write(90) | Среднее положение | Остановка сервопривода |
Servo.write(180) | Крайне правое положение | Полный ход в обратном направлении |
Применение сервоприводов
Сегодня они широко используются в самых разных областях:
- в робототехнике и при создании манипуляторов; чтобы управлять ими, в свою очередь, берут аппаратно-программные средства ардуино;
- для реализации системы теплого пола – они помогают автоматически регулировать температуру, понижая или повышая ее по мере необходимости;
- в автомобилестроении – для интеграции с замками, подачи жидкости на печку, переключения скоростей в АКПП;
- в грузовом оборудовании – задают режимы захвата, подъема, транспортировки, опускания и отпускания предметов самого разного веса и габаритов.
Это далеко не все возможные сферы и ниши – данные силовые агрегаты, по сути, актуальны везде, где только требуется точно контролировать движение вала.
Introduction: Arduino Servo Motors
By cornelamFollow
More by the author:
About: Inventor, Author, Head of Innovation, Entrepreneur, Forbes 30 Under 30, 10 Outstanding Young Persons of the World
More About cornelam »
Servo motors are great devices that can turn to a specified position.
Usually, they have a servo arm that can turn 180 degrees. Using the Arduino, we can tell a servo to go to a specified position and it will go there. As simple as that!
Servo motors were first used in the Remote Control (RC) world, usually to control the steering of RC cars or the flaps on a RC plane. With time, they found their uses in robotics, automation, and of course, the Arduino world.
Here we will see how to connect a servo motor and then how to turn it to different positions.
The first motor I ever connected to an Arduino, seven years ago, was a Servo motor. Nostalgic moment over, back to work!
We will need the following things:
- An Arduino board connected to a computer via USB
- A servo motor
- Jumper wires
Дополнительные возможности
Управление сервоприводами на Ардуино очень простое и мы можем использовать еще несколько интересных фишек.
Контроль точного времени импульса
Ардуино имеет встроенную функцию servo.write(градусы), которая упрощает управление сервомоторами. Однако не все сервоприводы соблюдают одинаковые тайминги для всех позиций. Обычно 1 миллисекунда означает 0 градусов, 1,5 миллисекунды — 90 градусов, и, конечно, 2 миллисекунды означают 180 градусов. Некоторые сервоприводы имеют меньший или больший диапазон.
Для лучшего контроля мы можем использовать функцию servo.writeMicroseconds(микросекунды), которая в качестве параметра принимает точное количество микросекунд. Помните, 1 миллисекунда равна 1000 мкс.
Несколько сервоприводов
Чтобы использовать более одного сервопривода в Ардуино нам нужно объявить несколько серво-объектов, прикрепить разные контакты к каждому из них и обратиться к каждому индивидуально. Итак, нам нужно объявить объекты — столько сколько нам нужно:
// Создаем объекты Servo Servo1, Servo2, Servo3;
Затем нам нужно прикрепить каждый объект к сервомотору. Помните, что каждый сервопривод использует отдельный пин:
Servo1.attach(servoPin1); Servo2.attach(servoPin2); Servo3.attach(servoPin3);
В конце концов, мы должны обращаться к каждому объекту индивидуально:
Servo1.write(0); // Задать для Servo 1 позицию в 0 градусов Servo2.write(90); // Задать для Servo 2 позицию в 90 градусов
Подключение. Земля сервоприводов идёт на GND Arduino, питание на 5В или VIN (в зависимости от входа). И, в конце концов, каждый привод должен быть подключен к отдельному цифровому выводу.
Вопреки распространенному мнению, сервоприводами не нужно управлять через пины PWM — любой цифровой пин подойдет и будет работать.
Управление мышью
Чтобы управлять серво с помощью мыши, вот простой код:
/** * Servocontrol (derived from processing Mouse 1D example.) * * Updated 24 November 2007 */ // Use the included processing code serial library import processing.serial.*; int gx = 15; int gy = 35; int spos=90; float leftColor = 0.0; float rightColor = 0.0; Serial port; // The serial port void setup() { size(720, 720); colorMode(RGB, 1.0); noStroke(); rectMode(CENTER); frameRate(100); println(Serial.list()); // List COM-ports //select second com-port from the list port = new Serial(this, Serial.list(), 19200); } void draw() { background(0.0); update(mouseX); fill(mouseX/4); rect(150, 320, gx*2, gx*2); fill(180 — (mouseX/4)); rect(450, 320, gy*2, gy*2); } void update(int x) { //Calculate servo postion from mouseX spos= x/4; //Output the servo position ( from 0 to 180) port.write(«s»+spos); // Just some graphics leftColor = -0.002 * x/2 + 0.06; rightColor = 0.002 * x/2 + 0.06; gx = x/2; gy = 100-x/2; }
Вам не обязательно использовать этот код, вы также можете отправлять команды на плату arduino с серийного монитора Arduino IDE. Позиция сервопривода от 0 до 180 — это команды 0 и 180 сек соответственно.
В основном этот код берет позицию mouseX (от 0 до 720) и делит на 4, чтобы получить угол для сервопривода (0-180). Наконец, значение выводится на последовательный порт с префиксом ‘s’.
Примечание: «s» на самом деле должен быть суффиксом, но поскольку это повторяется, это не имеет значения для результата.
Не забудьте сначала проверить с помощью println(Serial.list ()) COM-порт, который следует использовать.
Сервоприводы с непрерывным вращением
Существует специальные типы сервоприводов, обозначенные как сервоприводы непрерывного вращения. В то время как нормальный сервопривод переходит в определенную позицию в зависимости от входного сигнала, сервопривод непрерывного вращения вращается по часовой стрелке или против часовой стрелки со скоростью, пропорциональной сигналу.
Например, функция Servo1.write(0) заставит сервомотор вращаться против часовой стрелки на полной скорости. Функция Servo1.write(90) остановит двигатель, а Servo1.write(180) будет вращать вал по часовой стрелке на полной скорости.
Таким сервоприводам нашли несколько применений, но нужно понимать, что они достаточно медленные. Один из вариантов — микроволновая печь, когда есть необходимость в двигателе для вращения продуктов питания. Но будьте осторожны, микроволны — опасное дело!
Процесс рекуперации
Зачастую запускается при переключении режимов работы сервомотора: что это такое? Это возвратная энергия, которая выделяется при смене знака (направления движения) относительно вращающего момента. Обычно она не слишком большая, но все равно собирается на конденсаторах, увеличивая, таким образом, напряжение на звене постоянного тока.
В тех же случаях, когда данное неравенство абсолютных значений достигнет серьезной отметки, пороговый уровень емкости шины будет пробит. И тогда все излишки будут сброшены в тормозной резистор.
Мы постарались рассмотреть все особенности данных механизмов и подчеркнуть удобство и перспективность их использования. Предлагаем также взглянуть на схемы сервоприводов, фото и видеоролики на эту тему – чтобы вы могли дополнить свое представление.
Как это работает
Сервоприводы Arduino – это умные устройства. Используя только один входной пин, они получают значения для позиционирования от микроконтроллера и переходят в это положение. Как можно увидеть на рисунке в самом начале статьи внутри они имеют двигатель и цепь обратной связи, которая гарантирует, что вал/рычаг сервопривода достигнет желаемого положения.
Но какой сигнал сервомоторы получают на входе? Это прямоугольная волна, подобная PWM (англ. – pulse-width modulation, широтно-импульсная модуляция). Каждый цикл в сигнале длится 20 миллисекунд, и большая часть времени в значении LOW. В начале каждого цикла значение сигнала становится HIGH на время от 1 до 2 миллисекунд.
При 1 миллисекунде она составляет 0 градусов, а при 2 миллисекундах – 180 градусов, а в промежутке значение от 0 до 180. Это очень хороший и надежный метод. График выше упрощает понимание.
Виды
Сервоприводы могут быть произведены в самых различных комплектациях. Эти устройства разделяют по принципу движения:
Вращательное
Представлено двумя вариациями: синхронной и асинхронной. Синхронный вариант помогает задать высокоточные параметры скорости вращения, углов поворота и ускорения. По сравнению с асинхронным скорость набирают быстрее, поэтому и стоят больше;
Асинхронный привод отличается способностью поддержания с большой точностью необходимой скорости даже в условиях низких оборотов.
Линейное
Также делится на два варианта: плоские и круглые. Двигатели данного типа развивают достаточно высокое ускорение (70 метров в секунду).
Ещё их выделяют по способу действия:
- Электромеханические механизмы – формирование движений происходит за счёт электродвигателя с редуктором;
- Электрогидромеханические – у них любое движение создаётся с участием системы поршня-цилиндра. В сравнении с электромеханическим приводом они обладают отличительно высоким быстродействием.
Заключение
Сервоприводы играют очень важную роль для многих проектов Ардуино, от робототехнических до систем умного дома. Все, что связано с движением, традиционно требует особых знаний и создать полноценный правильно работающий привод — непростая задача. Но с помощью серводвигателей можно во многих случаях упростить задачу, поэтому серво постоянно используется даже в проектах начального уровня.
В этой статье мы постарались раскрыть разные аспекты использования сервоприводов в проектах arduino: от подключения до написания скетчей. Выбрав самую простую модель серво (например, sg 90) вы сможете без труда повторить приведенные примеры и создать свои первые проекты, в которых что-то движется и изменяется. Надеемся, эта статья поможет вам в этом.