Урок 17. Пантограф


В этом уроке мы вращаем сервопривод на угол, задаваемый потенциометром.

Прочтите перед выполнением

Список деталей для эксперимента

Принципиальная схема

Урок 17. Пантограф. Принципиальная схема

Схема на макетке

Урок 17. Пантограф. Схема на макетке

Обратите внимание

  • Конденсатор в данной схеме нам нужен для того, чтобы при включении сервопривода избежать просадки питания платы.
  • Не забывайте про то, что нужно соблюдать полярность элетролитического конденсатора. Короткая ножка (со стороны белой полосы на корпусе) — «минус».
  • Вы можете соединить провод сервопривода с макетной платой проводами «папа-папа»: коричневый это земля, красный — питание, оранжевый — сигнал.
  • В данном уроке мы подключаем питние сервопривода к 5V-выходу Arduino. С одним сервоприводом плата справится, но если в каком-либо проекте вам нужно больше серв, используйте специальные платы-драйвера с отдельным источником питания для серв.

Скетч

  1.     // управлять сервоприводами (англ. servo motor) самостоятельно
  2.     // не так то просто, но в стандартной библиотеке уже всё
  3.     // заготовлено, что делает задачу тривиальной
  4.     #include <Servo.h>
  5.  
  6.     #define POT_MAX_ANGLE 270.0 // макс. угол поворота потенциометра
  7.  
  8.     // объявляем объект типа Servo с именем myServo. Ранее мы
  9.     // использовали int, boolean, float, а теперь точно также
  10.     // используем тип Servo, предоставляемый библиотекой. В случае
  11.     // Serial мы использовали объект сразу же: он уже был создан
  12.     // для нас, но в случае с Servo, мы должны сделать это явно.
  13.     // Ведь в нашем проекте могут быть одновременно несколько
  14.     // приводов, и нам понадобится различать их по именам
  15.     Servo myServo;
  16.  
  17.     void setup()
  18.     {
  19.       // прикрепляем (англ. attach) нашу серву к 9-му пину. Явный
  20.       // вызов pinMode не нужен: функция attach сделает всё за нас
  21.       myServo.attach(9);
  22.     }
  23.  
  24.     void loop()
  25.     {
  26.       int val = analogRead(A0);
  27.       // на основе сигнала понимаем реальный угол поворота движка.
  28.       // Используем вещественные числа в расчётах, но полученный
  29.       // результат округляем обратно до целого числа
  30.       int angle = int(val / 1024.0 * POT_MAX_ANGLE);
  31.       // обычная серва не сможет повторить угол потенциометра на
  32.       // всём диапазоне углов. Она умеет вставать в углы от 0° до
  33.       // 180°. Ограничиваем угол соответствующе
  34.       angle = constrain(angle, 0, 180);
  35.       // и, наконец, подаём серве команду встать в указанный угол
  36.       myServo.write(angle);
  37.     }

Пояснения к коду

  • В данном эксперименте мы также имеем дело с объектом, на этот раз он нужен для простого управления сервоприводом. Как отмечено в комментариях, в отличие от объекта 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°.
  • Предположим, что сервопривод управляет шторкой, и нам нужно поддерживать постоянное количество света в помещении. Создайте такой механизм.

 

 

Источник: 
wiki.amperka.ru