====== 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}}