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

стр.

• Vcc2 (контакт 8)-напряжение питания двигателя (подсоедините к 9 В);

• Vccl (контакт 16)-напряжение питания микросхемы (подсоедините к 5 В);

- 93 -

• 1У и 2У (контакты 3 и 6) - выходы для подключения первого двигателя;

• IA и 2А (контакты 2 и 7)- коммугация первого двигателя, эти выводы соединены с управляющими контактами Arduino;

1,2 EN (контакт 1)- включение и отключение левого драйвера. Данный вывод соединен с ШИМ-контактами на плате Arduino, что позволяет динамически регулировать скорость двигателей;

• ЗУ и 4У (контакты 11 и 14)- выходы для подключения второго двигателя;

• Батарея

• Н-мост

• Двигатель постоянного тока

Рис. 4.7. Схема подключения Н-моста

- 94 -

ЗА и 4A (контакты 10 и 15)- коммутация второго двигателя, эти выводы соединены с управляющими контактами Arduino;

• 3,4 EN (контакт 9) - вывод включения или отключения правого драйвера. Он соединен с ШИМ-контактами на Arduino, что позволяет динамически регулировать скорость двигателей.

Проверьте монтаж по рис. 4.7. Потенциометр подключим позже.

Прежде чем приступать к программированию, проверим работоспособность схемы.

Подключите один из входных контакто? (2 или 7) микросхемы H-моста к шине 5 В, другой к земле. Двигатель начнет вращаться. Поменяйте подключение контактов 2 и 7, двигатель будет вращаться в другую сторону.

ВНИМАНИЕ!

Во время переключения контактов отключите батарею, чтобы случайно не вызвать короткое замыкание моста.

4.10. Управление работой Н-моста

Напишем программу для управления скоростью и направлением вращения двигателя с помощью потенциометра и драйвера H-моста. Установка движка потенциометра в среднее положение приводит к остановке двигателя, при перемещении движка вправо скорость вращения вала двигателя увеличивается, перемещение движка влево от среднего положения приводит к увеличению скорости вращения вала двигателя в обратном направлении. В программе будут три вспомогательные функции: первая - для остановки двигателя, вторая - для вращения двигателя с заданной скоростью и третья - для вращения двигателя с заданной скоростью в обратном направлении.

Анализируя рис. 4.5, делаем следующие выводы:

1. Для вращения двигателя один из выключателей должен быть замкнут, другой разомкнут.

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

3. Для остановки двигателя оба выключателя должны быть разомкнуты.

ПРИМЕЧАНИЕ

Перед изменением состояния выключателей всегда отключайте ток, чтобы не вызвать короткого замыкания Н-моста.

Сначала напишем код функций для выполнения описанных действий (листинг 4.3).


Листинг 4.3. Вспомогательные функции для управления двигателем

// Вращение двигателя вперед с заданной скоростью (диапазон 0-255)

void forward (int rate)

{

digitalWrite(EN, LOW);

- 95 -

digitalWrite(MC1, HIGH);

digitalWrite(MC2, LOW);

analogWrite(EN, rate);

}

// Вращение двигателя в обратном направлении с заданной скоростью

//(диапазон 0-255)

void reverse (int rate)

{

digitalWrite(EN, LOW);

digitalWrite(MC1, LOW);

digitalWrite(MC2, HIGH);

analogWrite(EN, rate);

}

// Остановка двигателя

void brake()

{

digitalWrite(EN, LOW);

digitalWrite(MC1, LOW);

digitalWrite(MC2, LOW);

digitalWrite(EN, HIGH)

}

Обратите внимание, что в начале каждой функции на контакте EN всегда устанавливается низкий уровень, и затем задаются значения на входах блока управления MC1 и MC2. После установки значений на входах MC1 и MC2 можно снова включить ток. Подавая сигнал ШИМ на вход EN, можно управлять скоростью двигателя.

Значение переменной rate должно быть в диапазоне от 0 до 255. Основной цикл программы (листинг 4.4) считывает данные с потенциометра и в зависимости от результата вызывает требуемую функцию.


Листинг 4.4. Программа вызова вспомгательных функций

void loop()

{

val = analogRead(POT);

// Движение вперед

if (val > 562)

{

velocity = map(val, 563, 1023, 0, 255);

forward(velocity);

}

// Движение назад

else if (val < 462)

{

velocity = map(val, 461, 0, 0, 255);

- 96 -

reverse(velocity);

}

// Остановка

else

{

brake();

}

}

Сигнал с аналогового входа преобразуется в цифровое значение в диапазоне от 0 до 1023. Чтобы лучше понять принцип управления, обратимся к рис. 4.8.