Общие сведения
Мотор-редуктор RS550-15000, 12 В — силовой привод из тех, что стоят в детских электромобилях: коллекторный мотор RS550 и понижающий редуктор в одном пластиковом корпусе. Мотор сам по себе крутится очень быстро и слабо, редуктор превращает эти обороты в медленное и сильное вращение выходного вала.
Берут его туда, где нужна тяга, а не точность: тележки и большие колёсные роботы, лебёдки, приводы ворот и шлагбаумов, мешалки, кормушки, форточки теплиц, самодельная техника. Питание — 12 В постоянного тока: блок питания, автомобильный или гелевый аккумулятор.
И сразу честно, чтобы потом не было обид: своей электроники внутри нет. Нет энкодера и датчика оборотов, нет концевиков, нет защиты от перегрузки, нет тормоза. Мотор щёточный, редуктор пластиковый. Всё, что он умеет — крутиться в ту сторону, куда подали напряжение, и с той скоростью, которую вы задали.
К выводам Arduino такой мотор не подключают никогда, и маленькие драйверы ему не годятся: Motor Shield рассчитан на 2 А, L293D Motor Shield — и того меньше. Наш мотор возьмёт больше в первый же миг после включения и спалит их. Нужен силовой драйвер — драйвер мотора BTS7960 на 43 А, ему и посвящён раздел «Подключение».
Характеристики
- Мотор: коллекторный RS550, питание 12 В постоянного тока
- Обороты мотора: 15 000 об/мин на холостом ходу — это обороты до редуктора
- Редуктор: понижающий, в пластиковом корпусе; на выходном валу получаются сотни оборотов в минуту, а не тысячи
- Выход редуктора: шлицевая втулка под ось детского электромобиля
- Крепление: два уха с отверстиями на корпусе редуктора
- Выводы мотора: два плоских лепестка, провода не припаяны
- Вес: 490 г
- Энкодера, датчиков и защиты от перегрузки нет
Точное передаточное число производитель не сообщает. Если для вашей задачи важна скорость на валу, измерьте её сами: поставьте метку на выходной втулке, дайте небольшой ШИМ и посчитайте обороты за 10 секунд, потом умножьте на шесть. Нужен вариант побыстрее — рядом, в списке «Модификация», стоит мотор на 23 000 об/мин с тем же редуктором.
Подключение
Почему нужен силовой драйвер
Ток у такого мотора совсем не «миллиамперы, как у датчика». На холостом ходу он берёт единицы ампер, под нагрузкой заметно больше, а в момент пуска и в упоре (вал держат, а напряжение подано) счёт идёт на десятки ампер: стоящий ротор для источника питания почти то же самое, что короткое замыкание. Отсюда три правила:
- драйвер выбирают по пусковому току, а не по рабочему;
- силовая часть идёт мимо Arduino — плата только командует;
- провода и клеммы в силовой части должны быть толстыми.
драйвер мотора BTS7960 на 43 А как раз для этого: 43 А кратковременно и до 10 А в долгую (в долгую ограничивает клеммник на плате), питание мотора от 5,5 до 27,5 В, управляющие входы понимают и 3,3 В, и 5 В логику. Наши 12 В укладываются в эти рамки с запасом.
Что приготовить
- драйвер мотора BTS7960 на 43 А — он тут главный;
- Arduino Uno или Arduino Nano — подойдёт любая плата, нужен всего один вывод с ШИМ и два обычных;
- питание 12 В: блок питания 12 В / 200 Вт или 12 В / 300 Вт, либо аккумулятор;
- силовой провод — чёрный и красный силиконовый 16AWG (1,27 мм²);
- винтовой клеммник, чтобы силовые соединения не держались на скрутке;
- предохранитель на 20–30 А в плюс питания — подойдёт обычный автомобильный ножевой с колодкой;
- по желанию: датчик тока 20 А, чтобы увидеть реальный ток своего привода, и потенциометр 10 кОм для ручки скорости из второго примера.
Собираем, по шагам
- Логика. 5V Arduino → Vcc драйвера, GND Arduino → GND драйвера. Драйвер потребляет от платы считанные миллиамперы, это безопасно.
- Скорость. Вывод 9 → входы R_EN и L_EN драйвера, соединённые вместе. Вывод обязательно с ШИМ.
- Направление. Вывод 8 → R_PWM, вывод 7 → L_PWM. Тут ШИМ не нужен, годятся любые цифровые выводы.
- Мотор. Клеммы M+ и M− драйвера → лепестки мотора. Поменяете местами — вал будет крутиться в другую сторону.
- Питание мотора. Клеммы S+ и S− → плюс и минус блока питания. В плюс ставится предохранитель.
Минус логики и минус питания мотора на плате драйвера общие, поэтому отдельный провод от Arduino к S− тянуть не нужно — и не нужно именно потому, что по такому проводу пошёл бы ток мотора. А вот GND Arduino с GND драйвера соединить обязательно: без общего минуса драйвер не понимает сигналы.
Питание логики драйвер берёт от Arduino, а мотор — только от своего источника. Запитать мотор от USB, от вывода 5V платы или от «того же блока питания, что и Arduino, лишь бы провод дотянулся» — верный способ спалить плату и получить перезагрузки на каждом пуске.
Как этим управлять
Схема в три провода, под неё написаны оба примера:
- вперёд: L_PWM = 0, R_PWM = 1, на EN — ШИМ (больше ШИМ — выше скорость);
- назад: L_PWM = 1, R_PWM = 0, на EN — ШИМ;
- свободный выбег: EN = 0. Мотор электрически отключён и катится по инерции;
- торможение: L_PWM и R_PWM в одинаковом состоянии (оба 0 или оба 1), на EN — ШИМ. Чем больше ШИМ, тем сильнее тормозит.
Есть ещё схемы в два и в четыре провода — они расписаны в карточке драйвера.
Какой нужен блок питания
Считать надо по пусковому току, а не по рабочему. В момент включения ротор ещё стоит, и мотор ведёт себя почти как закоротка: ток ограничен только сопротивлением обмотки и проводов. Дешёвый блок питания в этот момент уходит в защиту и начинает «моргать», а аккумулятор просто проседает по напряжению.
- Самое простое лекарство — плавный пуск, он есть в обоих примерах: ШИМ поднимается за полторы секунды, и броска нет.
- Блок питания берите с запасом: 12 В / 200 Вт — это 16 А, 12 В / 300 Вт — 25 А.
- Поставьте электролитический конденсатор прямо на клеммы S+ и S−: он сгладит бросок. Хорошо бы 470–1000 мкФ на 25 В и выше; из наших подойдут конденсаторы 220 мкФ × 35 В, поставленные парой параллельно. Полярность не перепутайте.
- Аккумулятор 12 В к броскам тока относится спокойнее любого блока питания — для подвижной техники это и проще, и честнее.
Провода, клеммы, предохранитель
- Силовая часть — провод 16AWG (1,27 мм²) и толще, коротким путём. Сигнальные три провода к Arduino могут быть любыми тонкими.
- На мотор провода нужно припаять к лепесткам или надеть клеммы-«мама»: в комплекте проводов нет.
- Предохранитель 20–30 А ставится в плюс от источника. Он бережёт проводку и источник, а не драйвер.
- Плюс и минус питания не перепутайте: защиты от переполюсовки у драйвера нет.
- Винты клеммника затягивайте как следует. Слабый контакт при 10 А греется и плавит колодку — это самая частая беда силовых схем.
- Провода к мотору скрутите между собой парой: меньше помех соседней электронике.
Что беречь
- Редуктор пластиковый. Держать вал застопоренным под напряжением нельзя: зубья срезает, а ток в этот момент максимальный. Если привод может упереться — ставьте концевик или ограничивайте время работы в программе.
- Реверс только через остановку. Смена направления на ходу — это мгновенный двойной ток и удар по зубьям. В обоих примерах перед сменой стоит пауза.
- Момент на выходе большой. Корпус редуктора крепите жёстко, иначе привод провернёт сам себя вместе с проводами.
- Мотор греется. При долгой работе под нагрузкой давайте ему передышки или обдув; корпус редуктора пластиковый и перегрева не любит.
- Гудение на ШИМ. Стандартные 490 Гц у Arduino мотор озвучивает хорошо слышимым гулом. В примерах частота поднята примерно до 3,9 кГц одной строкой: TCCR1B = (TCCR1B & 0b11111000) | 0b00000010; — это выводы 9 и 10. Выше 25 кГц драйверу нельзя, а выводы 5 и 6 трогать не стоит: на их таймере работают millis() и delay().
- Щётки — расходник. Это не бесколлекторный мотор: у него есть свой ресурс, и чем чаще упоры и реверсы, тем он короче.
Примеры
Туда-сюда с плавным разгоном
Мотор плавно разгоняется вперёд, работает, плавно тормозит, ждёт остановки и едет назад. Выводы назначены в первых строках, скорость и время — следом.
const uint8_t PIN_EN = 9; // № вывода Arduino к входам драйвера L_EN и R_EN (соединены вместе). Обязательно вывод с ШИМ - это скорость
const uint8_t PIN_LPWM = 7; // № вывода Arduino к входу драйвера L_PWM. Любой цифровой, ШИМ тут не нужен
const uint8_t PIN_RPWM = 8; // № вывода Arduino к входу драйвера R_PWM. Любой цифровой, ШИМ тут не нужен
const uint8_t SPEED = 200; // Рабочая скорость: 0 (стоп) ... 255 (полная). Начните с небольшой
const uint16_t RAMP_MS = 1500; // За сколько миллисекунд разгоняемся и за столько же тормозим
const uint16_t WORK_MS = 3000; // Сколько крутим на рабочей скорости
const uint16_t PAUSE_MS = 1000; // Пауза перед сменой направления: вал должен остановиться
void setup(){
pinMode(PIN_EN, OUTPUT);
pinMode(PIN_LPWM, OUTPUT);
pinMode(PIN_RPWM, OUTPUT);
analogWrite(PIN_EN, 0); // Мотор свободен: пока не подали ШИМ на EN, он никуда не поедет
TCCR1B = (TCCR1B & 0b11111000) | 0b00000010; // Частота ШИМ на выводах 9 и 10 -> около 3,9 кГц вместо 0,5 кГц: мотор не гудит
} // Таймер 0 (выводы 5 и 6) не трогаем - на нём живут millis() и delay()
void motorDirection(bool forward){ // Направление задаётся ДО подачи скорости
digitalWrite(PIN_LPWM, forward ? LOW : HIGH);
digitalWrite(PIN_RPWM, forward ? HIGH : LOW );
}
void motorRamp(uint8_t from, uint8_t to, uint16_t ms){ // Плавно меняем скорость: пусковой ток не бьёт по блоку питания
int16_t steps = (from < to) ? (to - from) : (from - to);
if(steps == 0){ analogWrite(PIN_EN, to); return; }
uint16_t pause = ms / steps;
for(int16_t i = 0; i <= steps; i++){
analogWrite(PIN_EN, (from < to) ? (from + i) : (from - i));
delay(pause);
}
}
void loop(){
motorDirection(true); // Вперёд
motorRamp(0, SPEED, RAMP_MS); // Плавно разгоняемся
delay(WORK_MS); // Крутим
motorRamp(SPEED, 0, RAMP_MS); // Плавно тормозим
delay(PAUSE_MS); // Ждём полной остановки вала. Реверс на ходу удваивает ток и ломает редуктор
motorDirection(false); // Назад
motorRamp(0, SPEED, RAMP_MS);
delay(WORK_MS);
motorRamp(SPEED, 0, RAMP_MS);
delay(PAUSE_MS);
}
Скорость и направление ручкой
Ручка потенциометра в середине — мотор стоит, вправо — едет вперёд, влево — назад, и чем дальше повёрнута, тем быстрее. Вокруг середины сделана мёртвая зона, направление переключается только на остановленном моторе, а скорость меняется плавно.
const uint8_t PIN_EN = 9; // № вывода Arduino к входам драйвера L_EN и R_EN (соединены вместе). Скорость, нужен ШИМ
const uint8_t PIN_LPWM = 7; // № вывода Arduino к входу драйвера L_PWM. Направление
const uint8_t PIN_RPWM = 8; // № вывода Arduino к входу драйвера R_PWM. Направление
const uint8_t PIN_POT = A0; // № вывода Arduino к среднему выводу потенциометра. Крайние - на 5V и GND
const uint8_t SPEED_MAX = 255; // Ограничение скорости: поставьте меньше, если мотор рвёт передачу
const uint16_t DEAD = 60; // Мёртвая зона вокруг середины ручки, в единицах АЦП. Меньше 30 не ставьте: ручка "дрожит"
const uint8_t STEP_MS = 5; // Шаг разгона. 255 шагов по 5 мс = примерно 1,3 с от нуля до полной
int16_t speedNow = 0; // Текущая скорость: минус - назад, плюс - вперёд
bool dirNow = true; // Куда сейчас настроен драйвер
void setDirection(bool forward){
dirNow = forward;
digitalWrite(PIN_LPWM, forward ? LOW : HIGH);
digitalWrite(PIN_RPWM, forward ? HIGH : LOW );
}
void setup(){
pinMode(PIN_EN, OUTPUT);
pinMode(PIN_LPWM, OUTPUT);
pinMode(PIN_RPWM, OUTPUT);
analogWrite(PIN_EN, 0); // Мотор свободен
setDirection(true);
TCCR1B = (TCCR1B & 0b11111000) | 0b00000010; // ШИМ на выводах 9 и 10 -> около 3,9 кГц: мотор не свистит
Serial.begin(9600);
}
int16_t readTarget(){ // Ручка в середине - стоп, вправо - вперёд, влево - назад
int16_t pot = analogRead(PIN_POT) - 512; // Середина ручки - это ноль
int16_t away = pot > 0 ? pot : -pot; // Насколько ручка ушла от середины
if(away < (int16_t)DEAD){ return 0; } // В мёртвой зоне мотор стоит
int16_t v = map(away - (int16_t)DEAD, 0, 511 - (int16_t)DEAD, 0, SPEED_MAX);
if(v > SPEED_MAX){ v = SPEED_MAX; }
return (pot > 0) ? v : -v;
}
void loop(){
int16_t target = readTarget();
if(speedNow < target){ speedNow++; } // К цели идём по одному шагу: это и есть плавный пуск
else if(speedNow > target){ speedNow--; }
if(speedNow == 0){ // Направление переключаем только на остановленном моторе
bool want = (target >= 0);
if(want != dirNow){ setDirection(want); }
}
analogWrite(PIN_EN, speedNow > 0 ? speedNow : -speedNow);
static uint32_t tPrint = 0; // Раз в полсекунды показываем, что происходит
if(millis() - tPrint > 500){
tPrint = millis();
Serial.print(F("ручка: ")); Serial.print(target);
Serial.print(F(" мотор: ")); Serial.print(speedNow);
Serial.println(dirNow ? F(" (вперёд)") : F(" (назад)"));
}
delay(STEP_MS);
}
Комплектация
- 1x Мотор-редуктор RS550-15000, 12 В;
















