Изучаем Arduino: инструметы и методы технического волшебства - [24]

Шрифт
Интервал

Соединив все элементы, можно перейти к следующему разделу, чтобы узнать, как программировать контроллер сервопривода.

Разберемся, почему серводвигателю нужен внешний источник, если он работает, как и плата Arduino, от напряжения 5 В. При питании Arduino от USB для самой платы Arduino и подключенных к ней устройств максимально возможный ток равен 500 мА. В неподвижном положении сервоприводы потребляют малый ток. Но при выполнении команд сервоприводы потребляют ток в несколько сотен миллиампер, что приводит к скачкам напряжения. Кроме того, при недостаточном напряжении питания вал сервопривода перемещается неустойчиво. Поэтому для сервопривода необходим отдельный источник питания.

4.12. Контроллер серводвигателя

В Arduino IDE предусмотрена библиотека Servo для упрощения управления сервоприводами. Чтобы работать с библиотекой, необходимо подключить ее к нашей программе. Затем следует прикрепить объект Servo к определенному выводу Arduino и задать угол вращения. Обо всем остальном позаботится библиотека. Самый простой способ проверить функционирование сервопривода - управление позицией вала с помощью потенциометра. Значение 0 потенциометра соответствует повороту сервопривода на 0°, значение 1023 - повороту на 180°. Загрузите код, приведенный в листинге 4.6, в плату Arduino, чтобы проверить все в действии.


Листинг 4.6. Управление положением серводигателя с помощью потенциомера - servp.ino

// Управление положением серводвигателя с помощью потенциометра

#include

const int SERV0=9; // Вывод 9 для подключения сигнального провода сервопривода

const int POT=0;// Подключение потенциометра к аналоговому входу A0

Servo myServo;

int val = 0;// Переменная для чтения показаний потенциометра


void setup()

{

myServo.attach(SERV0);

}

- 103 -

void loop()

{

val = analogRead(POT);// Чтение данных потенциометра

val = map(val, 0, 1023, 0, 179); // Преобразование к нужному диапазону

myServo.write(val);// Установить положение сервопривода

delay(15);

}

Оператор include, указанный в начале программы, добавляет функционал библиотеки Servo. Оператор Servo myServo создает объект сервопривода с именем myservo.

В том месте программы, где требуется действие с сервоприводом, будет ссылка на объект myServo. В функции setup() вы инициализируете сервопривод, присоединяя его к контакту 9 Arduino. Можно подсоединить к Arduino несколько сервоприводов, создав несколько объектов Servo и назначив каждому свой контакт Arduino.

В цикле loop() считывается текущее значение потенциометра, масштабируется до диапазона значений сервопривода и формируется импульс для установки вала сервопривода в соответствующую позицию. Задержка на 15 мс гарантирует, что вал сервопривода фиксируется, прежде чем поступит новая команда.

4.1З. Создание радиального датчика расстояния


В завершение этой главы применим знания, полученные ранее, для создания дальномера. Система состоит из инфракрасного (ИК) датчика расстояния, установленного на серводвигателе, и четырех светодиодов. Четыре позиции вала серводвигателя панорамируют датчик по периметру комнаты, что позволяет примерно определить расстояние до объектов в каждой из четырех областей. Яркость четырех светодиодов меняется в зависимости от расстояния до объекта в каждой области.

Так как инфракрасный свет является частью электромагнитного спектра, невидимой для человеческого глаза, подобная система может использоваться для создания "ночного видения". ИК-датчик расстояния работает следующим образом. Излучение ИК-светодиода воспринимается фотоприемником, который расположен рядом со светодиодом. Таким образом определяется расстояние до объекта, которое преобразуется в аналоговое напряжение и далее анализируется с помощью микроконтроллера. Даже если в комнате темно и расстояние до объекта неизвестно, дальномер позволит его узнать, потому что он работает в диапазоне, невидимом для человеческого глаза.

Разные модели ИК-датчиков могут иметь различные интерфейсы. Если ваш датчик отличается от рассмотренного в этом примере, необходимо ознакомиться с документацией, чтобы убедиться, что он является аналоговым.

ПРИМЕЧАНИЕ

Вы можете посмотреть демонстрационный видеоклип работы датчика расстояния на сайте http://www.exploringarduino.com/content/ch4.

- 104 -

Прикрепите термоклеем датчик расстояния на вал серводвигателя, как показано на рис. 4.13. Я предпочитаю термоклей, потому что он прочно крепит и при необходимости достаточно легко удаляется. Тем не менее, вы можете также воспользоваться суперклеем, шпатлевкой или клейкой лентой.

Рис. 4.13. ИК-датчик расстояния, установленный на сервоприводе

Затем подключаем сервопривод к контакту 9 платы Arduino, для питания сервопривода используем стабилизатор напряжения на 5 В. ИК-датчик расстояния соединяем с аналоговым входом A0. Четыре светодиода подключаем к контактам 3, 5, 6, и 11 через резисторы номиналом 1 кОм. На плате Arduino Uno предусмотрено шесть выводов ШИМ, но контакты 9 и 10 нельзя задействовать для создания ШИМсигналов, потому что аппаратный таймер, обеспечивающий ШИМ, занят библиотекой Servo. При желании увеличить число светодиодов, необходимо взять плату Arduino Mega или реализовать собственное программное обеспечение для формирования ШИМ.