====== H-мост на 2 канала (Troyka-модуль): инструкция, схемы и примеры использования ======
Используйте [[amp>product/troyka-h-bridge-dual?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|H-мост]] для управления двумя коллекторными моторами, а точнее скоростью и направлением вращения вала. H-мост также сможет управлять одним биполярным шаговым двигателем.
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual.4.jpg?nolink |}}
===== Примеры работы для Arduino и XOD =====
В качестве мозга для управления моторами рассмотрим платформу из серии [[amp>collection/arduino?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Arduino]], например [[amp>product/arduino-uno?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Arduino Uno]].
* [[amp>page/arduino-ide?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Как начать работу с Arduino?]]
* [[amp>page/xod-ide?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Как начать работу с XOD?]]
==== Подключение к Arduino ====
Выберите один из вариантов коммуникации драйвера с внешним микроконтроллером:
* Подключите H-мост к платформе Arduino. Для коммуникации понадобятся [[amp>product/wire-fm?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|соединительные провода «мама-папа»]].{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-wiring-arduino.png?nolink |}}
* Для быстрой сборки и отладки устройства возьмите плату расширения [[amp>product/arduino-troyka-shield?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Troyka Shield]], которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводные шлейфы «мама-мама», который идут в комплекте с модулем.{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-wiring-arduino-troyka-shield.png?nolink |}}
==== Управление коллекторными моторами ====
- [[#подключение_к_arduino|Подключите к драйверу микроконтроллер и логическое питание.]]
- [[#подключение_коллекторных_моторов|Подключите к драйверу коллекторные моторы и силовое питание.]]
=== Код для Arduino ===
Для начала покрутим каждый мотор в одну, а затем другую сторону.
Прошейте платформу Arduino скетчем, приведённым ниже.
// Пины управления скоростью и направлением мотора
constexpr auto pinM1Speed = 9;
constexpr auto pinM1Direction = A1;
constexpr auto pinM2Speed = 10;
constexpr auto pinM2Direction = A0;
int pins[] = {pinM1Speed, pinM1Direction, pinM2Speed, pinM2Direction};
void setup() {
// Настраиваем все пины управление моторами в режим выхода
for (int i = 0; i < 4; i++) {
pinMode(pins[i], OUTPUT);
}
}
void loop() {
// Крутим мотор M1 в одну сторону в течении 1 секунды
motorsDrive(255, 0);
delay(1000);
// Крутим мотор M1 в другую сторону в течении 1 секунды
motorsDrive(-255, 0);
delay(1000);
// Крутим мотор M2 в одну сторону в течении 1 секунды
motorsDrive(0, 255);
delay(1000);
// Крутим мотор M2 в другую сторону в течении 1 секунды
motorsDrive(0, -255);
delay(1000);
// Стоим на месте
motorsDrive(0, 0);
delay(1000);
}
// Функция управления моторами
void motorsDrive(int M1Speed, int M2Speed) {
if (M1Speed > 0) {
digitalWrite(pinM1Direction, HIGH);
} else {
digitalWrite(pinM1Direction, LOW);
}
if (M2Speed > 0) {
digitalWrite(pinM2Direction, HIGH);
} else {
digitalWrite(pinM2Direction, LOW);
}
analogWrite(pinM1Speed, abs(M1Speed));
analogWrite(pinM2Speed, abs(M2Speed));
}
Усовершенствуем эксперимент: заставим каждый мотор по очереди плавно разгоняться и останавливаться в разных направлениях.
// Пины управления скоростью и направлением мотора
constexpr auto pinM1Speed = 9;
constexpr auto pinM1Direction = A1;
constexpr auto pinM2Speed = 10;
constexpr auto pinM2Direction = A0;
int pins[] = {pinM1Speed, pinM1Direction, pinM2Speed, pinM2Direction};
void setup() {
// Настраиваем все пины управление моторами в режим выхода
for (int i = 0; i < 4; i++) {
pinMode(pins[i], OUTPUT);
}
}
void loop() {
// Медленно разгоняем M1 в одну сторону
for (int i = 0; i <= 255; i++) {
motorsDrive(i, 0);
delay(10);
}
// Медленно тормозим мотор
for (int i = 255; i >= 0; i--) {
motorsDrive(i, 0);
delay(10);
}
// Медленно разгоняем M1 в другую сторону
for (int i = 0; i <= 255; i++) {
motorsDrive(-i, 0);
delay(10);
}
// Медленно тормозим мотор
for (int i = 255; i >= 0; i--) {
motorsDrive(-i, 0);
delay(10);
}
// медленно разгоняем M2 в одну сторону
for (int i = 0; i <= 255; i++) {
motorsDrive(0, i);
delay(10);
}
// медленно тормозим мотор
for (int i = 255; i >= 0; i--) {
motorsDrive(0, i);
delay(10);
}
// медленно разгоняем M2 в другую сторону
for (int i = 0; i <= 255; i++) {
motorsDrive(0, -i);
delay(10);
}
// медленно тормозим мотор
for (int i = 255; i >= 0; i--) {
motorsDrive(0, -i);
delay(10);
}
}
// Функция управления моторами
void motorsDrive(int M1Speed, int M2Speed) {
if (M1Speed > 0) {
digitalWrite(pinM1Direction, HIGH);
} else {
digitalWrite(pinM1Direction, LOW);
}
if (M2Speed > 0) {
digitalWrite(pinM2Direction, HIGH);
} else {
digitalWrite(pinM2Direction, LOW);
}
analogWrite(pinM1Speed, abs(M1Speed));
analogWrite(pinM2Speed, abs(M2Speed));
}
==== Управление шаговым двигателем ====
- [[#подключение_к_arduino|Подключите к драйверу микроконтроллер и логическое питание.]]
- [[#подключение_шагового_двигателя|Подключите к драйверу шаговый двигатель и силовое питание.]]
Для лёгкого и быстрого управления шаговым двигателем мы написали библиотеку [[https://github.com/amperka/AmperkaStepper|AmperkaStepper]], которая скрывает в себе все тонкости работы с мотором и предоставляет удобные методы.
=== Код для Arduino ===
// Библиотека для работы с шаговым двигателем
#include
// Создаём объект для работы с шаговым двигателем
// и передаём фиксированное количество шагов за полный оборот.
// Подробности в характеристиках двигателя
AmperkaStepper motor(200, A0, A1, 9, 10);
void setup() {
// Устанавливаем скорость вращения 30 оборотов в минуту.
motor.setSpeed(30);
}
void loop() {
// 180° по часовой стрелке в двухфазном режиме
motor.step(100, FULL_STEP);
delay(1000);
// 180° против часовой стрелки в однофазном режиме
motor.step(-100, WAVE_DRIVE);
delay(1000);
// 180° по часовой стрелке в полушаговом режиме
motor.step(200, HALF_STEP);
delay(1000);
// 180° против часовой стрелки в двухфазном режиме
// этот режим используется по умолчанию, если не передан
// второй аргумент
motor.step(-100);
delay(1000);
}
===== Пример работы для Espruino =====
В качестве мозга для управления моторами рассмотрим платформу из серии [[amp>collection/espruino?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Espruino]], например, [[amp>product/iskra-js?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Iskra JS]].
[[:js:ide|Как начать работу с Espruino?]]
==== Подключение к Espruino ====
Выберите один из вариантов коммуникации драйвера с внешним микроконтроллером:
* Подключите драйвер к платформе Arduino. Для коммуникации понадобятся [[amp>product/wire-fm?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|соединительные провода «мама-папа»]].{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-wiring-espruino.png?nolink |}}
* Для быстрой сборки и отладки устройства возьмите плату расширения [[amp>product/arduino-troyka-shield?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Troyka Shield]], которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводные шлейфы «мама-мама», который идут в комплекте с модулем.{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-wiring-espruino-troyka-shield.png?nolink |}}
==== Управление коллекторными двигателями ====
- [[#подключение_к_espruino|Подключите к драйверу микроконтроллер и логическое питание.]]
- [[#подключение_коллекторных_моторов|Подключите к драйверу коллекторные моторы и силовое питание.]]
=== Код для Espruino IDE ===
Покрутим каждый мотор в одну, а затем другую сторону.
Прошейте платформу Espruino скриптом, приведённым ниже.
// Подключаем библиотеку «motor»
var Motor = require('@amperka/motor');
// Пины управления скоростью и направлением мотора
var motorOne = Motor.connect({phasePin: A1, pwmPin: P9, freq: 100});
var motorTwo = Motor.connect({phasePin: A0, pwmPin: P10, freq: 100});
// Интервал времени
var time = 1000;
// Счётчик
var state = 0;
// Каждую секунду меняем режим работы
setInterval(() => {
motorOne.write(0);
motorTwo.write(0);
state++;
if (state === 1) {
motorOne.write(1);
} else if (state === 2) {
motorOne.write(-1);
} else if (state === 3) {
motorTwo.write(1);
} else if (state === 4) {
motorTwo.write(-1);
} else {
state = 0;
}
}, time);
==== Управление шаговым двигателем ====
- [[#подключение_к_espruino|Подключите к драйверу микроконтроллер и логическое питание.]]
- [[#подключение_шагового_двигателя|Подключите к драйверу шаговый двигатель и силовое питание.]]
Для лёгкого и быстрого управления шаговым двигателем, используйте библиотеку [[https://www.espruino.com/StepperMotor|StepperMotor]], которая скрывает в себе все тонкости работы с шаговиком и предоставляет удобные методы.
=== Код для Espruino ===
// Подключаем библиотеку «motor»
var StepperMotor = require("StepperMotor");
// Создаём объект для работы с шаговым двигателем
// передаём пины управления
var motor = new StepperMotor({
pins:[A0, A1, P9, P10],
pattern:[0b0001,0b0011,0b0010,0b0110,0b0100,0b1100,0b1000,0b1001],
});
// Крутим вал на 100 шагов по часовой стрелке
motor.moveTo(100, 5000, function() {
// Крутим вал на 100 шагов против часовой стрелке
motor.moveTo(-100, 5000, function() {
// Приехали
console.log("Done!");
}, true);
});
===== Пример работы для Raspberry Pi =====
В качестве мозга для управления моторами рассмотрим одноплатные компьютеры [[amp>collection/raspberry-pi?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Raspberry Pi]], например, [[amp>product/raspberry-pi-4-model-b-4-gb?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Raspberry Pi 4]].
[[articles:rpi-guide|Настрой Raspberry Pi]]
==== Подключение к Raspberry Pi ====
В компьютере Raspberry Pi присутствует только два канала с ШИМ-сигналом, и то которые используются для аналогового звукового выхода. В итоге для регулировки скоростью моторов придется жертвовать звуком. Используйте плату расширения [[amp>product/raspberry-troyka-cap?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|Troyka Cap]], которая добавит малине 9 пинов с поддержкой ШИМ.
Подключите драйвер к компьютеру Raspberry Pi через Troyka Cap. Для коммуникации используйте трёхпроводные шлейфы «мама-мама», который идут в комплекте с модулем.
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-wiring-raspberry-pi-cap.png?nolink |}}
==== Программная настройка ====
- [[articles:rpi-guide|Настрой Raspberry Pi]]
- [[продукты:raspberry-troyka-cap|Настройте плату расширения Troyka Cap]]
==== Управление коллекторными двигателями ====
- [[#подключение_к_raspberry_pi|Подключите к драйверу микроконтроллер и логическое питание.]]
- [[#подключение_коллекторных_моторов|Подключите к драйверу коллекторные моторы и силовое питание.]]
=== Код для Raspberry Pi ===
Для начала покрутим каждый мотор в одну, а затем другую сторону. Запустите скрипт на малине, приведённый ниже.
# библиотека для работы с пинами GPIO
import RPi.GPIO as GPIO
# библиотека для работі с временем
import time
# выбираем имена пинов BCM
GPIO.setmode(GPIO.BCM)
# устанавливаем светодиод в режим выхода
GPIO.setup(24, GPIO.OUT)
try:
while True:
# ждём одну секунду
time.sleep(1)
# зажигаем светодиод
GPIO.output(24, GPIO.HIGH)
# ждём одну секунду
time.sleep(1)
# гасим светодиод
GPIO.output(24, GPIO.LOW)
except KeyboardInterrupt:
print('The program was stopped by keyboard.')
finally:
GPIO.cleanup()
print('GPIO cleanup completed.')
===== Подключение силового контура =====
H-мост может управлять двумя отдельными коллекторными моторами или одним биполярным шаговым двигателем.
==== Подключение коллекторных моторов ====
- Подключите два [[amp>collection/dc-motors?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki |коллекторных мотора]] к клеммникам ''M1'' и ''M2'' соответственно.
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-wiring.1.png?nolink |}}
- Подключите силовое питание для моторов через клеммник ''P''.
- В качестве стационарного источника напряжения рекомендуем использовать внешний [[amp>product/power-supply-adapter-robiton-tn2000s?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki |регулируемый блок питания Robiton]]. {{ :products:troyka-h-bridge-dual:troyka-h-bridge-wiring.2.png?nolink |}}
- В качестве автономного источника обратите внимание на батарейный отсек с элементами питания.{{ :products:troyka-h-bridge-dual:troyka-h-bridge-wiring.3.png?nolink |}}
Значение входного силового напряжения зависит от номинального напряжения подключаемых моторов и ограничено диапазоном от 3,3 до 12 вольт.
==== Подключение шагового двигателя ====
- Подключите [[amp>collection/stepper-motors?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki |шаговый двигатель]] к клеммникам ''M1'' и ''M2''.
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-wiring.4.png?nolink |}}
- Подключите силовое питание для мотора через клеммник ''P''.
- В качестве стационарного источника напряжения рекомендуем использовать внешний [[amp>product/power-supply-adapter-robiton-tn2000s?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki |регулируемый блок питания Robiton]]. {{ :products:troyka-h-bridge-dual:troyka-h-bridge-wiring.5.png?nolink |}}
- В качестве автономного источника обратите внимания на батарейный отсек с элементами питания.{{ :products:troyka-h-bridge-dual:troyka-h-bridge-wiring.6.png?nolink |}}
Значение входного силового напряжения зависит от номинального напряжения шагового двигателя и ограничено диапазоном от 3,3 до 12 вольт.
===== Элементы платы =====
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-annotation.png?nolink |}}
==== Драйвер двигателей TB6612FNG ====
Сердце и мускулы платы — микросхема двухканального H-моста {{ :products:troyka-h-bridge-dual:tb6612fng-datasheet.pdf |TB6612FNG}}, которая позволяет управлять двумя коллекторными моторами или одним биполярным шаговым двигателем с помощью внешнего микроконтроллера.
Термин «H-мост» появился благодаря графическому изображению схемы, напоминающему букву «H». Рассмотрим подробнее принцип работы H-моста.
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-details.png?nolink |}}
В зависимости от текущего состояние переключателей возможно разное состояние мотора.
^ S1 ^ S2 ^ S3 ^ S4 ^ Результат ^
| 1 | 0 | 0 | 1 | Мотор крутится вправо |
| 0 | 1 | 1 | 0 | Мотор крутится влево |
| 0 | 0 | 0 | 0 | Свободное вращение мотора |
| 0 | 1 | 0 | 1 | Мотор тормозит |
| 1 | 0 | 1 | 0 | Мотор тормозит |
| 1 | 1 | 0 | 0 | Короткое замыкание источника питания |
| 0 | 0 | 1 | 1 | Короткое замыкание источника питания |
Ключи меняем на MOSFET-транзисторы, а для плавной регулировки скорости вращения вала мотора используем [[конспект-arduino:шим|ШИМ-сигнал.]]
==== Питание ====
На плате драйвера моторов присутствует два контура питания: силовое и логическое.
* Силовой контур (VM) — напряжение для питания моторов от силовой части микросхемы [[#драйвер_двигателей_tb6612fng|TB6612FNG]] и светодиодов индикации. Силовое питание подключается через клеммник ''P'' c входным диапазоном напряжения от 5 до 12 вольт.
* Логический контур (Vcc) — питание вспомогательной цифровой логики управления микросхемы [[#драйвер_двигателей_tb6612fng|TB6612FNG]]. Логическое питание поступает на плату модуля через контакт ''V''. Диапазон входного напряжения от 3,3 до 5 вольт.
Если отсутствует хотя бы один из контуров питания — драйвер H-мост работать не будет.
При подключении питания соблюдайте полярность. Неправильное подключение может привести к непредсказуемому поведению или выходу из строя платы или источника питания.
==== Нагрузка ====
Нагрузка разделена на два независимых канала. Первый канал на плате обозначен шёлком ''M1'', а второй канал — ''M2''. К каждому каналу можно подключить по одному коллекторному мотору или объединить каналы для подключения биполярного шагового двигателя.
Обозначения «+» и «−» показывают воображаемые начало и конец обмотки. Если подключить два коллекторных двигателя, чтобы их одноимённые контакты щёточного узла соответствовали одному и тому же обозначению на плате, то при подаче на H-Bridge одинаковых управляющих импульсов, моторы будут вращаться в одну и ту же сторону.
==== Светодиодная индикация ====
^ Имя светодиода ^ Назначение ^
| DIR1/EN1 |Индикация состояния направления и скорости первого канала ''M1''. При высоком логическом уровне светится зелёным светом, при низком — красным. Яркость светодиода пропорциональна скорости вращения двигателя.|
| DIR2/EN2 |Индикация состояния направления и скорости первого канала ''M2''. При высоком логическом уровне светится зелёным светом, при низком — красным. Яркость светодиода пропорциональна скорости вращения двигателя.|
===== Принципиальная и монтажная схемы =====
{{:products:troyka-h-bridge-dual:troyka-h-bridge-dual-schematic.png?direct&420 |}}
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-layout-top.png?direct&250|}}
{{ :products:troyka-h-bridge-dual:troyka-h-bridge-dual-layout-bottom.png?direct&250|}}
===== Габаритный чертёж =====
[[this>_media/products:troyka-h-bridge-dual:troyka-h-bridge-dual-dimensions.pdf|{{:products:troyka-h-bridge-dual:troyka-h-bridge-dual-dimensions.png}}]]
===== Характеристики =====
* Драйвер моторов: TB6612FNG
* Количество подключаемых моторов: 2
* Напряжение логической части: 3,3–5 В
* Напряжение силовой части: 3,3—12 В
* Максимальный ток нагрузки: до 1,2 A на канал
* Максимальная частота переключения (ШИМ): 100 кГц
* Габариты модуля: 50,8×25,4×19 мм
===== Ресурсы =====
* [[amp>product/troyka-h-bridge-dual?utm_source=man&utm_campaign=troyka-h-bridge-dual&utm_medium=wiki|H-мост на 2 канала]] в магазине.
* [[https://github.com/amperka/hardware-drawings/blob/master/troyka-h-bridge-dual.svg|Векторное изображение датчика]]
* {{ :products:troyka-h-bridge-dual:tb6612fng-datasheet.pdf |Datasheet на драйвер моторов TB6612FNG}}