Принцип работы сервопривода, что такое сервопривод
Содержание:
- Шаг 4: калибровка сервоприводов
- Как управлять Ардуино с клавиатуры
- Скачать библиотеку Servo.h
- Применение
- Как подключить моторчик к Arduino
- Как подключить к Ардуино серво с джойстиком
- Как работает клешня «хватайки»
- Схема подключения nRF24L01 к Ардуино
- Управление сервоприводом джойстиком Ардуино
- Устройство сервомотора (servo)
Шаг 4: калибровка сервоприводов
У SG90 от различных производителей (могут выпускаться со своей наклейкой, например, «FeeTech FS90» или как в оригинальной «TowerPro SG90») параметры сервопривода могут немного отличаться. Если питающее напряжение обычно до 4.8-5в, частота управляющих импульсов 50Гц (т.е. период следования сигнала 20мс), а угол, на который проворачивается сервопривод примерно 180градусов, то длительность управляющего импульса очень часто отличается.
К примеру длительность управляющего импульса может быть от 1мс до 2мс или от 0.75мс до 1.85мс или от 0.5мс до 2.4мс и т.д. Для сервоприводов от одного производителя, длительность управляющего импульса тоже может немного отличаться. Калибровка — это определение, какие длительности импульсов соответствуют минимальной и максимальной длительность управляющего импульса и каким углам проворачивания вала сервопривода они соответствуют.
Под нейтральным положением может подразумеваться то положение, в которое проворачивается вал при средней длительности импульса (в данном случае это 1.5мс). Обозначать в градусах могут как на картинке выше, т.е. нейтральное 90 градусов и крайние положения как 0 и 180. Или под нейтральным подразумевать 0 градусов, а крайние обозначать как -90 и +90. С обозначениями углов это условность, могут быть и другие варианты. В данном случае будет использоваться первый вариант.
Для программирования позиции сервопривода с использованием Python очень важно знать соответствующий коэффициент заполнения (англ. duty cycle) для вышеуказанных позиций (задаётся в процентах)
К примеру длительность импульса 2мс, при периоде следования сигнала 20мс это коэффициент заполнения 10%. Давайте сделаем вычисления для всех углов:
- исходное положение ==> (0 градусов) длительность импульса 1мс ==> коэффициент заполнения = 1мс/20мс*100% = 5%
- нейтральное положение ==> (90 градусов) длительность импульса 1,5мс ==> коэффициент заполнения = 1,5мс/20мс*100% = 7,5%
- конечная позиция ==> (180 градусов) длительность импульса 2мс ==> коэффициент заполнения = 2мс/20мс*100% = 10%
Таким образом коэффициент заполнения варьируется от 5% до 10%.
Давайте откалибруем сервоприводы. Для этого откроем терминал на Raspberry и запустим редактор Python 3 с правами от суперпользователя (нужно для работы с GPIO):
sudo python3
Python Shell:
>>>
Импортируем модуль RPI.GPIO и называем его GPIO:
import RPi.GPIO as GPIO
Определите, какие схемы нумерации выводов хотите использовать (BCM или BOARD). Я провел этот тест с BOARD, поэтому используемые контакты были физическими (GPIO 17 это контакт 11 и GPIO 27 это контакт 13). Мне было легко их идентифицировать и не ошибиться во время теста (в финальной программе я буду использовать BCM). Выбираем:
GPIO.setmode(GPIO.BOARD)
Определяем вывод сервопривода, который будет использоваться:
tiltPin = 11
Если хотите использовать схему BCM, последние 2 команды должны быть заменены на:
GPIO.setmode(GPIO.BCM)
tiltPin = 17
Теперь указываем, что этот вывод будет работать как выход:
GPIO.setup(tiltPin, GPIO.OUT)
Настраиваем частоту, для SG90 нужно 50 Гц:
tilt = GPIO.PWM(tiltPin, 50)
Включаем генерацию сигнала ШИМ на выводе и задаём начальный коэффициент заполнения равный нулю:
tilt = start(0)
Теперь мы можем устанавливать различные значения коэффициента заполнения и наблюдать за движением сервопривода. Давайте начнем с 5% и посмотрим, что происходит:
tilt.ChangeDutyCycle(5)
Сервопривод перешел в «нулевое положение». Сервопривод продолжал вращаться, при задании заполнения вплоть до 3%. При задании заполнения 2% сервопривод оставался в том же положении. После чего начав задавать значения больше 2%, движение сервопривода в моём случае начало происходить при установке коэффициента заполнения более 3%. Итак, 3% — это минимальное заполнение (позиция «0 градусов») для этого сервопривода.
То же самое произошло и с максимальным коэффициентом заполнения. Для начала установлено 10%:
tilt.ChangeDutyCycle(10)
Затем задавались большие значения, сервопривод продолжал проворачиваться при установке коэффициента заполнения вплоть до 13%. Таким образом максимальный коэффициент заполнения для данного сервопривода это 13%, угол, на который проворачивается вал сервопривода составил примерно 180 градусов (но это в данном случае, в зависимости от сервопривода физический угол может оказаться и больше и меньше). Итак, в результате калибровки получены следующие данные:
После окончания калибровки останавливаем ШИМ и очищаем GPIO:
tilt=stop()
GPIO.cleanup()
Для второго сервопривода процедура калибровки аналогична.
Как управлять Ардуино с клавиатуры
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- макетная плата;
- светодиод и резистор 220 Ом;
- сервопривод;
- провода «папа-папа» и «папа-мама».
Управление светодиодом на Arduino UNO с компьютера
Остальные исполнительные устройства для Arduino UNO вы можете взять на свое усмотрение и самостоятельно попробовать управлять ими через компьютер с помощью USB кабеля. Соберите на макетной плате схему с одним светодиодом из первого занятия Что такое Ардуино и как им пользоваться, а после сборки схемы со светодиодом загрузите следующий скетч в микроконтроллер.
Скетч. Взаимодействие Ардуино и компьютера
int val; // освобождаем память в контроллере для переменой void setup() { Serial.begin(9600); // подключаем последовательный порт pinMode(13, OUTPUT); // объявляем пин 13 как выход } void loop() { // проверяем, поступают ли какие-то команды if (Serial.available()) { val = Serial.read(); // переменная val равна полученной команде if (val == '1') {digitalWrite(13, HIGH);} // при 1 включаем светодиод if (val == '0') {digitalWrite(13, LOW);} // при 0 выключаем светодиод } }
- функция проверяет поступление команд с компьютера;
- функция читает данные, поступившие в Serial monitor.
- в условном операторе стоит знак двойное равенство «соответствие», а в скобках необходимо использовать одинарные кавычки.
Управление сервоприводом на Arduino UNO с компьютера
После сборки схемы загрузите следующий скетч в плату
Скетч. Управление сервоприводом с компьютера
#include <Servo.h> // подключаем библиотеку для сервопривода Servo servo; // объявляем переменную servo типа "servo" int val; // освобождаем память в контроллере для переменой void setup() { Serial.begin(9600); // подключаем последовательный порт servo.attach(11); // привязываем сервопривод к выходу 11 } void loop() { // проверяем, поступают ли какие-то команды if (Serial.available()) { val = Serial.read(); // переменная val равна полученной команде if (val == '1') { servo.write(10); } // при 1 поворачиваем серво на 10 if (val == '2') { servo.write(45); } // при 2 поворачиваем серво на 45 if (val == '3') { servo.write(90); } // при 3 поворачиваем серво на 90 } }
Скачать библиотеку Servo.h
Данная библиотека автоматически устанавливается вместе с Arduino IDE. Но вы можете отдельно Для установки библиотеки просто распакуйте zip архив в папку «C:\Program Files (x86)\Arduino\libraries» или в то место, где у васт установлена среда разработки Arduin IDE. Если у вас запущена программа Arduino IDE, то для работы с новой библиотекой её необходимо перезапустить.
После того как вы скачали библиотеку Servo и установили ее, вы можете подключать библиотеку в свои скетчи и вам будут доступны примеры использования данной библиотеки.
Для использование библиотеки Servo необходимо подключить ее в свой скетч и создать переменную типа servo. Сделать это очень просто:
1 2 3 4 5 6 7 8 9 10 11 | #include <Servo.h> Servo myservo; void setup() { // CODE… } void loop() { // CODE… } |
attach()
Указывает вывод к которому подключен сервопривод.
Синтаксис, параметры, возвращаемые значения, пример
Параметры
pin — Обязательный параметр. Цифровой пин к которому подключен сигнальный провод сервопривода.min — Необязательный параметр. Ширина импульса в микросекундах, соответствующая минимальному (угол 0 градусов) положению сервопривода. (по умолчанию 544)max — Необязательный параметр. Ширина импульса в микросекундах, соответствующая максимальному (угол 180 градусов) положению сервопривода.
Возвращаемые значения
Нет
1 2 3 4 5 6 7 8 9 10 11 | #include <Servo.h> Servo myservo; void setup() { myservo.attach(9); } void loop() { // CODE… } |
write()
Поворачивает сервопривод на заданный угол. Для сервоприводов постоянного вращения устанавливает скорость и направление вращения.
Синтаксис, параметры, возвращаемые значения, пример
servo.write(angle);
angle — Обязательный параметр. Устанавливает угол от 0 до 180 градусов. При использовании сервопривода постоянного вращения значение 90 используется для неподвижного состояния. Значение 0 для максимальной скорости кручения в одну сторону, а 180 для максимальной скорости кручения в другую сторону.
Нет
1 2 3 4 5 6 7 8 9 10 11 12 | #include <Servo.h> Servo myservo; void setup() { myservo.attach(9); myservo.write(90); // Поворачивает сервопривод на среднее положение } void loop() { // CODE… } |
writeMicroseconds()
Поворачивает сервопривод на угол заданный в микросекундах. С сервоприводами постоянного вращения работает по таком же принципу как и функция write().
Синтаксис, параметры, возвращаемые значения, пример
servo.writeMicroseconds(ms);
ms — Обязательный параметр. Значение в микросекундах
Нет
1 2 3 4 5 6 7 8 9 10 11 12 | #include <Servo.h> Servo myservo; void setup() { myservo.attach(9); myservo.writeMicroseconds(1500); // Поворачивает сервопривод на среднее положение } void loop() { // CODE… } |
read()
Возвращает текущее положение сервопривода.
Синтаксис, параметры, возвращаемые значения, пример
servo.read();
Нет
Int от 0 до 180.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <Servo.h> Servo myservo; void setup() { Serial.begin(9600); // Открываем последовательный порт myservo.attach(9); int position = myservo.read(); // Считываем положение сервопривода Serial.print(«Текущее положение сервопривода: «); Serial.println(position); // Отправляем значение угла на запись в последовательный порт } void loop() { // CODE… } |
attached()
Проверяет, указан ли управляющий пин для экземпляра класса Servo.
Синтаксис, параметры, возвращаемые значения, пример
servo.attached();
Нет
boolean true — если пин был указан и false — если нет
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <Servo.h> Servo myservo; void setup() { Serial.begin(9600); // Открываем последовательный порт if(!myservo.attached()) { myservo.attach(9); // Указываем пин если этого не было сделано раньше } } void loop() { // CODE… } |
detach()
Отсоединяет экземпляр класса от пина. При отсоединения всех сервоприводов, заблокированные ШИМ выводу снова станут доступны.
Синтаксис, параметры, возвращаемые значения, пример
Servo.detach()
Нет
Нет
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <Servo.h> Servo myservo; void setup() { Serial.begin(9600); // Открываем последовательный порт myservo.attach(9); // Указываем пин если этого не было сделано раньше int position = myservo.read(); // Считываем положение сервопривода Serial.print(«Текущее положение сервопривода: «); Serial.println(position); // Отправляем значение угла на запись в последовательный порт myservo.detach(); // Освобождаем пин, к которому был подключен сервопривод } void loop() { // CODE… } |
Применение
Сервоприводы применяются для точного (по датчику) позиционирования (чаще всего) приводимого элемента в автоматических системах:
- управляющие элементы механической системы (заслонки, задвижки, углы поворота)
- рабочие органы и заготовки в станках и инструментах
Сервоприводы вращательного движения используются для:
- Промышленных роботов.
- Станков с ЧПУ.
- Полиграфических станков.
- Промышленных швейных машин.
- Упаковочных станков.
- Приборов.
- Авиамоделирования.
Сервоприводы линейного движения используются, например, в автоматах установки электронных компонентов на печатную плату.
Серводвигатель
Сервомотор для авиамоделизма
Серводвигатель — сервопривод с мотором, предназначенный для перемещения выходного вала в нужное положение (в соответствии с управляющим сигналом) и автоматического активного удержания этого положения.
Серводвигатели применяются для приведения в движение устройств управляемых поворотом вала — как открытие и закрытие клапанов, переключатели и так далее.
Важными характеристиками сервомотора являются динамика двигателя, равномерность движения, энергоэффективность.
Серводвигатели широко применяются в промышленности, например, в металлургии, в станках с ЧПУ, прессо-штамповочном оборудовании, автомобильной промышленности, тяговом подвижном составе железных дорог.
В основном в сервоприводах использовались 3-полюсные коллекторные двигатели, в которых тяжелый ротор с обмотками вращается внутри магнитов.
Первое усовершенствование, которое было применено — увеличение количества обмоток до 5. Таким образом, вырос вращающий момент и скорость разгона. Второе усовершенствование — это изменение конструкции мотора. Стальной сердечник с обмотками очень сложно раскрутить быстро. Поэтому конструкцию изменили — обмотки находятся снаружи магнитов и исключено вращение стального сердечника. Таким образом, уменьшился вес двигателя, уменьшилось время разгона и возросла стоимость.
Ну и наконец, третий шаг — применение бесколлекторных двигателей. У бесколлекторных двигателей выше КПД, так как нет щёток и скользящих контактов. Они более эффективны, обеспечивают большую мощность, скорость, ускорение, вращающий момент.
Как подключить моторчик к Arduino
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- мотор постоянного тока (Motor DC);
- транзистор полевой/биполярный;
- драйвер двигателей L298N;
- провода «папа-папа», «папа-мама».
Перед выбором способа управления двигателем от Arduino Uno r3, уточните на какое напряжение рассчитан ваш моторчик. Если питание требуется более 5 Вольт, то следует использовать транзистор или драйвер. Распиновка транзисторов может отличаться от приведенного примера (следует уточнить распиновку для своего типа). Драйвер L298N позволит не только включать мотор, но и изменять направление вращения.
Скетч. Подключение мотора напрямую
Схема. Управление моторчиком от Ардуино напрямую
Подключение мотора к Ардуино напрямую — самый простой вариант включения вентилятора на Arduino или машинки. Команда для включения двигателя не отличается, от команды при подключении светодиода к микроконтроллеру. Функция digitalWrite включает/выключает подачу напряжения на цифровой порт, к которому подключен двигатель постоянного тока. Соберите схему и загрузите программу.
void setup() { pinMode(12, OUTPUT); // объявляем пин 12 как выход } void loop() { digitalWrite(12, HIGH); // включаем мотор delay(1000); // ждем 1 секунду digitalWrite(12, LOW); // выключаем мотор delay(1000); // ждем 1 секунду }
- для подключения мотора без драйвера можно использовать любой порт;
- если двигатель не включается, то, возможно, не хватает силы тока на цифровом выходе, подключите двигатель через транзистор к порту 3,3V или 5V.
Скетч. Подключение мотора через транзистор
Подключение мотора через транзистор к Ардуино потребуется, если двигатель никак не хочет включаться от платы напрямую, то следует использовать порт 5 Вольт на микроконтроллере или внешний источник питания. Транзистор будет играть роль ключа, замыкая/размыкая электрическую цепь. Сам транзистор управляется цифровым портом. Соберите схему, как на картинке и загрузите программу.
Подключение FA-130 мотора постоянного тока — Motor DC Arduino
void setup() { pinMode(13, OUTPUT); // объявляем пин 13 как выход } void loop() { digitalWrite(13, HIGH); // включаем мотор delay(1000); // ждем 1 секунду digitalWrite(13, LOW); // выключаем мотор delay(1000); // ждем 1 секунду }
- при необходимости можно подключить два мотора FA-130 к Ардуино;
- в зависимости от характеристик, двигатель подключается к 3,3 или 5 Вольтам.
Скетч. Подключение мотора через драйвер
Схема подключения двух моторов через драйвер l298n
Подключение мотора к Ардуино через драйвер L298N или Motor Shield L293D позволит менять направление вращения ротора. Но для использования данных модулей потребуется установить соответствующие библиотеки для Ардуино. В примере мы использовали схему подключения двигателя с помощью модуля L298N. Соберите схему, как на картинке ниже и загрузите следующий скетч с использованием.
// задаем имена для портов #define IN1 3 #define IN2 4 #define IN3 5 #define IN4 6 void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { // вращаем моторчики в одну сторону digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); delay(2000); // ждем 2 секунды digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); // выключаем на 1 секунду // вращаем моторчики в обратную сторону digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); delay(2000); // ждем 2 секунды digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); // выключаем на 1 секунду }
Как подключить к Ардуино серво с джойстиком
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- микро сервопривод;
- джойстик ky-023;
- провода «папа-папа», «папа-мама».
Схема подключения сервопривода к Ардуино с джойстиком
Подключите к плате Ардуино сервомотор и джойстик, согласно схеме, изображенной на картинке выше. И загрузите следующий скетч в микроконтроллер, позволяющий сделать плавное управление сервоприводом с помощью джойстика на Ардуино. В программе мы используем функцию map(), которая преобразует числовой диапазон значений 0-1023, в новый диапазон чисел 0-180 (угол поворота серво).
Скетч. Управление сервоприводом с помощью джойстика
#define pinX A1 // ось X джойстика #include <Servo.h> // подключаем библиотеку для серво Servo servo1; // объявляем объект servo1 void setup() { pinMode(pinX, INPUT); // указываем пин для джойстика servo1.attach(9); // указываем пин для микро серво } void loop() { int X = analogRead(pinX); // считываем значение оси X X = map(X, 0, 1023, 0, 180); // переводим значение X в новый диапазон servo1.write(X); // поворачиваем серво от джойстика }
Пояснения к коду:
с помощью map() можно задать любой диапазон чисел, в том числе обратный;
обратите внимание, что у разных производителей распиновка джойстика может отличаться, от представленной выше схемы подключения модуля к плате.
Схема подключения двух сервоприводов к Ардуино с джойстиком
Скетч. Управление двумя серво с помощью джойстика
#define pinX A1 // ось X джойстика #define pinY A0 // ось Y джойстика #include <Servo.h> // подключаем библиотеку для серво Servo servo1; // объявляем объект servo1 Servo servo2; // объявляем объект servo2 void setup() { pinMode(pinX, INPUT); // указываем пин для джойстика pinMode(pinY, INPUT); // указываем пин для джойстика servo1.attach(9); // указываем пин для первого серво servo2.attach(11); // указываем пин для второго серво } void loop() { int X = analogRead(pinX); // считываем значение оси X int Y = analogRead(pinY); // считываем значение оси Y X = map(X, 0, 1023, 0, 180); // переводим значение X в новый диапазон Y = map(Y, 0, 1023, 0, 180); // переводим значение Y в новый диапазон servo1.write(X); // поворачиваем первый серво servo2.write(Y); // поворачиваем второй серво }
Пояснения к коду:
- в данной программе мы лишь добавили новую локальную переменную для значений оси Y джойстика, чтобы управлять вторым серво.
Как работает клешня «хватайки»
Как конкретно работает клешня, в профессиональном аппарате, я не разглядел, поскольку механика была прикрыта защитным кожухом, поэтому пришлось поэкспериментировать.
Поломав некоторое время голову, получилось придумать более-менее рабочий вариант: клешня состоит из четырех «пальцев», которые одним концом фиксируются на неподвижной раме. Так же добавил крестовину, с ней «пальцы» имеют шарнирное соединение примерно посередине. К неподвижной части рамы жестко зафиксировал сервопривод, качалка которого опускает и поднимает ось. Крестовина в свою очередь жестко закреплена к оси и вместе с ней совершает движения вверх и вниз, из-за чего и происходит сжатие и раскрытие клешни. Чтобы было понятнее, ниже находится картинка с клешней. Изображение можно вращать с помощью мышки, зажав ЛКМ и перемещая влево или вправо.
С изготовлением клешни особо не мучался и напечатал ее на 3D принтере.
Схема подключения nRF24L01 к Ардуино
Модуль работает по интерфейсу SPI, соответственно подключать модуль nRF24L01 следует к определенным портам микроконтроллера (не забывайте, что у Arduino Mega интерфейс SPI находится на других портах). Для наладки связи между двумя Ардуино, потребуется, как минимум два беспроводных радио модуля. Одну плату нужно настроить, как приемник сигнала (receiver), а вторую, как передатчик (transmitter).
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- радио модуль;
- провода «папа-мама».
Радиомодуль nRF24L01 datasheet на русском
После подключения беспроводных модулей к микроконтроллеру, загрузите скетч.
Скетч для проверки радио модуля nRF24L01
#include <SPI.h> // библиотека для обмена данными по протоколу SPI #include <nRF24L01.h> // библиотека для nRF24L01+ #include <RF24.h> // библиотека для радио модуля RF24 radio(9,10); // Для MEGA2560 замените на RF24 radio(9,53); const uint8_t num_channels = 128; uint8_t values; int serial_putc( char c, FILE * ) { Serial.write( c ); return c; } void printf_begin(void) { fdevopen( &serial_putc, 0 ); } void setup(void) { Serial.begin(9600); printf_begin(); radio.begin(); radio.setAutoAck(false); radio.startListening(); // включаем прием сигнала radio.printDetails(); // если правильно соединили, то увидите настройки модуля delay(10000); // задержка на 10 секунд radio.stopListening(); // выключаем прием сигнала int i = 0; // вывод заголовков всех 127 каналов while ( i < num_channels ) { printf("%x",i>>4); ++i; } printf("\n\r"); i = 0; while ( i < num_channels ) { printf("%x",i&0xf); ++i; } printf("\n\r"); } const int num_reps = 100; void loop(void) { memset(values, 0, sizeof(values)); int rep_counter = num_reps; while (rep_counter--) { int i = num_channels; while (i--) { radio.setChannel(i); radio.startListening(); // включаем прием сигнала delayMicroseconds(128); radio.stopListening(); // выключаем прием сигнала if ( radio.testCarrier() ) ++values; } } int i = 0; while ( i < num_channels ) { printf("%x", min(0xf, values & 0xf)); ++i; } printf("\n\r"); }
Пояснения к коду:
- Скетч выводит на последовательный порт информацию о модуле nRF24L01+;
- Далее выводится информация о всех частотах на которых работает модуль и информацию об их загруженности, выбирайте частоту для работы без помех;
Вывод характеристик nRF24L01+. Сканер и проверка модуля
Ардуино nRF24L01 сканирование радио частот
Если скетч успешно загрузился на Arduino NANO или UNO, но вы не видите похожую информацию на мониторе последовательного порта, то еще раз проверьте соединение платы с микроконтроллером (возможно где-то просто нет контакта). Возможно у вас модуль от другого производителя, тогда советуем вам ознакомиться с информацией на форуме: forum.amperka.ru/threads/nrf24l01-побеждаем-модуль.3205/.
nRF24L01. Сканирование радио каналов связи на помехи
Через 10 секунд после получения информации о характеристиках nRF24L01+ вы получите информацию о помехах на всех 127 каналах связи. Первые две строчки — это имена каналов, состоящие из двух символов на первой и второй строке (выделены красным квадратом). Далее идет информация о помехах. На скриншоте видно, что с 4 по 22 канал лучше не использовать для соединения устройств по радиосигналу.
Управление сервоприводом джойстиком Ардуино
Для того, чтобы сделать управление сервомотора с помощью джойстика, необходимо первым делом подключить к аналоговым входам платы Arduino модуль ky-023. Это необходимо, чтобы АЦП микроконтроллера получало данные о положении джойстика по координатам X и Y в режиме реального времени. Затем, с помощью строчек кода, эти данные мы преобразуем в соответствующее положение микро сервопривода.
Джойстик представляет собой два потенциометра, которые меняют сопротивление в электрической цепи при изменении положения ручки. Поэтому на аналоговых входах Ардуино, куда мы подключим джойстик, будут цифровые значения от 0 до 1023, т.е. АЦП микроконтроллера преобразует значения напряжения от 0 до 5 Вольт в цифровые значения. Именно эти значения мы будем использовать для управления серво.
Устройство сервомотора (servo)
Сервопривод (сервомотор) является важным элементом при конструировании различных роботов и механизмов. Это точный исполнитель, который имеет обратную связь, позволяющую точно управлять движениями механизмов. Другими словами, получая на входе значение управляющего сигнала, сервомотор стремится поддерживать это значение на выходе своего исполнительного элемента.
Что такое сервопривод. Схема устройства сервопривода
Сервоприводы широко используются для моделирования механических движений роботов. Сервопривод состоит из датчика (скорости, положения и т.п.), блока управления приводом из механической системы и электронной схемы. Редукторы (шестерни) устройства выполняют из металла, карбона или пластика. Пластиковые шестерни сервомотора не выдерживают сильные нагрузки и удары.
Сервомотор имеет встроенный потенциометр, который соединен с выходным валом. Поворотом вала, сервопривод меняет значение напряжения на потенциометре. Плата анализирует напряжение входного сигнала и сравнивает его с напряжением на потенциометре, исходя из полученной разницы, мотор будет вращаться до тех пор пока не выравняет напряжение на выходе и на потенциометре.
Управление сервоприводом с помощью широтно импульсной модуляции
Схема подключения сервопривода к Arduino обычно следующая: черный провод присоединяем к GND, красный провод присоединяем к 5V, оранжевый/желтый провод к аналоговому выводу с ШИМ (Широтно Импульсная Модуляция). Управление сервоприводом на Ардуино достаточно просто, но по углам поворота сервомоторы бывают на 180° и 360°, что следует учитывать в робототехнике.
Для занятия нам понадобятся следующие детали:
- Плата Arduino Uno / Arduino Nano / Arduino Mega;
- Макетная плата;
- USB-кабель;
- 1 сервопривод;
- 1 потенциометр;
- Провода «папа-папа» и «папа-мама».
Схема подключения сервопривода к Ардуино UNO
В первом скетче мы рассмотрим как управлять сервоприводом на Arduino с помощью команды myservo.write(0). Также мы будем использовать стандартную библиотеку Servo.h. Подключите сервомашинку к плате Ардуино, согласно схеме на фото выше и загрузите готовый скетч. В процедуре void loop() мы будем просто задавать для сервопривода необходимый угол поворота и время ожидания до следующего поворота.
Скетч для сервопривода на Ардуино
#include <Servo.h> // подключаем библиотеку для работы с сервоприводом Servo servo1; // объявляем переменную servo типа «servo1» void setup() { servo1.attach(11); // привязываем сервопривод к аналоговому выходу 11 } void loop() { servo1.write(0); // ставим угол поворота под 0 delay(2000); // ждем 2 секунды servo1.write(90); // ставим угол поворота под 90 delay(2000); // ждем 2 секунды servo1.write(180); // ставим угол поворота под 180 delay(2000); // ждем 2 секунды }
Пояснения к коду:
- Стандартная библиотека Servo.h содержит набор дополнительных команд, которая позволяет значительно упростить скетч;
- Переменная Servo необходима, чтобы не запутаться при подключении нескольких сервоприводов к Ардуино. Мы назначаем каждому приводу свое имя;
- Команда servo1.attach(10) привязывает привод к аналоговому выходу 10.
- В программе мы вращаем привод на 0-90-180 градусов и возвращаем в начальное положение, поскольку процедура void loop повторяется циклично.