====== Эксперимент 17. Пантограф ======
[[метеостанция|← Метеостанция]] | [[конспект-arduino:|Оглавление]] | [[тестер-батареек|Тестер батареек →]]
В этом эксперименте мы вращаем сервопривод на угол, задаваемый потенциометром.
===== Прочтите перед выполнением =====
* [[конденсатор|Конденсатор]]
===== Список деталей для эксперимента =====
* 1 плата [[amp>product/arduino-uno|Arduino Uno]]
* 1 беспаечная [[amp>collection/breadboards|макетная плата]]
* 1 [[amp>collection/servo|сервопривод]]
* 1 [[amp>product/capacitor-electrolytic-220u|конденсатор]] ёмкостью 220 мкФ
* 1 [[amp>product/potentiometer|потенциометр]]
* 11 проводов [[amp>product/wire-mm|«папа-папа»]]
===== Принципиальная схема =====
{{ :конспект-arduino:17_servo_scheme1.svg.png?nolink& |}}
===== Схема на макетке =====
{{ :конспект-arduino:17_servo_bread.svg.png?nolink& |}}
===== Обратите внимание =====
* Конденсатор в данной схеме нам нужен для того, чтобы при включении сервопривода избежать просадки питания платы.
* Не забывайте про то, что нужно соблюдать полярность элетролитического конденсатора. Короткая ножка (со стороны белой полосы на корпусе) — «минус».
* Вы можете соединить провод сервопривода с макетной платой проводами «папа-папа»: коричневый это земля, красный — питание, оранжевый — сигнал.
* В данном эксперименте мы подключаем питние сервопривода к 5V-выходу Arduino. С одним сервоприводом плата справится, но если в каком-либо проекте вам нужно больше серв, используйте специальные платы-драйвера с отдельным источником питания для серв.
===== Скетч =====
// управлять сервоприводами (англ. servo motor) самостоятельно
// не так то просто, но в стандартной библиотеке уже всё
// заготовлено, что делает задачу тривиальной
#include
#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'', предварительно подключив библиотеку ''''.
* Далее мы используем два метода для работы с ним:
* ''myServo.attach(pin)'' — сначала «подключаем» серву к порту, с которым физически соединен его сигнальный провод. ''pinMode()'' не нужна, метод ''attach()'' займется этим.
* ''myServo.write(angle)'' — задаем угол, т.е. позицию, которую должен принять вал сервопривода. Обычно это 0—180°.
* ''myServo'' здесь это имя объекта, идентификатор, который мы придумываем так же, как названия переменных. Например, если вы хотите управлять двумя захватами, у вас могут быть объекты ''leftGrip'' и ''rightGrip''.
* Мы использовали функцию ''int()'' для явного преобразования числа с плавающей точкой в целочисленное значение. Она принимает в качестве параметра значение любого типа, а возвращает целое число. Когда в одном выражении мы имеем дело с различными типами данных, нужно позаботиться о том, чтобы не получить непредсказуемый ошибочный результат.
===== Вопросы для проверки себя =====
- Зачем нужен конденсатор при включении в схему сервопривода?
- Каким образом библиотека '''' позволяет нам работать с сервоприводом?
- Зачем мы ограничиваем область допустимых значений для ''angle''?
- Как быть уверенным в том, что в переменную типа ''int'' после вычислений попадет корректное значение?
===== Задания для самостоятельного решения =====
- Измените программу так, чтобы по мере поворота ручки потенциометра, сервопривод последовательно занимал 8 положений: 45, 135, 87, 0, 65, 90, 180, 150°.
- Предположим, что сервопривод управляет шторкой, и нам нужно поддерживать постоянное количество света в помещении. Создайте такой механизм.
----
[[метеостанция|← Метеостанция]] | [[конспект-arduino:|Оглавление]] | [[тестер-батареек|Тестер батареек →]]