Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВКР КОМПЛЕКС ЛАБОРАТОРНЫХ РАБОТ НА БАЗЕ МОДЕЛИ РУКИ INMOOVE.docx
Скачиваний:
236
Добавлен:
17.11.2017
Размер:
2.94 Mб
Скачать

8.3.4.2 Подключение сервомоторов

На рисунке 8.3.4.2 изображены схема включения сервомотора.

Рисунок 8.3.4.2 - схема включения сервомотора

На рисунке 8.3.4.3 показана схема подключения сервомотора к плате Arduino

Рисунок 8.3.4.3 - схема подключения сервомотора к плате Arduino

8.3.4.3 Программирование Arduino - библиотека Servo

Servo library – библиотека для работы с сервомоторами.

Сервомотор (Сервомашинка) – это мотор-редуктор, с обратной связью, благодаря которой можно повернуть выходной вал на строго определённый угол. Стандартные рулевые машинки, вертятся от 0 до 180 градусов (также есть сервоприводы постоянного вращения).

В Arduino IDE 0017 библиотека Servo поддерживает до 12 сервомоторов (до 48 на Mega), а в IDE 0016 и ранее работает только на 9 и 10 пинах.

Функции, которые предоставляет библиотека Servo:

а) Функции uint8_t attach(int pin); uint8_t attach(int pin, int min, int max); Синтаксис: servo.attach(pin); servo.attach(pin, min, max);

Параметры:

(servo – объект класса Servo).

pin – номер порта, к которому подключен сервомотор.

min (опционально) – ширина импульса, в микросекундах устанавливающая положение вала сервы в 0 градусов (по-умолчанию 544). 

max (опционально) — ширина импульса, в микросекундах устанавливающая положение вала сервы в 180 градусов (по-умолчанию 2400).

Пример: #include <Servo.h> Servo myservo; void setup() {   myservo.attach(9); } void loop() {}

б) Функция void write(int value);

Описание: 

Устанавливается угол поворота сервомотора в градусах.  В случае сервомотора постоянного вращения: 0 – вращение на полной скорости в одну сторону, 180 – вращение на полной скорости в другую сторону, 90 – нет вращения. Синтаксис:

servo.write(angle);

Параметры: angle – значение угла для поворота: от 0 до 180 Пример: #include <Servo.h> Servo myservo; void setup() {   myservo.attach(9);   myservo.write(90);  // поворот сервопривода на 90 градусов } void loop() {}

в) Функция void writeMicroseconds(int value);

Описание:

Задаёт значение в микросекундах для длительности управляющего импульса. На стандартных сервомоторах это приведёт к повороту вала на определённый угол ( 1000 — положение полностью против часовой стрелки, 2000 — положение полностью по часовой стрелке, и 1500 — в середине).

Примечание:

Значения могут быть разными на сервомоторах разных производителей. Например, от 700 до 2300. Это можно определить экспериментально – увеличивая значения, пока серва продолжает поворачиваться. Обратите внимание, что попытки управления сервой вне её конечных точек (при этом появляется рычащий звук) приводит к увеличению потребления тока и такого следует избегать.

Синтаксис:

servo.writeMicroseconds(uS); Параметры:

uS – значение ширины импульса в микросекундах (int)

Пример:

#include <Servo.h> Servo myservo; void setup() {   myservo.attach(9);   myservo.writeMicroseconds(1500);  // в среднее положение } void loop() {}

г) Функция int read();

Описание: 

Считывает «текущий» угол поворота сервомашинки (значение, переданное в последнем вызове write()).

Синтаксис:

servo.read();

Возвращаемое значение: 

Возвращает значение типа int — угол от 0 до 180 градусов. Примечание:

Аналогично есть функция readMicroseconds();

д) Функция bool attached();

Описание:  Определяем – есть ли привязка к сервомоторам через pin. Синтаксис:

servo.attached();

Возвращаемое значение: 

Возвращает true если есть привязка к pin-у и false – в противном случае.

е) Функция void detach();

Описание: 

Отключение пина от библиотеки Servo. Если все переменные Servo отключены – пины 9 и 10 можно использовать для PWM-вывода через analogWrite().

Синтаксис:

servo.detach();

Возвращаемое значение: нет.

Рассмотрим пример работы библиотеки на примере Sweep, который поворачивает сервомотор от 0 до 180 градусов и обратно.

File – Examples — Servo — Sweep // Sweep #include <Servo.h>  Servo myservo;   // создаём объект для контроля сервомотора int pos = 0;   // переменная для хранения позиции сервомотора  void setup() {   myservo.attach(9);  // сервомотор подключен к 9-му пину }  void loop() {   for(pos = 0; pos < 180; pos += 1)  // от 0 до 180 градусов   {                                   // с шагом в 1 градус     myservo.write(pos);              //     delay(15);                       // ждём 15ms пока сервомотор займёт новое положение   }   for(pos = 180; pos>=1; pos-=1)     // от 180 до 0 градусов   {                                     myservo.write(pos);                   delay(15);                         } }

Так же существуют и другие библиотеки:

SoftwareServo — удобна одинаковым названием функций с системной библиотекой Servo

— она не ограничивает количество серв 8-ю, но требует для работы вызова метода SoftwareServo::refresh().

Пример:

#include <SoftwareServo.h> SoftwareServo myservo; // объект сервомотор int potpin = 0;   // пин для подключения потенциометра int val;         // переменная для хранения значения с

аналогового входа

void setup() {   myservo.attach(2);   // сервомотор подключен ко 2-му пину } void loop() {   val = analogRead(potpin);   //считываем значение с потенциометра (величина от 0 до 1023)   val = map(val, 0, 1023, 0, 179);     // переводим в значение от 0 до 180)   myservo.write(val);                   // устанавливаем угол сервомотора   delay(15);                           // ждём поворота   SoftwareServo::refresh(); }