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

стр.

ПРИМЕЧАНИЕ

Вы можете посмотреть демонстрационный видеоклип работы датчика расстояния на сайте 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 или реализовать собственное программное обеспечение для формирования ШИМ.

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

Последний шаг - программирование датчика. Алгоритм работы системы следующий:

1. Поворот вала сервопривода в одну из четырех позиций.

2. Измерение расстояния.

3. Преобразование его в значение, которое подходит для управления светодиодом.

4. Изменение яркости соответствующего светодиода.

- 105 -


Рис. 4.14. Схема подключения датчика расстояния

5. Выбор следующей позиции вала сервопривода.

6. Возврат к шагу 1.

Код программы приведен в листинге 4.7. Создайте в Arduino IDE новый проект, скопируйте этот код и загрузите его в плату Arduino.

Листинг 4.7. Программа ИК-датчика расстояния

// ИК-датчик расстояния

#include

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

const int IR=0;// Подключение ИК-датчика расстояния к аналоговому входу A0

const int LED1=3; // Вывод светодиода 1

const int LED2=5; // Вывод светодиода 2

const int LED3=6; // Вывод светодиода 3

const int LED4=11; // Вывод светодиода 4

// Создание объекта Servo

Servo myServo;

- 106 -


int dist1 = 0;//Расстояние в первой области

int dist2 = 0;//Расстояние во второй области

int dist3 = 0;//Расстояние в третьей области

int dist4 = 0;//Расстояние в четвертой области


void setup()

{

myServo.attach(SERV0);

pinMode(LED1, OUTPUT);//Сконфигурировать

pinMode(LED2, OUTPUT);//контакты подключения

pinMode(LED3, OUTPUT);//четырех светодиодов

pinMode(LED4, OUTPUT);// как выходы

}


void loop()

{

// Поворот вала сервопривода по четырем позициям

dist1 = readDistance(15);

analogWrite(LED1, dist1);

delay(300);

dist2 = readDistance(65);

analogWrite(LED2, dist2);

delay(300);

dist3 = readDistance(115);

analogWrite(LED3, dist3);

delay(300);

dist4 = readDistance(165);

analogWrite(LED4, dist4);

delay(300);

}


int readDistance (int pos)

{

myServo.write(pos);

delay(600);

int dist = analogRead(IR);//Чтение данных с датчика расстояния

dist = map(dist, 50, 500, 0, 255); //Преобразование к нужному диапазону

dist = constrain(dist, 0, 255);


return dist;//Выдача значения, соответствующего расстоянию

}


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

- 107 -

диодов, зависит от конкретной ситуации. У меня для самого дальнего объекта датчик выдавал значение 50, до ближайших - 500.

После загрузки кода и запуска программы система должна функционировать, как на демонстрационных видеоклипах, перечисленных в начале главы.

Резюме

В этой главе вы узнали следующее:

• Как работают двигатели постоянного тока.

• Что двигатели являются индуктивными нагрузками, которые следует снабдить надлежащей защитой и схемой питания, чтобы безопасно взаимодействовать с платой Arduino.

• Как управлять скоростью и направлением вращения двигателя с помощью ШИМ и H-моста.