Движение прямо. ШИМ

В этом уроке

  • Широтно-импульсная модуляция и зачем она нужна
  • Учим машинку двигаться вперёд
  • Управление скоростью машинки
  • Установка направления вращения двигателя модуля-мотора

Видео версия урока

Что такое ШИМ

В классическом варианте для управления мощностью нагрузки (яркостью свечения светодиода, скоростью вращения двигателя и т.п.) используют метод изменения напряжения. Чем оно меньше, тем меньше мощность, а соответственно — и яркость/скорость.

Цифровые выводы Arduino выдают только логический 0 (LOW) или логическую 1 (HIGH). С ними мы уже умеем работать, используя digitalWrite(pin, value). Однако, контроллер  Arduino Nano не имеет технической возможности менять напряжение на своих выходах. Поэтому для решения поставленной задачи используют такой метод, как ШИМ. 

ШИМ (широтно-импульсная модуляция) — метод изменения мощности нагрузки, при котором на нагрузку подаются быстро следующие друг за другом импульсы. В зависимости от продолжительности этих импульсов, будет меняться и мощность.

Подробнее о принципе работы ШИМ мы расскажем в конце этого урока. Пока важно понять, что процент заполнения ШИМ —  процент мощности нагрузки. 

Например, при 50% ШИМ двигатель будет вращаться на половине скорости, а светодиод — гореть в половину яркости. 

Управление модулем-мотором

Внутри модуля-мотора управление скоростью вращения производится с помощью ШИМ, но благодаря тому, что мы используем библиотеку, нам не нужно думать о реализации ШИМ, мы просто должны задать скорость вращения.

 В уроке про подключение библиотек для управления модулем-мотором мы использовали инструкцию: mot.setSpeed(speed, MOT_PWM)

Функция setSpeed() устанавливает скорость вращения мотора и принимает параметр скорости  (speed) в процентах от максимальной, т.е. от 0 до 100.

Параметр MOT_PWM означает, что число, переданное в функцию (в нашем случае 100) — это процент заполнения ШИМ. Вообще на его месте могут быть и другие параметры, но в контексте данного курса мы будем работать только с ним. 

Пример: команда mot.setSpeed(30, MOT_PWM); укажет модулю-мотору установить скорость на 30%.

Давайте научим нашу машинку двигаться вперёд и назад. Для этого включим оба мотора на максимальную скорость в прямом направлении, а затем — в обратном.

#include <Wire.h>                       // Подключаем библиотеку для работы с шиной I2C
#include <iarduino_I2C_Motor.h>         // Подключаем библиотеку для работы с мотором
iarduino_I2C_Motor  mot_R (0x0A);       // Объявляем объект mot_R для правого мотора с указанием адреса 0х0А
iarduino_I2C_Motor  mot_L (0x0B);       // Объявляем объект mot_L для левого мотора с указанием адреса 0х0В
void setup(){                         
    mot_R.begin();                      // Инициируем работу с правым мотором
    mot_L.begin();                      // Инициируем работу с левым мотором
    mot_R.setDirection(true);           // Задаём направление вращения правого мотора 
    mot_L.setDirection(false);          // Задаём направление вращения левого мотора 
}                                                
void loop(){                                    
    mot_R.setSpeed(100, MOT_PWM);       // Запускаем правый мотор c ШИМ 100%
    mot_L.setSpeed(100, MOT_PWM);       // Запускаем левый мотор c ШИМ 100%
    delay(2000);                        // Ждём 2 секунды
    mot_R.setStop();                    // Останавливаем правый мотор
    mot_L.setStop();                    // Останавливаем левый мотор
    delay(2000);                        // Ждём 2 секунды                               
    mot_R.setSpeed(-100, MOT_PWM);      // Запускаем правый мотор c ШИМ 100%  в обратном направлении
    mot_L.setSpeed(-100, MOT_PWM);      // Запускаем левый мотор c ШИМ 100%  в обратном направлении
    delay(2000);                        // Ждём 2 секунды    
    mot_R.setStop();                    // Останавливаем правый мотор
    mot_L.setStop();                    // Останавливаем левый мотор
    delay(2000);                        // Ждём 2 секунды   
 }

Вы могли заметить новую функцию, о которой мы еще не говорили, — setDirection(); (8,9 строки).

Функция setDirection() устанавливает направление вращения мотора. Дело в том, что в зависимости от того, с какой стороны машинки установлен мотор, при вращении по часовой стрелке он будет двигать машинку вперёд (если установлен справа) или назад (если установлен слева). Выходит, при одной и той же команде моторы будут двигать машинку в разные стороны, в результате чего она начнёт вращаться на месте. 

Чтобы этого не произошло и мы могли писать скетч как обычно, мы указываем функции setDirection() флаг (true или false), в зависимости от которого модуль меняет направление вращения колеса. Попробуйте поменять флаги и посмотрите, что произойдёт. 

Как работает ШИМ

Коэффициент заполнения — это отношение ширины импульсного сигнала к ширине его периода (ширина импульсного сигнала + ширина паузы). Выражается в процентах. 

Из-за инерции исполнительного механизма (вращение вала мотора, инерционность восприятия света глазом человека в случае со светодиодом) резкие перепады напряжения от 1 к 0 будут сглаживаться и принимать среднее значение. Задавая коэффициент заполнения, можно менять среднее значение напряжения на выходе ШИМ.

Пример: если коэффициент заполнения = 100%, то на выходе Arduino будет логическая "1" или 5В. Если задать коэффициент заполнения = 30%, то среднее напряжение будет ~1,5В. И так далее. 

Зелёные штрихи отмеряют период следования импульсов. Благодаря быстрому следованию импульсов (несколько сотен или даже тысяч раз в секунду), они "сливаются" в одно среднее значение. Это позволяет регулировать мощность нагрузки.

Дополнительное задание.
1) Заставьте машинку ехать медленно, а затем быстро.
2) Напишите программу движения машинки по окружности. Как можно изменить её радиус?

3) Напишите программу для движения машинки по квадрату. То есть машинка едет прямо, затем останавливается, поворачивает, снова едет прямо и т.д.

Поздравляю с изучением данного урока!
Следующий урок:
№11. Ультразвуковой датчик расстояния.
приступить к изучению

Продукт в магазине

«ROBORACE» — Образовательный набор на базе Arduino

В магазин

Обсуждение

Гарантии и возврат. Используя сайт, Вы соглашаетесь с условиями.