Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Работаем с сервоприводами

Библиотека Servo
Sweep
Knob

Библиотека Servo

Библиотека Servo позволяет осуществлять программное управление сервоприводами. Управление осуществляется следующими функциями:

  • attach() — присоединяет объект к конкретному выводу платы. Возможны два варианта синтаксиса для этой функции: servo.attach(pin) и servo.attach(pin, min, max). При этом pin — номер пина, к которому присоединяют сервопривод, min и max — длины импульсов в микросекундах, отвечающих за углы поворота 0° и 180°. По умолчанию выставляются равными 544 мкс и 2400 мкс соответственно.
  • write() — отдаёт команду сервоприводу принять некоторое значение параметра. Синтаксис следующий: servo.write(angle), где angle — угол, на который должен повернуться сервопривод
  • writeMicroseconds() — отдаёт команду послать на сервопривод имульс определённой длины, является низкоуровневым аналогом предыдущей команды. Синтаксис следующий: servo.writeMicroseconds(uS), где uS — длина импульса в микросекундах
  • read() — читает текущее значение угла, в котором находится сервопривод. Синтаксис следующий: servo.read(), возвращается целое значение от 0 до 180
  • attached() — проверка, была ли присоединён объект к конкретному пину. Синтаксис следующий: servo.attached(), возвращается логическая истина, если объект была присоединен к какому-либо пину, или ложь в обратном случае
  • detach() — производит действие, обратное действию attach(), то есть отсоединяет объект от пина, к которому был приписан. Синтаксис следующий: servo.detach()

Пример подключения двух сервоприводов.


#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(0);
  myservo2.write(0);
  delay(500);
  // устанавливаем сервоприводы в крайнее правое положение
  myservo1.write(180);
  myservo2.write(180);
  delay(500);
}

Библиотека Servo не совместима с библиотекой VirtualWire для работы с приёмником и передатчиком на 433 МГц, так как они используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2. Все методы библиотеки Servo2 совпадают с методами Servo.

При работе с сервоприводами на 360 градусов функции работают по другому.

Функция ArduinoСервопривод 180°Сервопривод 360°
Servo.write(0)Крайне левое положениеПолный ход в одном направлении
Servo.write(90)Среднее положениеОстановка сервопривода
Servo.write(180)Крайне правое положениеПолный ход в обратном направлении

Sweep

Скетч File | Examples | Servo | Sweep постоянно поворачивает насадку на 180 градусов и возвращает её обратно. В примере используется встроенная библиотека Servo.

Общая схема - красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9).

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 градусов
    // шаг в один градус
    myservo.write(pos);              // просим повернуться на позицию значения переменной 'pos'
    delay(15);                       // ждём 15ms для достижения позиции
  }
  for (pos = 180; pos >= 0; pos -= 1) { // от 180 до 0 градусов
    myservo.write(pos);              // просим повернуться на позицию значения переменной 'pos'
    delay(15);                       // ждём 15ms для достижения позиции
  }
}

Knob

Скетч File | Examples | Servo | Knob управляет сервоприводом при помощи потенциометра. В примере используется встроенная библиотека Servo.

Общая схема: у сервопривода - красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9). У потенциометра средняя ножка соединяется с аналоговым выходом A0, остальные к питанию и земле.

Knob


#include <Servo.h>

Servo myservo;  // создадим объект сервопривода

int potpin = 0;  // аналоговый выход A0 для потенциометра
int val;    // значение, получаемое от аналогового выхода

void setup() {
  myservo.attach(9);  // сервопривод на выводе 9
}

void loop() {
  val = analogRead(potpin);            // считываем данные с потенциометра (от 0 до 1023)
  val = map(val, 0, 1023, 0, 180);     // Преобразуем в интервал от 0 до 180
  myservo.write(val);                  // устанавливаем позицию сервопривода
  delay(15);                           // небольшое ожидание, чтобы сервопривод успел выполнить команду
}

Дополнительное чтение

Компонент Сервопривод

Реклама