Как подключить шаговый двигатель от принтера к ардуино

4 Управление шаговым двигателем с помощью Arduino

Шаговый двигатель позволяет вращать ротор на определённый угол. Это бывает полезно, когда необходимо задать положение какому-либо механизму или его узлу. Шагом двигателя называется минимальный угол, на который можно повернуть ротор двигателя. Угол поворота и направление движения задаются в управляющей программе. Существует большое разнообазие шаговых двигателей. Рассмотрим работу с ними на примере двигателя 28BYJ-48 с драйвером ULN2003.

Характеристики двигателя 28BYJ-48:

Характеристика Значение
Количество фаз 4
Напряжение питания от 5 до 12 В
Число шагов 64
Размер шага 5,625°
Скорость вращения 15 об./сек
Крутящий момент 450 г/см

Модуль с микросхемой драйвера для управления шаговым двигателем выглядит так:

На входы IN1…IN4 подаются управляющие сигналы от Arduino. Используем любые 4 цифровых пина, например, D8…D11. На вход питания необходимо подать постоянное напряжение от 5 до 12 В. Двигателю желательно обеспечить отдельное питание. Но в данном случае, т.к. не планируется использовать двигатель на постоянной основе, можно подать питание и от Arduino. Перемычка «Вкл/выкл» просто разрывает «плюс» питания, подаваемого на драйвер. В «боевом» изделии сюда можно, например, коммутировать питание с помощью реле, когда это необходимо, чтобы снизить потребление всего изделия. Итак, схема подключения будет такой:

Соберём всё по схеме.

Для Arduino «из коробки» существует готовая библиотека для управления шаговыми двигателями. Она называется Stepper. Можно посмотреть готовые примеры в среде разработки для Arduino: File Examples Stepper. Они позволяют управлять шаговым двигателем, изменяя скорость и направление движения, поворачивать ротор на заданный угол. Как говорится – бери и пользуйся. Но давайте попробуем разобраться с принципом работы шагового двигателя самостоятельно, не применяя никаких библиотек.

Двигатель 28BYJ-48 имеет 4 фазы. Это означает, что у него имеются 4 электромагнитные катушки, которые под действием электрического тока притягивают сердечник. Если напряжение подавать на катушки поочерёдно, это заставит сердечник вращаться. Рисунок иллюстрирует данный принцип.

Здесь на (1) напряжение подано на катушки A и D, на (2) – на A и B, (3) – B и С, (4) – C и D. Далее цикл повторяется. И таким образом ротор двигателя вращается по кругу.

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

Простейший скетч управления шаговым двигателем (разворачивается)

Как можно догадаться, задержка del определяет скорость вращения двигателя. Уменьшая или увеличивая её можно ускорять или замедлять двигатель.

Если загрузить этот скетч, то увидим, что шаговый двигатель вращается против часовой стрелки. Соответственно, можно вынести цикл вращения в одну сторону в отдельную функцию rotateCounterClockwise(). И сделать аналогичную функцию вращения в противоположную сторону rotateClockwise(), в которой фазы будут следовать в обратном порядке. Также вынесем в отдельные функции каждую из 4-х фаз чтобы избежать дублирования одинакового кода в нескольких местах программы. Теперь скетч выглядит несколько интереснее:

Скетч управления шаговым двигателем (разворачивается)

Если мы загрузим скетч и проверим, поворачивается ли ротор двигателя на целый оборот, если один раз вызвать функцию rotateClockwise(), то обнаружим, что нет. Для совершения полного оборота функцию необходимо вызвать несколько раз. Соответственно, хорошо бы добавить в качестве аргумента функции число, которое будет показывать количество раз, которые она должна выполняться.

Финальный скетч управления шаговым двигателем (разворачивается)

Вот теперь совсем другое дело! Мы можем управлять скоростью шагового двигателя, задавая задержку после каждой фазы. Мы можем менять направление движения ротора двигателя. И, наконец, мы умеем поворачивать ротор на некоторый угол. Осталось только определить, какое число необходимо передавать в функции поворота rotateClockwise() и rotateCounterClockwise(), чтобы ротор шагового двигателя 1 раз провернулся на 360° вокруг своей оси. Собственно, дальнейшие наработки – вопрос фантазии или необходимости.

Пример использования

В качестве примера настроим автоматическую калибровку ESC-регулятора при запуске скетча Arduino. Нам потребуются следующие компоненты:

Плата Arduino Uno – 1;

Плата прототипирования – 1;

Мотор бесколлекторный – 1;

Потенциометр 10 кОм – 1;

Блок питания 12 В – 1;

Для калибровки в процедуре setup() производим эмуляцию перевода потенциометра м максимальное и минимальное положение. Содержимое скетча показано в листинге 2.

После запуска Arduino в процедуре setup() происходит калибровка регулятора, и в процедуре loop() мотор крутится со скоростью, соответствующей положению потенциометра.

Часто задаваемые вопросы

1. Не запускаются моторы

Проверьте подключение моторов к ESC-регулятору, ESC-регулятора к блоку питания и Arduino.

Работа схемы

Схема подключения BLDC двигателя и контроллера ESC к плате Arduino представлена на следующем рисунке.

Как видите, схема достаточно проста. Контроллеру ESC необходим источник питания с напряжением 12V и током как минимум 5A. Для питания схемы можно использовать адаптер или Li-Po батарейку

Три фазы (провода) BLDC двигателя необходимо подсоединить к трем выходным проводам контроллера ESC – неважно в каком порядке

Предупреждение : у некоторых контроллеров ESC нет выходных проводов, в этом случае вам необходимо будет припаивать провода от BLDC двигателя к контактам контроллера ESC. Обязательно изолируйте эти оголенные места (пайки) с помощью изоляционной ленты потому что через эти провода возможно протекание достаточно больших токов и любое короткое замыкание может привести к повреждению двигателя и контроллера ESC.

Схема BEC (Battery Eliminator circuit) в контроллере ESC будет самостоятельно обеспечивать (регулировать) постоянное напряжение +5V, поэтому его можно непосредственно использовать для питания платы Arduino. Для управления скоростью вращения двигателя в схеме используется потенциометр, подключенный к контакту A0 платы Arduino.

Внешний вид собранной конструкции показан на следующем рисунке.

Управление шаговым двигателем на Ардуино

Рассмотрим управление шаговым мотором при помощи стандартной библиотеки stepper.h и с помощью более удобной и популярной библиотеки accelstepper.h, где реализовано намного больше дополнительных команд и функций. Схема подключения мотора при этом остается неизменной. Чуть дальше мы перечислили возможные команды, которые можно использовать в программе с этими библиотеками.

Скетч для шагового двигателя на Ардуино (Stepper.h)

#include <Stepper.h> // библиотека для шагового двигателя // количество шагов на 1 оборот, измените значение для вашего мотора const int stepsPerRevolution = 200; // устанавливаем порты для подключения драйвера Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); void setup() { myStepper.setSpeed(60); // устанавливаем скорость 60 об/мин } void loop() { // поворачиваем ротор по часовой стрелке myStepper.step(stepsPerRevolution); delay(500); // поворачиваем ротор против часовой стрелки myStepper.step(-stepsPerRevolution); delay(500); }

Пояснения к коду:

  1. вместо портов 8,9,10,11 можно использовать любые цифровые порты;
  2. библиотека Stepper.h имеет маленький функционал, поэтому подходит только для тестирования шагового двигателя и проверки подключения драйвера.

Скетч для шагового мотора с библиотекой AccelStepper.h

#include // библиотека для шагового двигателя

Пояснения к коду:

  1. библиотеку AccelStepper.h можно использовать при подключении шагового двигателя к Motor Shield L293D совместно с библиотекой AFMotor.h;
  2. в программе можно задавать не только максимальную скорость, но и ускорение и замедление вала шагового двигателя.

Описание команд библиотеки AccelStepper.h

AccelStepper mystepper(DRIVER, step, direction);// Шаговый двигатель, управляемый платой AccelStepper mystepper(FULL2WIRE, pinA, pinB);// Шаговый двигатель, управляемый Н-мостом AccelStepper mystepper(FULL4WIRE, pinA1, pinA2, pinB1, pinB2);// Униполярный двигатель mystepper.setMaxSpeed(stepsPerSecond);// Установка скорости оборотов в минуту mystepper.setSpeed(stepsPerSecond);// Установка скорости в шагах за секунду mystepper.setAcceleration(stepsPerSecondSquared);// Установка ускорения

mystepper.currentPosition(); // Возвращает текущее положение в шагах mystepper.setCurrentPosition (long position); Обнуляет текущую позицию до нуля mystepper.targetPosition(); // Конечное положение в шагах mystepper.distanceToGo(); // Вернуть расстояние до указанного положения mystepper.moveTo(long absolute); // Переместиться в абсолютно указанное положение mystepper.move(long relative); // Переместиться в относительно указанное положение

mystepper.run(); // Начать движение с ускорением, функцию следует вызывать повторно mystepper.runToPosition(); // Начать движение до указанной точки mystepper.runToNewPosition(); // Начать движение с ускорением до заданной позиции mystepper.stop(); // Максимально быстрая остановка (без замедления) mystepper.runSpeed(); // Начать движение с заданной скоростью без плавного ускорения mystepper.runSpeedToPosition(); // Начать движение без плавного ускорения, до позиции

mystepper.disableOutputs(); // Деактивирует зарезервированные пины и устанавивает их в режим LOW. Снимает напряжение с обмоток двигателя, экономя энергию mystepper.enableOutputs(); // Активирует зарезервированные пины и устанавивает их в режим OUTPUT. Вызывается автоматически при запуске двигателя

Принцип работы H-моста

Перед тем, как переходить непосредственно к управлению двигателем, обсудим что такое H-BRIDGE (H-мост). Собранная нами далее схема будет осуществлять две функции: управлять двигателем постоянного тока с помощью управляющих сигналов малой мощности и изменять направление вращения двигателя.

Нам известно, что для изменения направления вращения двигателя постоянного тока необходимо изменить полярность приложенного к нему питающего напряжения. И как раз для смены полярности напряжения хорошо подходит устройство, называемое H-мостом. На представленном выше рисунке мы имеем 4 выключателя. Как показано на рисунке 2 если выключатели A1 и A2 замкнуты, то ток через двигатель течет справа налево как показано на второй части рисунка 2 – то есть в этом случае двигатель будет вращаться по часовой стрелке. А если выключатели A1 и A2 разомкнуты, а B1 и B2 – замкнуты, то ток через двигатель в этом случае будет протекать слева направо как показано на второй части рисунка, то есть двигатель будет вращаться против часовой стрелки. В этом и заключается принцип работы H-моста.

Рисунок 2 (часть 1)

Рисунок 2 (часть 2)

Мы в качестве H-моста будем использовать специализированную микросхему L293D, которую еще называют драйвером двигателей. Эта микросхема предназначена для управления двигателями постоянного тока малой мощности (см. рисунок) и содержит в своем составе два H-моста, то есть с ее помощью можно управлять двумя двигателями. Эта микросхема часто используется для управления двигателями в различных роботах.

В следующей таблице указаны необходимые значения напряжений на выводах INPUT1 и INPUT2 микросхемы L293D для смены направления вращения двигателя.

Enable Pin Input Pin 1 Input Pin 2 Motor Direction
High Low High вправо
High High Low влево
High Low Low стоп
High High High стоп

То есть, чтобы двигатель вращался по часовой стрелке необходимо чтобы на 2A было напряжение высокого уровня (high), а на контакте 1A – напряжение низкого уровня (low). Аналогично для вращения двигателя против часовой стрелки необходимо обеспечить на 1A напряжение высокого уровня, а на 2A – низкого.

Как показано на следующем рисунке Arduino UNO имеет 6 ШИМ каналов (обозначенных на плате специальным знаком – тильдой), любой из которых мы можем использовать для получения изменяющего напряжения (на основе ШИМ). В данном проекте мы будем использовать в качестве ШИМ выхода контакт PIN3 Arduino UNO.

Ограничение тока

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

На драйвере A4988 есть небольшой потенциометр, который можно использовать для установки ограничения тока. Вы должны установить ограничение по току равным или ниже номинального тока двигателя.

Для этого есть два метода:

Способ 1:

В данном случае мы собираемся установить ограничение тока путем измерения напряжения (Vref) на выводе «ref».

  1. Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов/об, 12 В 350 мА.
  2. Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
  3. Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP.
  4. Во время регулировки измерьте напряжение Vref (один щуп мультиметра на минус питания, а другой к металлическому корпусу потенциометра).
  5. Отрегулируйте напряжение Vref по формуле:

ограничение тока = Vref x 2,5

Например, если ваш двигатель рассчитан на 350mA, вы должны установить опорное напряжение 0,14В.

Способ 2:

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

  1. Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов / оборот, 12 В 350 мА.
  2. Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
  3. Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP. Не оставляйте вход STEP висящим в воздухе, подключите его к источнику питания логики (5 В)
  4. Подключите амперметр последовательно с одной из катушек шагового двигателя и измерьте фактический ток.
  5. Возьмите небольшую отвертку и отрегулируйте потенциометр ограничения тока, пока не установите номинальный ток шагового двигателя.

Подключение джойстика к Arduino UNO

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль джойстика ky-023;
  • 2 светодиода и 2 резистора;
  • макетная плата;
  • провода «папа-мама», «папа-папа».


Схема подключения аналогового джойстика к Ардуино Уно

После подключения к Ардуино джойстика, загрузите следующий скетч. В данном примере на монитор порта будут выводиться данные с джойстика, а при нажатии кнопки будет выключаться светодиод на плате, подключенный параллельно к Pin 13. Соберите схему с джойстиком на Arduino Uno, как показано на схеме выше, загрузите скетч и откройте монитор порта программы Arduino IDE на компьютере.

Скетч. Подключение джойстика к Ардуино

#define pinX    A2  // ось X джойстика
#define pinY    A1  // ось Y джойстика
#define swPin    2  // кнопка джойстика
#define ledPin  13  // светодиод на Pin 13

void setup() {
  Serial.begin(9600);
  
  pinMode(ledPin, OUTPUT);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  
  pinMode(swPin, INPUT);
  digitalWrite(swPin, HIGH);
}
 
void loop() {
  boolean ledState = digitalRead(swPin); // считываем состояние кнопки
  digitalWrite(ledPin, ledState);        // вкл./выкл. светодиод

  int X = analogRead(pinX);              // считываем значение оси Х
  int Y = analogRead(pinY);              // считываем значение оси Y

  Serial.print(X);                       // выводим в Serial Monitor
  Serial.print("\t");                    // табуляция
  Serial.println(Y);
}

Скетч. Управление джойстиком светодиодами

Теперь можно усложнить схему, сделав плавное включение светодиода, управляемое от джойстика. Для этого подключите два светодиода через резистор к аналоговым портам 5 и 6. В следующем скетче, с помощью функции map(), переменные X и Y преобразуются из диапазона чисел от 0 до 1023 в диапазон чисел от 0 до 255. Подключите светодиоды к пинам 5 и 6 Ардуино и загрузите следующий скетч.

#define pinX    A2  // ось X джойстика
#define pinY    A1  // ось Y джойстика
#define swPin    2  // кнопка джойстика
#define ledPin  13  // светодиод на Pin 13
#define ledX     5  // светодиод на Pin 5
#define ledY     6  // светодиод на Pin 6

void setup() {
  pinMode(ledX, OUTPUT);
  pinMode(ledY, OUTPUT);
 
  pinMode(ledPin, OUTPUT);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  
  pinMode(swPin, INPUT);
  digitalWrite(swPin, HIGH);
}
 
void loop() {
  boolean ledState = digitalRead(swPin); // считываем состояние кнопки
  digitalWrite(ledPin, ledState);        // вкл./выкл. светодиод

  int X = analogRead(pinX);    // считываем значение оси Х
  int Y = analogRead(pinY);    // считываем значение оси Y

  X = map(X, 0, 1023, 0, 255); // преобразуем значение X в другой диапазон
  Y = map(Y, 0, 1023, 0, 255); // преобразуем значение Y в другой диапазон
  
  analogWrite(ledX, X);        // включаем светодиоды с разной яркостью
  analogWrite(ledY, Y);
}

Пояснения к коду:

  1. с помощью функции можно задать любой, в том числе, обратный диапазон чисел. Также можно использовать отрицательные значения.

Заключение. Мы рассмотрели схему подключения джойстика к Arduino и несколько вариантов управления светодиодами от микроконтроллера. Как вы убедились сами, что работа с джойстиком Ардуино доступна любому начинающему мейкеру, так как принцип работы модуля ky-023 схож с простым потенциометром. Данный модуль может использоваться во многих интересных DIY проектах.

ДОКУМЕНТАЦИЯ

Документация

Инициализация

Библиотека поддерживает три типа драйверов:

  • DRIVER2WIRE – двухпроводной драйвер (направление + ШИМ)
  • DRIVER2WIRE_NO_INVERT – двухпроводной драйвер, в котором при смене направления не нужна инверсия ШИМ
  • DRIVER3WIRE – трёхпроводной драйвер (два пина направления + ШИМ)
  • RELAY2WIRE – реле в качестве драйвера (два пина направления)

Инициализация происходит следующим образом:

  • GMotor motor(DRIVER2WIRE, dig_pin, PWM_pin, level);
  • GMotor motor(DRIVER3WIRE, dig_pin_A, dig_pin_B, PWM_pin, level);
  • GMotor motor(RELAY2WIRE, dig_pin_A, dig_pin_B, level);
  • dig_pin , dig_pin_A , dig_pin_B – любой цифровой пин МК
  • PWM_pin – любой ШИМ пин МК
  • level – LOW / HIGH – уровень драйвера. Если при увеличении скорости мотор наоборот тормозит – смени уровень

Настройки

  • setDeadtime(us) – установка программного deadtime на переключение направления, us в микросекундах. По умолчанию стоит 0: deadtime отключен
  • setDirection(dir) – ГЛОБАЛЬНАЯ смена направления вращения мотора например чтобы FORWARD совпадал с направлением движения “вперёд” у машинки. dir – REVERSE или NORMAL (умолч.)
  • setLevel(level) – смена уровня драйвера (аналогично при инициализации). Если при увеличении скорости мотор наоборот тормозит – смени уровень. level – LOW или HIGH
  • setMinDuty(duty) – минимальный сигнал (по модулю), который будет подан на мотор. Автоматически сжимает диапазон регулирования мотора: например minDuty поставили 50, и при сигнале 1 будет на мотор будет подано

51, максимум останется прежним (диапазон сигнала переведётся в 50.. 255 внутри библиотеки).

Режим работы

У мотора есть 5 режимов работы, устанавливаются при помощи setMode(mode) , где mode:

  • FORWARD – вперёд
  • BACKWARD – назад
  • STOP – холостой (мотор отключен)
  • AUTO – отдать управление функции setSpeed()

Управление скоростью и направлением

Скорость устанавливается при помощи функции setSpeed(speed) . Есть два варианта управления скоростью:

  • Направление в ручном режиме, скорость 0..255 (0..1023). В этом случае скорость должна быть положительной ( setSpeed(0..255) ), направление вращения задаётся при помощи setMode() . При направлении FORWARD частота оборотов растёт по мере увеличения setSpeed(speed) , при направлении BACKWARD частота оборотов растёт в противоположную сторону по мере увеличения setSpeed(speed) .
  • Направление в автоматическом режиме, скорость -255..255 (-1023..1023 для 10 бит). В этом случае устанавливаем setMode(AUTO) и подаём скорость во всём диапазоне. При значении мотор -255 крутится с максимальной скоростью в направлении “назад”, при 255 – в направлении “вперёд”. При значении 0 (ноль) режим автоматически переключается на STOP. Если задан параметр minDuty (при помощи setMinDuty() ), то режим STOP будет автоматически активирован при значении скорости в пределах (-minDuty, minDuty). Пример: у нас есть мотор, экспериментально установлено, что он начинает вращаться при величине скорости больше 50 (и, соответственно, меньше -50), при меньшем значении он просто “пищит” и стоит на месте. Если мы выставим setMinDuty(50) , то в диапазоне -50..50 мотор автоматически будет находиться в режиме STOP и не будет пищать при “шуме” задающего сигнала.

Разрешение ШИМ

setSpeed(speed) может работать с ШИМ любого разрешения, для этого нужно

  • Перевести таймер в режим нужного разрешения. 8 битные таймеры можно запустить только на пониженном разрешении, а 16 битный – например на 10 битах (выводы D9 и D10), смотрите пример в библиотеке и урок по частоте ШИМ. По Arduino MEGA пока что такого готового набора у меня нет.
  • Настроить нужный объект класса GMotor на нужное разрешение при помощи setResolution(bit) , где bit – разрешение ШИМ в битах (по умолчанию 8). Также не забыть подключить пин драйвера ШИМ к выводу настроенного в первом пункте таймера (смотри пример).

Несколько моторов могут работать на одной плате с разным разрешением, т.е. например 2 мотора на таймере 1 с разрешением 10 бит, и ещё два на таймере 2 с разрешением 8 бит.

Плавное управление скоростью

В библиотеке реализован готовый инструмент для плавного изменения скорости, что может обеспечить плавный пуск и остановку механизмов:

  • setSmoothSpeed(acc) – установка скорости изменения скорости (т.е. ускорения) мотора
  • smoothTick(speed) – данная функция сама меняет скорость мотора, плавно приближая её к указанной speed . Функция работает по встроенному таймеру на millis() с периодом 50 мс, то есть рекомендуется вызывать smoothTick(speed) не реже, чем каждые 50 мс.

В примере smooth_control можно открыть плоттер и посмотреть, как работает алгоритм.

Исходный код программы

По умолчанию все необходимые заголовочные файлы подключаются автоматически самой средой ARDUINO IDE, она же конфигурирует сама и все регистры, необходимые для работы ШИМ, поэтому нам в программе уже не нужно заботиться об этих вещах. Все что нам нужно будет сделать – это определить на каком контакте мы будем использовать ШИМ.

То есть для использования ШИМ на нужном контакте нам необходимо сделать следующие вещи:

pinMode(ledPin, OUTPUT) analogWrite(pin, value) analogWriteResolution(neededresolutionnumber)

Сначала мы должны выбрать один из доступных 6 выходов (контактов) ШИМ. Потом необходимо установить этот контакт в режим на вывод данных.

После этого мы должны задействовать функции ШИМ на этом выходе используя функцию “ analogWrite(pin, value) ”. Здесь ‘pin’ обозначает номер контакта, на котором мы будем использовать ШИМ, в нашем случае это будет 3-й контакт.

Value в этой функции представляет собой цикл занятости (коэффициент заполнения) ШИМ, оно может принимать значения от 0 (всегда выключено) до 255 (всегда включено). Мы будем увеличивать и уменьшать это значение с помощью кнопок, присутствующих на схеме.

Плата Arduino UNO имеет максимальное разрешение (разрешающую способность) ШИМ, равную 8, что означает что value в функции analogWrite(pin, value) может принимать значения от 0 до 255. Но если в этом есть необходимость, мы можем уменьшать разрешение ШИМ используя функцию “ analogWriteResolution() ”, в скобках которой мы можем записать число в диапазоне 4-8, которое и будет определять разрешающую способность ШИМ платы Arduino UNO.

Переключатель на схеме служит для изменения направления вращения двигателя.

А теперь непосредственно сам код программы с комментариями.

Источник

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы рассмотрим только его основные фрагменты.

Для управления BLDC двигателем мы будем формировать ШИМ сигнал с частотой 50 Гц и изменяемым от 0 до 100% коэффициентом заполнения. Значение коэффициента заполнения будет управляться с помощью потенциометра. То есть, вращая потенциометр, мы будем управлять скоростью вращения двигателя. Как уже указывалось, управление BLDC двигателем очень похоже на управление сервомотором с помощью ШИМ 50 Гц, поэтому в данном случае мы будем использовать ту же самую библиотеку, которую использовали для управления сервомотором. Если вы начинающий в изучении платформы Arduino, то перед дальнейшим прочтением данной статьи рекомендуем вам изучить принципы формирования ШИМ сигнала в Arduino и подключение сервомотора к плате Arduino.

ШИМ сигнал можно генерировать только на тех цифровых контактах платы Arduino, которые обозначены символом ~. В нашей схеме мы будем управлять контроллером ESC с контакта 9 платы Arduino, поэтому следующей командой мы прикрепим контроллер ESC к этому контакту:

Arduino

ESC.attach(9);

1 ESC.attach(9);

Коэффициент заполнения ШИМ (от 0 до 100%) управляется с помощью положения ручки потенциометра. То есть когда на выходе потенциометра у нас будет 0V (0 на выходе АЦП), у нас коэффициент заполнения будет равен 0, а когда на выходе потенциометра будет 5V (1023 на выходе АЦП), коэффициент заполнения ШИМ будет равен 100%. Поэтому мы будем использовать функцию, которая будет считывать значение с выхода АЦП контакта A0.

Arduino

int throttle = analogRead(A0);

1 intthrottle=analogRead(A0);

Затем мы должны конвертировать полученное значение (оно будет в диапазоне от 0 до 1023) в диапазон от 0 до 180. В дальнейшем значение 0 у нас будет означать 0% коэффициент заполнения ШИМ, а значение 180 – 100% коэффициент заполнения ШИМ. Конвертация значения из диапазона 0-1023 в диапазон 0-180 будет осуществляться с помощью функции:

Arduino

throttle = map(throttle, 0, 1023, 0, 180);

1 throttle=map(throttle,,1023,,180);

В дальнейшем мы должны передать это значение в функцию управления двигателем, чтобы сформировать соответствующий ШИМ сигнал на необходимом нам контакте. Поскольку мы дали нашему серво объекту имя ESC, то команда для управления им будет выглядеть следующим образом:

Arduino

ESC.write(throttle);

1 ESC.write(throttle);

Управление оборотами однофазного асинхронного двигателя с помощью ARDUINO

Подскажите пожулуйста как можно управлять оборотами однофазного асинхронного двигателя (вентилятор твердотопливного котла)с помощью ардуино? Я новичок в этом перечитал гору информации, в голове все смешалось одни пишут что можно управлять с помощью обычного диммера, другие пишут что необходим частотный преобразователь. Мощность двигателя 85 вт, 2700 об. Планируется регулировать кол-во оборотов в зависимости от температуры теплоносителя от 30% до 100%, плавно, без рывков запуская двигатель на малых оборотах, а затем набирая их по необходимости.

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

Существует три способа регулирования частоты вращения асинхронного двигателя:

  1. изменением скольжения (только двигатели с фазным ротором);
  2. изменением числа пар полюсов;
  3. изменением частоты источника питания.

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

Для нормального управления асинхронным двигателем нужен частотник. Устройства плавного пуска (=УПП, =софт-стартеры) используют фазо-импульсный (ФИУ) способ подачи питания на двигатель (как диммер) только для того, чтобы обеспечить плавное нарастание тока потребления двигателя и не коротнуть питающую сеть при пуске. После разгона двигателя от УПП, в отличие от частотника, двигатель просто перебросить полностью на питание от сети, поскольку УПП по своему устройству синхронизировано с сетью. Использовать ФИУ для полноценного управления двигателем не получится, хотя в некоторых редких частных случаях может и «прокатить».

Если ПЧ для Вас дорого, то можно попробовать «старинный» метод регулировки подачи воздуха — управление шиберной задвижкой от сервопривода. Тут уже упор придется делать на механику. Собственно сам двигатель при таком способе всегда будет работать в номинале.

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

В этой статье что не понятно?

Существует три способа регулирования частоты вращения асинхронного двигателя:

  1. изменением скольжения (только двигатели с фазным ротором);
  2. изменением числа пар полюсов;
  3. изменением частоты источника питания.

Самому точно понятно что написал?

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

VictorNsk, кури букварь, для начала. Только лохи управляют частотой вращения асинхронного двигателя при помощи изменения напряжения.

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

VictorNsk, кури букварь, для начала. Только лохи управляют частотой вращения асинхронного двигателя при помощи изменения напряжения.

А особо одаренные, накурившиеся букварей, какой практический метод управления, с приведением конкретной схемы управления, предпочитают? Цитировать отрывки самокруток у вас неплохо получается. Интересно узнать ответ на предыдущий вопрос — самому точно понятно что написал?

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

я бы для начала попытался больше узнать про особенности двигателя. Они бывают разные

В моем случае производитель заявляет о возможности управлять производительностью вентилятора при помощи напряжения и в продаже есть ручные регуляторы двух типов — трансформаторные и электронные. Трансформаторный тут все просто — по сути ЛАТР с фиксированными коэффициентами. Один из вариантов для меня — купить готовый регулятор и щелкать обмотки релюшками. Если не лень, то можно такой трансформатор намотать самому. На каком принципе работает продаваемый электронный регулятор к сожалению не известно.

Такие же как этот у меня вентилятор я уже регулировал обычным ФИМ диммером. Они так работают много лет. Однако там есть большие минусы — стабильно вентиляторы работают только в узком диапазоне регулировок и при некоторых режимах издают лишний шум.

Сейчас планирую использовать ШИМ, в ссылке выше есть детали. Сразу предупрежу. Мой вариант не факт подойдет вам, ибо конструкция и особенности двигателей могут быть разные. Не забывайте, что при неправильном режиме работы обмотки могут перегреваться, что в конечном итоге может привезти к отказу

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

Контроль температуры в серверных шкафах с помощью Ардуино

Серверная на станции где я работаю, как и положено находится в отдельном помещении. Для охлаждения серверов там установлено два кондиционера. К сожалению это обычные бытовые модели, так что регулярно то один, то другой находятся в ремонте. Руководство отдела, зная о моей работе над проектом FLProg, предложило создать систему мониторинга температуры в серверных шкафах, и управления работой их вентиляторов. Информация о текущей температуре должна отображаться на табло в помещении дежурных инженеров, и в случае повышения температуры свыше определенного порога выдавать звуковую сигнализацию. Я взялся за эту работу, и вот что получилось…

Ситуация осложнялась тем что мы находимся где то в 200 километров от ближайшей цивилизации, и собирать систему пришлось из тех запасов что у меня были с собой, плюс что то из старого хлама из кладовок. В наличии у меня были:

1. Arduino Nano 2. Датчик температуры DS18B20 3. Два датчика температуры и влажности DHT-22 4. Четырехстрочный дисплей на 20 символов в строке с платой I2C

Была разработана схема устройства: Принципиальная схема

Потом разработаны печатные платы:

Утюга и специальной бумаги для технологии ЛУТ не нашлось так что пришлось вспоминать детство и рисовать платы ручками лаком, выпрошенным у уборщицы.

После первоначальной сборки и заливки пробного скетча возникли первые проблемы. Во первых, реле отказались срабатывать, хотя на катушки приходило 5 вольт. Перед установкой на плату я естественно проверял сопротивление катушек и подавал на них питание с проверкой сработки. Оказалось что реле очень хитрое. Хотя внутри и нет диодов (в обе стороны катушки прозваниваются одинаково), для них играет роль полярность питания на катушках. Скорее всего, у них подмагниченный якорь для снижения тока срабатывания. Из-за этого, релюшки переехали на другую сторону платы. После переезда релюшек все нормально заработало.

Затем была разработана окончательная прошивка для платы.

Как работает система. При подаче питания на контроллер, из EEPROM вычитываются уставки порогов включения ступеней вентиляторов шкафов, и аварийной сигнализации. Каждые 5 секунд считываются данные из датчиков и отображаются на дисплее. При превышении температуры в шкафу первого порога включается первый вентилятор, второго порога – второй, а при превышении порога аварийной температуры включается двухтональная звуковая сигнализация и начинает моргать подсветка дисплея. Квитирование аварии происходит при нажатии любой из кнопок. При падении температуры ниже уставки отключения вентиляторов оба вентилятора останавливаются. При каждом нажатии кнопки “Меню” на экран дисплея выводится последовательно все уставки. Каждую уставку можно изменить кнопками “Прибавить” и “Убавить”. При этом новое значение уставки сразу записывается в EEPROM. Если в течение 1 минуты не производить никаких действий с кнопками происходит переход на основной экран индикации температуры При нажатии сразу трех кнопок все уставки сбрасываются на начальные значения, записанные в программе. Это необходимо при первом запуске контроллера, когда в EEPROM находятся непредсказуемые значения. У меня, например, аварийная температура оказалась 387 градусов, и я бы очень устал ее сваливать до 35 градусов нажатиями на кнопку “Убавить”. Запуск системы на столе и прогрев датчиков феном показал работоспособность программы.

Были установлены датчики и проложены кабеля до шкафов

Во время пробной эксплуатации выяснились следующая тонкость. Во первых, ни в коем случае нельзя прокладывать кабеля к датчикам вместе с кабелями к вентиляторам. Я совершил эту ошибку, понадеявшись на малые токи вентиляторов. В результате время от времени при остановке вентилятора контроллер зависал. После разнесения кабелей на расстояние друг от друга эти зависания прекратились. Возможно так же помогло – бы применение экранированных проводов к датчикам, но таковых в наличии не было.

Прошу не обращать внимание на оригинальное крепление дисплея, но я посчитал слишком жирно ставить четырехстрочный дисплей на постоянную основу, и на следующей вахте заменю его на двухстрочный. На текущий момент система работает третью неделю без зависанй и отказов 24/7

Теперь немного гик-порно. Я не удержался и распотрошил сгоревший датчик DHT-22. Внутри он оказался очень умным.