Наши контакты: +380958663605
Двухканальный драйвер двигателя HG7881 является одним из самых дешевых драйверов от китайских производителей. К нему можно подключить два двигателя постоянного тока или 4-х проводный двухфазный шаговый двигатель.
Драйвер двигателя HG7881 может работать в двух режимах:
На плате драйвера двигателя задействованы 2 микросхемы контроллера L9110S , которые работают по принципу H-моста и используются для смены полярности питания мотора.
Заказать драйверо двигателя HG7881
Контакт | Описание |
B-IA | Двигатель B Вход A (IA) |
B-IB | Двигатель B Вход B (IB) |
GND | Земля (-) |
VCC | Рабочее напряжение 2.5-12V (+) |
A-IA | Двигатель A Вход A (IA) |
A-IB | Двигатель A Вход B (IB) |
Вход IA | Вход IB | Состояние двигателя |
L | L | Остановлен |
H | L | Движение вперед |
L | H | Движение назад |
H | H | Отключен |
В таблице указаны состояния для одного двигателя и состояние сигнала на входах драйвера IA и IB
Теперь когда мы слегка разобрались с нашим драйвером HG7881, перейдем к подбору и подключению двигателей.
Я использовал простые китайские двигатели но параллельно ко входам припаял конденсаторы емкостью 0.1 uf (0.1 мкФ) для защиты от помех и увеличения мощности двигателя.
После проверки правильности подключения загружаем скетч в плату ардуино
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
/* HG7881_Motor_Driver_Example - Arduino sketch This example shows how to drive a motor with using HG7881 (L9110) Dual Channel Motor Driver Module. For simplicity, this example shows how to drive a single motor. Both channels work the same way. This example is meant to illustrate how to operate the motor driver and is not intended to be elegant, efficient or useful. Connections: Arduino digital output D10 to motor driver input B-IA. Arduino digital output D11 to motor driver input B-IB. Motor driver VCC to operating voltage 5V. Motor driver GND to common ground. Motor driver MOTOR B screw terminals to a small motor. */ // wired connections #define HG7881_B_IA 10 // D10 --> Motor B Input A --> MOTOR B + #define HG7881_B_IB 11 // D11 --> Motor B Input B --> MOTOR B - // functional connections #define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed #define MOTOR_B_DIR HG7881_B_IB // Motor B Direction // the actual values for "fast" and "slow" depend on the motor #define PWM_SLOW 100 // arbitrary slow speed PWM duty cycle #define PWM_FAST 200 // arbitrary fast speed PWM duty cycle #define DIR_DELAY 1000 // brief delay for abrupt motor changes void setup() { Serial.begin( 9600 ); pinMode( MOTOR_B_DIR, OUTPUT ); pinMode( MOTOR_B_PWM, OUTPUT ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); } void loop() { boolean isValidInput; // draw a menu on the serial port Serial.println( "-----------------------------" ); Serial.println( "MENU:" ); Serial.println( "1) Fast forward" ); Serial.println( "2) Forward" ); Serial.println( "3) Soft stop (coast)" ); Serial.println( "4) Reverse" ); Serial.println( "5) Fast reverse" ); Serial.println( "6) Hard stop (brake)" ); Serial.println( "-----------------------------" ); do { byte c; // get the next character from the serial port Serial.print( "?" ); while( !Serial.available() ) ; // LOOP... c = Serial.read(); // execute the menu option based on the character recieved switch( c ) { case '1': // 1) Fast forward Serial.println( "Fast forward..." ); // always stop motors briefly before abrupt changes digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); delay( DIR_DELAY ); // set the motor speed and direction digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast isValidInput = true; break; case '2': // 2) Forward Serial.println( "Forward..." ); // always stop motors briefly before abrupt changes digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); delay( DIR_DELAY ); // set the motor speed and direction digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward analogWrite( MOTOR_B_PWM, 255-PWM_SLOW ); // PWM speed = slow isValidInput = true; break; case '3': // 3) Soft stop (preferred) Serial.println( "Soft stop (coast)..." ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); isValidInput = true; break; case '4': // 4) Reverse Serial.println( "Fast forward..." ); // always stop motors briefly before abrupt changes digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); delay( DIR_DELAY ); // set the motor speed and direction digitalWrite( MOTOR_B_DIR, LOW ); // direction = reverse analogWrite( MOTOR_B_PWM, PWM_SLOW ); // PWM speed = slow isValidInput = true; break; case '5': // 5) Fast reverse Serial.println( "Fast forward..." ); // always stop motors briefly before abrupt changes digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); delay( DIR_DELAY ); // set the motor speed and direction digitalWrite( MOTOR_B_DIR, LOW ); // direction = reverse analogWrite( MOTOR_B_PWM, PWM_FAST ); // PWM speed = fast isValidInput = true; break; case '6': // 6) Hard stop (use with caution) Serial.println( "Hard stop (brake)..." ); digitalWrite( MOTOR_B_DIR, HIGH ); digitalWrite( MOTOR_B_PWM, HIGH ); isValidInput = true; break; default: // wrong character! display the menu again! isValidInput = false; break; } } while( isValidInput == true ); // repeat the main loop and redraw the menu... } |
и открываем монитор порта
У нас появилось меню управления нашим моторчиком, в котором есть шесть режимов работы
Для запуска двигателя отправляем в монитор порта цифру (номер команды) и наслаждаемся работой.
Для смены режимов скоростей двигателей меняем значения в этих строчках скетча
1 2 |
#define PWM_SLOW 100 // arbitrary slow speed PWM duty cycle #define PWM_FAST 200 // arbitrary fast speed PWM duty cycle |
Для управления двумя двигателями одновременно по 2 каналам я переделал скетч …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
// wired connections #define HG7881_A_IA 8 // D8 --> Motor A Input A --> MOTOR A + #define HG7881_A_IB 9 // D9 --> Motor A Input B --> MOTOR A - #define HG7881_B_IA 10 // D10 --> Motor B Input A --> MOTOR B + #define HG7881_B_IB 11 // D11 --> Motor B Input B --> MOTOR B - // functional connections #define MOTOR_A_PWM HG7881_A_IA // Motor A PWM Speed #define MOTOR_A_DIR HG7881_A_IB // Motor A Direction #define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed #define MOTOR_B_DIR HG7881_B_IB // Motor B Direction // the actual values for "fast" and "slow" depend on the motor #define PWM_SLOW 100 // arbitrary slow speed PWM duty cycle #define PWM_FAST 250 // arbitrary fast speed PWM duty cycle #define DIR_DELAY 1000 // brief delay for abrupt motor changes void setup() { Serial.begin( 9600 ); pinMode( MOTOR_A_DIR, OUTPUT ); pinMode( MOTOR_A_PWM, OUTPUT ); digitalWrite( MOTOR_A_DIR, LOW ); digitalWrite( MOTOR_A_PWM, LOW ); pinMode( MOTOR_B_DIR, OUTPUT ); pinMode( MOTOR_B_PWM, OUTPUT ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); } void loop() { boolean isValidInput; // draw a menu on the serial port Serial.println( "-----------------------------" ); Serial.println( "MENU:" ); Serial.println( "1) Fast forward" ); Serial.println( "2) Forward" ); Serial.println( "3) Soft stop (coast)" ); Serial.println( "-----------------------------" ); do { byte c; // get the next character from the serial port Serial.print( "?" ); while( !Serial.available() ) ; // LOOP... c = Serial.read(); // execute the menu option based on the character recieved switch( c ) { case '1': // 1) Fast forward Serial.println( "Fast forward..." ); // always stop motors briefly before abrupt changes digitalWrite( MOTOR_A_DIR, LOW ); digitalWrite( MOTOR_A_PWM, LOW ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); delay( DIR_DELAY ); // set the motor speed and direction digitalWrite( MOTOR_A_DIR, HIGH ); // direction = forward analogWrite( MOTOR_A_PWM, 255-PWM_FAST ); digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast isValidInput = true; break; case '2': // 2) Forward Serial.println( "Forward..." ); // always stop motors briefly before abrupt changes digitalWrite( MOTOR_A_DIR, LOW ); digitalWrite( MOTOR_A_PWM, LOW ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); delay( DIR_DELAY ); // set the motor speed and direction digitalWrite( MOTOR_A_DIR, HIGH ); // direction = forward analogWrite( MOTOR_A_PWM, 255-PWM_SLOW ); digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward analogWrite( MOTOR_B_PWM, 255-PWM_SLOW ); // PWM speed = slow isValidInput = true; break; case '3': // 3) Soft stop (preferred) Serial.println( "Soft stop (coast)..." ); digitalWrite( MOTOR_A_DIR, LOW ); digitalWrite( MOTOR_A_PWM, LOW ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); isValidInput = true; break; default: // wrong character! display the menu again! isValidInput = false; break; } } while( isValidInput == true ); // repeat the main loop and redraw the menu... } |
Ну а этот скетч я сделал просто для тестирования работы двигателей с управлением скоростью
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#define HG7881_A_IA 8 #define HG7881_A_IB 9 #define HG7881_B_IA 10 #define HG7881_B_IB 11 #define MOTOR_A_PWM HG7881_A_IA #define MOTOR_A_DIR HG7881_A_IB #define MOTOR_B_PWM HG7881_B_IA #define MOTOR_B_DIR HG7881_B_IB void setup() { pinMode( MOTOR_A_DIR, OUTPUT ); pinMode( MOTOR_A_PWM, OUTPUT ); pinMode( MOTOR_B_DIR, OUTPUT ); pinMode( MOTOR_B_PWM, OUTPUT ); digitalWrite( MOTOR_A_DIR, LOW ); digitalWrite( MOTOR_A_PWM, LOW ); digitalWrite( MOTOR_B_DIR, LOW ); digitalWrite( MOTOR_B_PWM, LOW ); } void loop(){ digitalWrite( MOTOR_A_DIR, HIGH ); digitalWrite( MOTOR_B_DIR, HIGH ); analogWrite( MOTOR_A_PWM, 10 ); analogWrite( MOTOR_B_PWM, 10 ); } |
Как видите все работает и нет ничего сложного в подключении драйвера двигателя HG7881 к ардуино
На этом все, до скорых встреч…
Хорошая статья, но.
Вопросы:
1. Почему скорость не меняется после смены PWM значений?
2. ШИМ на 10 контакте nano возможен?
3. Смена направления вращения задается сменой значений LOW и HIGH на PWM и DIR, analogWrite подходит только для повышения/понижения яркости светодиода, за счет повышения/понижения выходного напряжения, но с моторчиком это не проходит.
хорошая статья, собирал когдато на базе данного драйвера и ультразвукового датчика простейшую carduino