Программирование на Python: Управление шаговым двигателем + Raspberry Pi Zero + L293D IC - PullRequest
0 голосов
/ 15 мая 2018

(Внимание! Я не обучен этой теме)

Привет, ребята. Я пишу здесь, потому что у меня есть подруга, которая остро нуждается в помощи с ее проектом. Я знаком со сценариями, но не слишком много с программированием. Я работаю в сфере ИТ, поэтому сделаю все возможное, чтобы предоставить необходимую информацию. Она пытается запрограммировать Raspberry Pi Zero для управления шаговым двигателем с помощью Python 3. Все просто.

Она следовала этим урокам. Похоже, она использовала детали и проводку от # 1 и код от # 2:

  1. https://tutorials -raspberrypi.com / как к контрольно-а-шаговый мотор-с-малина-пи-и-L293D-ULN2003A /

  2. https://www.raspberrypi.org/forums/viewtopic.php?f=49&t=55580

Полезные картинки здесь. Это ее фактическая установка: https://photos.app.goo.gl/WJbCo4UU3wAdo8913

Полезные замечания: она упомянула, что не использует резистор между источником питания и ИС драйвера L293D.

Используемые детали:

-Raspberry Pi Zero (рекомендовалось Pi 2 или 3, но Zero имеет ту же распиновку, что и 2 & 3. Ей просто пришлось припаять свой собственный двойной заголовок)

-12 В DC Power Bank

-Nema 17 шаговый двигатель (https://www.amazon.com/STEPPERONLINE-17HS13-0404S1-Stepper-Motor-Printer/dp/B00PNEQ9T4)

-L293D ИС драйвера двигателя (https://www.amazon.com/NDRTJM-SHOMPFL1045-L293D-Stepper-Driver/dp/B008XCGLNM)

- Макет с перемычками (Дух!)

Код, который она использует, приведен ниже. Когда она пытается запустить его, мотор просто вибрирует. Похоже, что он постоянно делает шаг вперед и шаг назад. Коды ошибок не получены. Она также попыталась использовать другой шаговый двигатель Nema 17, который потреблял 2А, но опустился до Nema 17, который потребляет 0,4А и получил тот же результат.

import RPi.GPIO as GPIO
import time

#variables

delay = 0.05
steps = 500

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#Enable GPIO pins for ENA and ENB for stepper

enable_a = 18
enable_b = 22

#Enable pins for IN1-3 to control step sequence
 coil_A_1_pin = 17 #black
coil_A_2_pin = 4 #green
coil_B_1_pin = 24 #red
coil_B_2_pin = 23 #blue

#Set pin states

GPIO.setup(enable_a, GPIO.OUT)
GPIO.setup(enable_b, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)

#set ENA and ENB to high to enable stepper

GPIO.output(enable_a, True)
GPIO.output(enable_b, True)

#function for step sequence

def setStep(w1, w2, w3, w4):
     GPIO.output(coil_A_1_pin, w1)
     GPIO.output(coil_A_2_pin, w2)
     GPIO.output(coil_B_1_pin, w3)   
     GPIO.output(coil_B_2_pin, w4) 

#loop through step sequence based on number of steps

for i in range(0, steps):
     setStep(1,1,0,0)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(0,0,1,1)
     time.sleep(delay)
     setStep(1,0,0,1)
     time.sleep(delay)

#reverse previous step sequence to reverse motor direction

for i in range(0, steps):
     setStep(1,0,0,1)
     time.sleep(delay)
     setStep(0,0,1,1)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(1,1,0,0)
     time.sleep(delay)

Если есть НИЧЕГО, что я пропустил, или вам нужна дополнительная информация, пожалуйста, дайте мне знать, и я быстро отвечу! Любая помощь с благодарностью! Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

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

0 голосов
/ 16 мая 2018

Код, который работал, показан ниже.Вы можете использовать Raspberry Pi Zero, 2 или 3. Другие используемые компоненты: банк питания 12 В постоянного тока, макетная плата, микросхема драйвера двигателя L293D и шаговый двигатель Nema 17 (напряжение 0,4 А).Все это было сделано с использованием Python 3. Просмотрите ссылки выше, если вам нужны картинки или учебные пособия.Привет Янну за исправление!Он настоящий MVP.

import RPi.GPIO as GPIO
import time

#variables

delay = 0.005
steps = 500

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#Enable GPIO pins for ENA and ENB for stepper

enable_a = 18
enable_b = 22

#Enable pins for IN1-3 to control step sequence
 coil_A_1_pin = 17 #black
coil_A_2_pin = 4 #green
coil_B_1_pin = 24 #red
coil_B_2_pin = 23 #blue

#Set pin states

GPIO.setup(enable_a, GPIO.OUT)
GPIO.setup(enable_b, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)

#set ENA and ENB to high to enable stepper

GPIO.output(enable_a, True)
GPIO.output(enable_b, True)

#function for step sequence

def setStep(w1, w2, w3, w4):
     GPIO.output(coil_A_1_pin, w1)
     GPIO.output(coil_A_2_pin, w2)
     GPIO.output(coil_B_1_pin, w3)   
     GPIO.output(coil_B_2_pin, w4) 

#loop through step sequence based on number of steps

for i in range(0, steps):
     setStep(0,1,0,1)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(1,0,1,0)
     time.sleep(delay)
     setStep(1,0,0,1)
     time.sleep(delay)

#reverse previous step sequence to reverse motor direction

for i in range(0, steps):
     setStep(1,0,0,1)
     time.sleep(delay)
     setStep(1,0,1,0)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(0,1,0,1)
     time.sleep(delay)
0 голосов
/ 21 ноября 2018

Я использую аналогичную настройку с использованием Rasberry Pi 0 W и SDComponents MotorShield для управления двумя шаговыми двигателями.

Я использую код, который они поставили на github: https://github.com/sbcshop/motor-shield

, который выглядит очень похоже на то, как у вас настроен ваш код (посмотрите на файл PiMotor.py)

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

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

    def forward(self, delay, steps):
       for i in range(0, steps):
          setStep(1,0,1,1)
          time.sleep(delay)
          setStep(0,0,1,0)
          time.sleep(delay)
          setStep(0,1,0,0)
          time.sleep(delay)
          setStep(1,1,0,1)
          time.sleep(delay)

    def backward(self, delay, steps):
       for i in range(0, steps):
          setStep(1,1,0,1)
          time.sleep(delay)
          setStep(0,1,0,0)
          time.sleep(delay)
          setStep(0,0,1,0)
          time.sleep(delay)
          setStep(1,0,1,1)
          time.sleep(delay)

Я обнаружил, что последовательность на этом видео YouTube -> https://youtu.be/ca8VP_zuMw8

парень объясняет, как он это настроил, который похож на ваш с макетом и всем (я не использую макет), и я просто включил числа, которые он показывает в 5:22 того видео для «вперед»'и затем перевернул таблицу вверх дном, чтобы прочитать от 3 до 0, чтобы получить значения для' назад '.

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

Я могу предоставить фотографии того, как выглядит моя установка, и мы можем сравнивать / помогать друг другу в наших маленьких проектах.Дайте мне знать, если эта последовательность для «вперед» и «назад» работает для вас.Удачи!

0 голосов
/ 15 мая 2018

Похоже, что вы в основном там, но конкретная последовательность не делает шаговый шаг.В L293D значения выводов ввода-вывода, по сути, являются тем, чем мы управляем катушкой, и я думаю, что здесь coil_A и coil_B - это две катушки, 1 и 2 которых являются их концами (две катушки типичны для биполярного шагового двигателя).Итак, вы применили следующие состояния:

1100  == ==   No power
0110  << >>   both coils energised
0011  == ==   No power
1001  >> <<   both coils energised the opposite way

Это не обеспечивает руководство для двигателя и скорее всего просто приведет к вибрации.Попробуйте шаблон полного шага, в котором вы изменяете направление одной катушки за раз:

fullsteps = ((0,1,0,1), (0,1,1,0), (1,0,1,0), (1,0,0,1))

for i in range(0, steps):
    for pattern in fullsteps:
        setStep(*pattern)
        time.sleep(delay)

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

halfsteps = ((0,1,0,1), (0,1,0,0), (0,1,1,0), (0,0,1,0), 
             (1,0,1,0), (1,0,0,0), (1,0,0,1), (0,0,0,1))

На второй взгляд, это на самом деле шаблон, использованный в вашей первой ссылке (чуть ниже комментария «настроить, если отличается» - только в обратном направлении и два полушагов не в фазе сверсия здесь).

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

Если мы сравним таблицы, показанные в http://www.nmbtc.com/step-motors/engineering/full-half-and-microstepping/, то их таблицы будут использовать порядок AB ~ A ~ B, в то время как ваш код использует A ~ AB ~ B.Таким образом, другой способ заставить код работать, это просто поменять местами B и ~ A:

def setStep(w1, w3, w2, w4):
    GPIO.output(coil_A_1_pin, w1)
    GPIO.output(coil_A_2_pin, w2)
    GPIO.output(coil_B_1_pin, w3)   
    GPIO.output(coil_B_2_pin, w4) 
...