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


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

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

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

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

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

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

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

Скетч

  1.     // управлять сервоприводами (англ. servo motor) самостоятельно
    
  2.     // не так то просто, но в стандартной библиотеке уже всё
    
  3.     // заготовлено, что делает задачу тривиальной
    
  4.     #include 
    
  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, предварительно подключив библиотеку .
  • Далее мы используем два метода для работы с ним:
    • 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°.
  • Предположим, что сервопривод управляет шторкой, и нам нужно поддерживать постоянное количество света в помещении. Создайте такой механизм.

 

 

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