Поскольку в шаговом двигателе имеются две пары катушек, для управления им придется изменять направление тока на обратное в каждой такой паре, а значит нам потребуются два Н-моста. Похоже, эта работа для микросхемы L293D.
Так и есть - в этом эксперименте и для Arduino, и для Raspberry Pi управление биполярным шаговым электродвигателем будет осуществляться с помощью микросхемы L293D, установленной на макетной плате
- Схема управления биполярным шаговым электродвигателем в сборе (вариант с Raspberry Рі)
Хотя в эксперименте используется шаговый двигатель с номинальным напряжением питания 12 В. он будет работать и от блока батарей с напряжением 6 В. У двигателя упадет момент, но крутиться он будет так же хорошо.
ОПРЕДЕЛЕНИЕ НАЗНАЧЕНИЯ КОНТАКТОВ ШАГОВОГО ЭЛЕКТРОДВИГАТЕЛЯ
Каждый новый шаговый двигатель должен иметь технический паспорт, а также еще и табличку на корпусе, с указанием назначения каждого из его четырех выводов. Главное, что здесь нужно знать, это какие выводы образуют пару, подключенную к одним и тем же катушкам
Для выяснения этого есть один прием. Нужно взять любые два провода и зажать их между большим и указательным пальцами, вращая при этом вал двигателя. Если ощущается сопротивление вращению, то эти два провода и есть пара.
Комплектующие
В этом эксперименте для работы с Arduino и Raspberry Pi понадобятся следующие комплектующие:
IC1 - Микросхема с Н-мостом L293D
C1 - Конденсатор 100нФ
C2 - Конденсатор 16 В 100 мкФ
M1 - Биполярный шаговый электродвигатель 12 В
Батарейный отсек 4 АА (6 В)
400-точечная беспаечная макетная плата
Перемычки
Конструкция
На рисунке ниже показана принципиальная электрическая схема этого эксперимента. В данном случае ШИМ не используется, поэтому два входа Enable микро- схемы L293D подсоединены к источнику питания 5 В, чтобы поддерживать оба Н-моста постоянно включенными. Шаговый двигатель управляется четырьмя каналами: In1, In2, In3 и In4, на которые будут подаваться управляющие сигналы от Arduino или Raspberry Pi.
Экспериментируем с Arduino
В версии этого эксперимента для Arduino мы воспользуемся окном монитора порта, чтобы через него подавать на Arduino команды, управляющие двигателем. Таких команд три, и состоят они из одной буквы с последующим числом. Например:
f100 - задает движение двигателю на 100 шагов вперед;
r100 - задает движение двигателю на 100 шагов в обратном направлении,
p10 - задает время задержки между импульсами шагов, равное 10 мс.
- Принципиальная электрическая схема управления биполярным шаговым электродвигателем
- Схема управления шаговым электродвигателем от Arduino в сборе
Подключение Arduino
При подключении Arduino к микросхеме L293D используются следующие контакты.
- Контакты для подключения Arduino к микросхеме L293D
Компоновка макетной платы для варианта с Arduino показана на рисунке ниже. Убедитесь, что микросхема установлена правильно (выемка на корпусе должна быть направлена вверх), и что конденсатор С2 емкостью 100 мкФ своим положительным выводом соединен с выводом 8 L293D. Чтобы вам было проще ориентироваться, напомню, что положительный вывод электролитического конденсатора обычно длиннее его отрицательного вывода. Отрицательный вывод конденсатора также может быть помечен на его корпусе символом «-» или ромбиком.
- Компоновка макетной платы для управления биполярным шаговым двигателем с Arduino
Программы для Arduino
Для этого эксперимента имеются два варианта программ. Первый более сложный, он предполагает задание контактов микросхемы L293D для управления ка тушками шагового двигателя согласно описанию, приведенному ранее, в разд. «
Биполярные шаговые электродвигатели». Это полезное упражнение для точного понимания работы шагового двигателя.
Второй вариант использует скетч с обращением к библиотеке
Stepper для Arduino, которая и делает всю работу. Поэтому второй вариант намного короче.
Сложный вариант программы
Первый вариант скетча для Arduino:
Код: Выделить всё
const int in1Pin = 10; // (1)
const int in2Pin = 9;
const int in3Pin = 11;
const int in4Pin = 8;
int period = 20; // (2)
void setup() { // (3)
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(in3Pin, OUTPUT);
pinMode(in4Pin, OUTPUT);
Serial.begin(9600);
Serial.println("Command letter followed by number");
Serial.println("p20 - set the inter-step period to 20ms (control speed)");
Serial.println("f100 - forward 100 steps");
Serial.println("r100 - reverse 100 steps");
}
void loop() { // (4)
if (Serial.available()) {
char command = Serial.read();
int param = Serial.parseInt();
if (command == 'p') { // (5)
period = param;
}
else if (command == 'f') { // (6)
stepForward(param, period);
}
else if (command == 'r') {
stepReverse(param, period);
}
}
setCoils(0, 0, 0, 0); // power down
}
void stepForward(int steps, int period) { // (7)
for (int i = 0; i < steps; i++) {
singleStepForward(period);
}
}
void singleStepForward(int period) { // (8)
setCoils(1, 0, 0, 1);
delay(period);
setCoils(1, 0, 1, 0);
delay(period);
setCoils(0, 1, 1, 0);
delay(period);
setCoils(0, 1, 0, 1);
delay(period);
}
void stepReverse(int steps, int period) {
for (int i = 0; i < steps; i++) {200
singleStepReverse(period);
}
}
void singleStepReverse(int period) { // (9)
setCoils(0, 1, 0, 1);
delay(period);
setCoils(0, 1, 1, 0);
delay(period);
setCoils(1, 0, 1, 0);
delay(period);
setCoils(1, 0, 0, 1);
delay(period);
}
void setCoils(int in1, int in2, int in3, int in4) { // (10)
digitalWrite(in1Pin, in1);
digitalWrite(in2Pin, in2);
digitalWrite(in3Pin, in3);
digitalWrite(in4Pin, in4);
}
Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. Программа начинается с определения выводов, которые будут использованы для управления двигателем. Можно, конечно, поменять выводы в соответствии с тем, как выполнен монтаж на макетной плате.
2. Переменная
period задает величину задержки между включениями катушек на каждом шаге по время вращения двигателя. Изначально задана величина задержки в 20 мс. Эту величину можно изменять с помощью окна монитора порта, чтобы ускорить или замедлить двигатель.
3. Функция
setup() конфигурирует выводы управления как выходы, запускает последовательный канал связи с окном монитора порта, а затем выводит сообщение, содержащее форматы команд, которые можно использовать.
4. В цикле основной программы
loop() ожидается приход команд по последовательному каналу, а в случае их получения обработка этих команд. Если команда получена (это покажет
Serial.available) в цикле
loop()) сначала будет считана буква команды, а затем следующий за буквой параметр.
Далее идет ряд выражений, задающих определенные действия, в зависимости от команды.
5. Если указана буква, то переменная рой принимает значение, равное пара- метру команды.
6. Если указана команда f или r. то вызываются функции
stepForward или
stepReverse со значением количества шагов и временем задержки между импульсами в качестве параметров.
7. Функции
stepForward и
stepReverse очень похожи. Они вызывают функции
singleStepSorward или
singleStepReverse столько раз, сколько задано шагов.
8. Далее переходим к функции
singleStepSorward , содержащей образцы полярностей четырех фаз переключения катушек двигателя для перемещения на один шаг. Образцы полярностей можно увидеть в качестве параметров для
setСoils.
9. Функция
ingleStepReverse работает так же, как и
singleStepForward, только в обратной последовательности. Сравните эти шаги с данными последней таблицы.
10. И, наконец, функция устанавливает состояние управляющих выводов в соответствии с образцом, заданным в качестве параметров.
Легкий вариант программы
Arduino IDE включает библиотеку
Stepper, которая отлично работает и может значительно уменьшить размер скетча.
Код: Выделить всё
#include <Stepper.h> // (1)
const int in1Pin = 10;
const int in2Pin = 9;
const int in3Pin = 8;
const int in4Pin = 11;
Stepper motor(200, in1Pin, in2Pin, in3Pin, in4Pin); // (2)
void setup() { // (3)
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(in3Pin, OUTPUT);
pinMode(in4Pin, OUTPUT);
while (!Serial);
Serial.begin(9600);
Serial.println("Command letter followed by number");
Serial.println("p20 - set the motor speed to 20");
Serial.println("f100 - forward 100 steps");
Serial.println("r100 - reverse 100 steps");
motor.setSpeed(20); // (4)
}
void loop() { // (5)
if (Serial.available()) {
char command = Serial.read();
int param = Serial.parseInt();
if (command == 'p') {
motor.setSpeed(param);
}
else if (command == 'f') {
motor.step(param);
}
else if (command == 'r') {
motor.step(-param);
}
}
}
Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. В первой строке скетча происходит импорт библиотеки
Stepper, которая уже включена в состав Arduino IDE, поэтому ее не нужно устанавливать специально.
2. Чтобы использовать библиотеку, в переменной
motor нужно задать тип шагового двигателя. Первый параметр количество шагов, которые двигатель делает за один оборот. Для шагового двигателя Adafruit, задействованного в этом проекте, задается значение в
200 шагов. На самом деле это означает 200 переключений фаз катушек на один оборот, что соответствует 50 физическим шагам на один оборот. Остальные четыре параметра - используемые выводы катушек.
3. Функция настройки
setup() почти такая же, что и для сложного варианта скетча. Сообщение немного отличается, поскольку в данном случае команда задает скорость вращения двигателя в об/мин (оборотов в минуту), что раньше делалось изменением времени задержки между подачей импульсов. Как бы там ни было, скорость двигателя можно изменить обоими этими способами.
4. По умолчанию скорость вращения двигателя в функции
setup() устанавливается с помощью функции
motor.set Speed, равной 20 об/мин.
5. Цикл основной программы
loop() также очень похож на вариант сложной версии скетча. Однако в данном случае количество шагов и направление вращения двигателя задается как положительное число при движении вперед и как отрицательное число при движении назад.
Число «шагов-четвертушек», задаваемых в параметрах команд f и r. в данном случае означает количество фаз переключения катушек. Чтобы используемый здесь шаговый двигатель Adafruit совершил полный оборот, нужно ввести число 200.
Загружаем и выполняем программу
Вы можете попробовать во всех режимах обе программы для шаговых двигателей. но далее мы будем считать, что в Arduinо загружен последний скетч. Откройте монитор порта, и вы увидите сообщение:
- Управление шаговым электродвигателем из монитора порта
Введите команду f200 и нажмите кнопку
Send (Отправить) - вал двигателя должен провернуться на один полный оборот. Если он не вращается, а дрожит или гудит, скорее всего, неправильно подключена одна из катушек. Поменяйте местами перемычки, идущие от шагового двигателя к выводам 3 и 6 микросхемы L293D и подайте команду снова.
Выполните команду r200, после чего вал двигателя должен сделать один оборот в противоположном направлении.
Далее можно поэкспериментировать со скоростью, используя команду и следующее за ней значение скорости в об/мин, - например
p5 с последующей
f200. Вал двигателя снова провернется на один оборот, но уже очень медленно. Можно увеличить скорость вращения, задав большее значение, скажем,
р100. Но тут обнаружится, что где-то в районе 130 об/мин существует ограничение скорости, выше которой часть шагов уже будет теряться, и вал двигателя не сможет сделать полный оборот.
Экспериментируем с Raspberry Pi
Управление шаговым двигателем с использованием программы на языке Python и Raspberry Pi очень напоминает вариант для Arduinо без использования библиотеки.
Для управления микросхемой L293D потребуется четыре управляющих выхода Raspberry Pi.
Программа на Python предложит ввести задержку между фазами переключения, направление и количество шагов.
Подключение Raspberry Pi
Вы вполне можете оставить макетную плату, использованную для подключения Arduino, заменив лишь перемычки, идущие к Raspberry Рі. Как уже не раз отмечалось ранее, подключение Raspberry Рі осуществляется перемычками «мама папа», а не «папа-папа», как в случае Arduino.
Программа для Raspberry Pi
Версия программы управления шагами для Raspberry Pi практически полностью повторяет вариант для Arduino без использования библиотек:
Код: Выделить всё
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
in_1_pin = 23 # (1)
in_2_pin = 24
in_3_pin = 25
in_4_pin = 18
GPIO.setup(in_1_pin, GPIO.OUT)
GPIO.setup(in_2_pin, GPIO.OUT)
GPIO.setup(in_3_pin, GPIO.OUT)
GPIO.setup(in_4_pin, GPIO.OUT)
period = 0.02
def step_forward(steps, period): # (2)
for i in range(0, steps):
set_coils(1, 0, 0, 1)
time.sleep(period)
set_coils(1, 0, 1, 0)
time.sleep(period)
set_coils(0, 1, 1, 0)
time.sleep(period)
set_coils(0, 1, 0, 1)
time.sleep(period)
def step_reverse(steps, period):
for i in range(0, steps):
set_coils(0, 1, 0, 1)
time.sleep(period)
set_coils(0, 1, 1, 0)
time.sleep(period)
set_coils(1, 0, 1, 0)
time.sleep(period)
set_coils(1, 0, 0, 1)
time.sleep(period)
def set_coils(in1, in2, in3, in4): # (3)
GPIO.output(in_1_pin, in1)
GPIO.output(in_2_pin, in2)
GPIO.output(in_3_pin, in3)
GPIO.output(in_4_pin, in4)
try:
print('Command letter followed by number');
print('p20 - set the inter-step period to 20ms (control speed)');
print('f100 - forward 100 steps');
print('r100 - reverse 100 steps');
while True: # (4)
command = raw_input('Enter command: ')
parameter_str = command[1:] # from char 1 to end
parameter = int(parameter_str) # (5)
if command[0] == 'p': # (6)
period = parameter / 1000.0
elif command[0] == 'f':
step_forward(parameter, period)
elif command[0] == 'r':
step_reverse(parameter, period)
finally:
print('Cleaning up')
GPIO.cleanup()
Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. Программа определяет константы для четырех управляющих выводов и устанавливает последние в состояние выходов.
2. Функции
step_forward и
step_reverse практически такие же, как и их эквиваленты для Arduino. Четыре катушки коммутируются в необходимом порядке при вызове функции
set_coils. Она многократно повторяет шаги, осуществляя задержку между каждым переключением катушек.
3. Функция set_coils устанавливает четыре управляющих вывода в соответствии с ее четырьмя параметрами.
4. В основном цикле программы командная строка считывается с помощью raw_input. Параметр, следующий за буквой, отделяется от буквы команды с помощью указания диапазона [1:], что для строк в Python означает строку от позиции 1 (второй символ) до конца строки.
5. Строковая переменная затем преобразуется в число с помощью встроенной
функции
int.
6. Серия из трех выражений, в каждом из которых выполняется определенное действие, в зависимости от команды: меняется значение переменной
period, происходит запуск двигателя в прямом или обратном направлении.
Загружаем и выполняем программу
Запустите программу командой:
sudo python bi_stepper.py
Появится сообщение с предложением ввести команды из разрешенного списка. Они точно такие же, как и в случае с Arduino:
Код: Выделить всё
Command letter followed by number
p20 - set the inter-step period to 20ms (control speed)
f100-forward 100 steps
r100-reverse 100 steps
Enter command: p5
Enter command: f50
Enter command: p10
Enter command: r100
Enter command: