/*
* Набор для экспериментов ArduinoKit
* Код программы для опыта №7: sketch 07
*
*
* ОДИН SERVO
*
* Поворот сервопривода назад и вперед: полный диапазон движения.
*
* «Серво», сокращение от серводвигателя, это двигатель, который
* включает в себя электронную схему с обратной связью, что позволяет
* управлять двигателем указывая в какую позицию его установить.
* В нашем опыте используется маленький, но существуют и более крупные
* сервоприводы, которые широко используются в робототехнике, например
* для управления механическими манипуляторами на авто производстве.
* Вы можете использовать свой, например чтобы сделать (крошечный)
* манипулятора, или рули управления самолета, катером, или там где
* двигатель должен устанавливаться в необходимую позицию.
*
* Подключение оборудования:
*
* Сервопривод, как правило имеет кабель, состоящий из трех проводов.
* Но может быть и разъем. Поскольку на концы кабеля имеется розетка,
* вы можете использовать дополнительные провода для того чтобы
* подключить Arduino к сервоприводу. Просто подключите соединительные
* провода, как бы в разрыв, непосредственно в розетку и в необходимый
* порт.
*
* Подключите красный провод (+ питания) к шине +5 вольт.
* Подключите белый провод (сигнал) к цифровому порту 9 (Pin 9).
* Подключите черный провод (земля) на общий «-» (GND).
*
* Обратите внимание, что сервоприводы могут потреблять много энергии,
* что может вызвать неполадки в работе Arduino. Если вы используете
* большой сервопривод или несколько, то лучше предоставить им
* собственный, отдельный источник питания 5V.
* За дополнительной информацией обращайтесь в соответствующую тему на
* форуме сайта Arduino:
*http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1239464763
*
*
* Комментарий к программе переведен
* 26 октября 2014
* специально для http://arduinokit.ru
*
*/

// Если бы нам понадобилось написать программу управления серво
// двигателем с нуля, понадобилось бы очень много времени. К
// счастью, другие люди уже сделали всю тяжелую работу за нас, и
// нам не придется «изобретать велосипед». Нам лишь остается только
// подключить готовую программу, к своей, и указать в некоторых
// местах функции, которые мы будем использовать для управления сервой.

// Библиотека — набор дополнительных функций, которые можно подключить
// к вашему скетчу (программе). Множество библиотек доступных для
// применений, можно найти на http://arduino.cc/en/Reference/Libraries,
// еще больше на Google. Когда вы придумываете что-то свое, скорее всего,
// кто-то уже пытался написать что-то подобное, так что воспользуйтесь
// для начала поиском, возможно вы найдете для себя что-то интересное.

#include <Servo.h>  // подключаем дополнительную библиотеку

// Как только вы «подключаете» библиотеку, так сразу получаете доступ
// к этим функциям. Вы можете найти список функций в библиотеке
// сервопривода в: http://arduino.cc/en/Reference/Servo. Большинство
// библиотек доступно из меню «Файл / примеры».

// Теперь мы создадим «объект» сервопривода, под названием servo1.
// Вы должны создать по одному для каждого сервопривода, которым
// собираетесь управлять.
// Вы можете управлять максимум двенадцатью сервоприводами на плате
// Arduino Uno, использовав библиотеку «Servo.h». С помощью других
// библиотек можно управлять и большим количеством. Обратите внимание,
// что эта библиотека отключает ШИМ на пинах 9 и 10!

Servo servo1;  //объект управления сервоприводом

void setup()
{
// Сейчас мы прикрепим (attach) объект servo1 к цифровому
// пину 9 (pin 9). Если вы собираетесь управлять более чем одним
// сервоприводом, Вы должны прикрепить каждый новый объект серво к
// своему, отдельному порту, причем это порт должен быть цифровым.

// Прикрепление указывает Arduino, что пора начинать отправлять
// сигналы управления для данного сервопривода. Сервоприводы требуют
// непрерывного потока сигналов управления, даже если в настоящий
// момент сервопривод не осуществляет никаких перемещений. В то время
// когда сервопривод «простаивает» ему все равно необходимо передавать
// сигналы о текущей позиции. Если вы хотите навсегда освободить
// сервопривод, придется это сделать вручную, для этого вы можете
// передать команду servo1.detach().

servo1.attach(9);
}

void loop()
{
int position;

// Для управления сервоприводом, вы указываете ему угол на который
// он должен переместиться. Сервоприводы не могут повернуться на 360
// градусов, но вы можете указать ему, чтобы он поворачивался в
// определенную позицию от 0 до 180 градусов.

// Изменение позиции на полной скорости:

servo1.write(90);    // Говорим серве повернуться на позицию 90 градусов,
// т.е устанавливаем в среднее положение

delay(1000);         // Не большая пауза, чтобы дать время повернуться

servo1.write(180);   // Говорим серве повернуться на позицию 180 градусов,
// т.е устанавливаем в крайнее правое положение.

delay(1000);         // Ждем еще немного

servo1.write(0);     // Говорим серве повернуться на позицию 0 градусов,
// т.е устанавливаем в крайнее левое положение.

delay(1000);         // Снова пауза

// Изменение позиции на более низкой скорости:

// Чтобы замедлить движение сервопривода, мы будем использовать
// цикл for(), для того чтобы передать ему кучу промежуточных
// позиций, с задержкой в 20 милли секунд между ними. Вы можете
// изменить «размер шага», чтобы замедлить сервопривод или ускорить.
// Обратите внимание, что сервопривод не сможет двигаться быстрее
// своей полной скорости, так как импульсы управления передаваемые
// на мотор с платы управления сервой передаются с частотой 50 Герц,
// и еще модулю управления нужно время чтобы принять решение, — а в
// той ли я нахожусь позиции, и стоит ли двигаться дальше, т.е.
// минимальное время реакции не может быть быстрее 20 милли секунд,
// да еще добавленная нами пауза.

// «Говорим» сервоприводу повернуться на позицию 180 градусов,
// с шагом в два градуса:

for(position = 0; position < 180; position += 2)
{
servo1.write(position);  // Перемещаемся на следующую позицию
delay(20);               // Короткая пауза
}

// «Говорим» сервоприводу повернуться на позицию 0 градусов,
// с шагом в 1 градус:

for(position = 180; position >= 0; position -= 1)
{
servo1.write(position);  // Переместиться на следующую позицию
delay(20);               // Короткая пауза
}
}