Эксперимент 17. Пантограф
← Метеостанция | Оглавление | Тестер батареек →
В этом эксперименте мы вращаем сервопривод на угол, задаваемый потенциометром.
Прочтите перед выполнением
Список деталей для эксперимента
- 1 плата Arduino Uno
 - 1 беспаечная макетная плата
 - 1 конденсатор ёмкостью 220 мкФ
 - 11 проводов «папа-папа»
 
Принципиальная схема
Схема на макетке
Обратите внимание
- Конденсатор в данной схеме нам нужен для того, чтобы при включении сервопривода избежать просадки питания платы.
 - Не забывайте про то, что нужно соблюдать полярность элетролитического конденсатора. Короткая ножка (со стороны белой полосы на корпусе) — «минус».
 - Вы можете соединить провод сервопривода с макетной платой проводами «папа-папа»: коричневый это земля, красный — питание, оранжевый — сигнал.
 - В данном эксперименте мы подключаем питние сервопривода к 5V-выходу Arduino. С одним сервоприводом плата справится, но если в каком-либо проекте вам нужно больше серв, используйте специальные платы-драйвера с отдельным источником питания для серв.
 
Скетч
- p170_servo.ino
 // управлять сервоприводами (англ. servo motor) самостоятельно // не так то просто, но в стандартной библиотеке уже всё // заготовлено, что делает задачу тривиальной #include <Servo.h> #define POT_MAX_ANGLE 270.0 // макс. угол поворота потенциометра // объявляем объект типа Servo с именем myServo. Ранее мы // использовали int, boolean, float, а теперь точно также // используем тип Servo, предоставляемый библиотекой. В случае // Serial мы использовали объект сразу же: он уже был создан // для нас, но в случае с Servo, мы должны сделать это явно. // Ведь в нашем проекте могут быть одновременно несколько // приводов, и нам понадобится различать их по именам Servo myServo; void setup() { // прикрепляем (англ. attach) нашу серву к 9-му пину. Явный // вызов pinMode не нужен: функция attach сделает всё за нас myServo.attach(9); } void loop() { int val = analogRead(A0); // на основе сигнала понимаем реальный угол поворота движка. // Используем вещественные числа в расчётах, но полученный // результат округляем обратно до целого числа int angle = int(val / 1024.0 * POT_MAX_ANGLE); // обычная серва не сможет повторить угол потенциометра на // всём диапазоне углов. Она умеет вставать в углы от 0° до // 180°. Ограничиваем угол соответствующе angle = constrain(angle, 0, 180); // и, наконец, подаём серве команду встать в указанный угол myServo.write(angle); }
Пояснения к коду
- В данном эксперименте мы также имеем дело с объектом, на этот раз он нужен для простого управления сервоприводом. Как отмечено в комментариях, в отличие от объекта
Serial, объекты типаServoнам нужно явно создать:Servo myServo, предварительно подключив библиотеку<Servo.h>. - Далее мы используем два метода для работы с ним:
myServo.attach(pin)— сначала «подключаем» серву к порту, с которым физически соединен его сигнальный провод.pinMode()не нужна, методattach()займется этим.myServo.write(angle)— задаем угол, т.е. позицию, которую должен принять вал сервопривода. Обычно это 0—180°.
 myServoздесь это имя объекта, идентификатор, который мы придумываем так же, как названия переменных. Например, если вы хотите управлять двумя захватами, у вас могут быть объектыleftGripиrightGrip.- Мы использовали функцию
int()для явного преобразования числа с плавающей точкой в целочисленное значение. Она принимает в качестве параметра значение любого типа, а возвращает целое число. Когда в одном выражении мы имеем дело с различными типами данных, нужно позаботиться о том, чтобы не получить непредсказуемый ошибочный результат. 
Вопросы для проверки себя
- Зачем нужен конденсатор при включении в схему сервопривода?
 - Каким образом библиотека
<Servo.h>позволяет нам работать с сервоприводом? - Зачем мы ограничиваем область допустимых значений для
angle? - Как быть уверенным в том, что в переменную типа
intпосле вычислений попадет корректное значение? 
Задания для самостоятельного решения
- Измените программу так, чтобы по мере поворота ручки потенциометра, сервопривод последовательно занимал 8 положений: 45, 135, 87, 0, 65, 90, 180, 150°.
 - Предположим, что сервопривод управляет шторкой, и нам нужно поддерживать постоянное количество света в помещении. Создайте такой механизм.