Телефонуйте » (+38) 096 227 41 41

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

Точно так же, якщо робите власного невеликого робота, то, ймовірно, хочете мати можливість повертати його колеса в обох напрямках.
Мотори постійного струму не можна підключати безпосередньо до Raspberry Pi (RPi). Це обумовлено тим, що виходи RPi не здатні видавати струм більший 40 мА. Мотору ж, в залежності від навантаження, необхідно кілька сотень міліампер. Зробити це можна, наприклад, за допомогою транзисторів.
Спочатку розглянемо варіант керування за допомогою польового транзистора подібно до того, як ми це робили на уроці з керування кольором світлодіодної стрічки з Arduino.
Важливі лише 3 умови для вибору транзистора:

• Максимальний струм споживання мотора (струм при блокуванні) не повинен перевищувати максимальний струм стоку польового транзистора.
• Затвор транзистора повинен відкриватися при напрузі 3,3 В.
• Транзистор повинен мати вбудований діод зворотного ланцюга (flyback діод).

Власне, обмотка двигуна є котушкою індуктивності. У момент подачі напруги виникне зворотна електрорушійна сила, яка може вивести з ладу транзистор. Flyback-діод встановлюється в зворотному напрямку і запобігає витоку струму з мотора на транзистор. Тому, якщо в транзисторі немає flyback-діоду, його необхідно встановити додатково: анод до джерело живлення, катод до стоку.
Транзистор у схемі буде працювати в ключовому режимі: за однією командою (встановлення рівня HIGH на заслоні) з виводу 18 Raspberry Pi транзистор буде підключати мотор до джерела живлення (відкриватися), за іншою командою (встановлення рівня LOW на заслоні) - відключати мотор від джерела живлення.
Перш, ніж подати живлення, ще раз уважно перевірте, чи правильно підключили свій транзистор.

Керування швидкістю обертання двигуна

Програма pwm_motor_control.py для RPi, щоб задати швидкість обертання, пропонує користувачу ввести значення шпаруватості для ШІМ-сигналу на виводі 18

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
control_pin = 18                          #1
GPIO.setup(control_pin, GPIO.OUT)
motor_pwm = GPIO.PWM(control_pin, 500)    #2
motor_pwm.start(0)                        #3
try:
    while True:                           #4
        duty = input('Enter Duty Cycle (0 to 100): ')
        if duty < 0 or duty > 100:
            print('0 to 100')
        else:
            motor_pwm.ChangeDutyCycle(duty)
finally:
    print("Cleaning up")
    GPIO.cleanup()

1. Перша частина програми є такою ж, як і код для керування змішуванням кольорів світлодіоду RGB, але вивід 18 призначається вихідним з іменем control_pin.
2. Даний рядок задає, що вивід control_pin буде виходом ШІМ. За допомогою бібліотеки RPi.GPIO можете встановити виходом ШІМ будь-який з виводів GPIO. Параметр 500 задає частоту ШІМ 500 Гц (імпульсів в секунду).
3. Вихідний сигнал ШІМ фактично не запускається, поки не викликана команда start. Її параметром є значення шпаруватості і тому, якщо ми хочемо, щоб двигун спочатку був вимкнений, параметр повинен мати значення 0.
4. Всередині основного циклу значення duty запитується у користувача, використовуючи input, і введений діапазон потім перевіряється. Якщо він від 0 до 100, то значення використовується для установки шпаруватості за допомогою функції ChangeDutyCycle.
Запустіть програму як привілейований користувач, використовуючи sudo, а потім спробуйте ввести різні значення шпаруватості. Швидкість обертання двигуна повинна змінюватися:

pi@raspberrypi$ sudo python pwm_motor_control.py
Enter Duty Cycle (0 to 100): 50
Enter Duty Cycle (0 to 100): 10
Enter Duty Cycle (0 to 100): 100
Enter Duty Cycle (0 to 100): 0
Enter Duty Cycle (0 to 100):

Керування напрямком обертання двигуна

Ми навчилися управляти швидкістю двигуна, але не напрямком його обертання. Розглянемо різні варіанти для управління напрямком обертання двигуна. Для простого керування напрямком і швидкістю двигунів постійного струму існує декілька мікросхем і модулів спеціального призначення.
Уявіть собі двигун з двома проводами А і В:

Коли на А позитивний полюс, а на В - негативний, то двигун обертається в одному напрямку (на рис. – за годинниковою стрілкою). Якщо змінити полярність підключення, то двигун буде обертатися в протилежному напрямку. Це означає, що для керування напрямком обертання двигуна, необхідно якимось чином змінювати полярність підключення живлення до двигуна. Реалізують це за допомогою схеми, яка називається H-мостом. На рис. нижче показано, як працює H-міст:

Якщо всі чотири вимикачі розімкнуті, струм не може протікати через двигун. Якщо ж S1 і S4 замкнуті, а S2 і S3 відкриті (як показано на рис.), то буде протікати струм через двигун. Позитивний вивід джерела живлення під’єднаний до контакту А двигуна, а до контакту B через S4 приєднаний негативної полюс, і двигун буде повертатися за годинниковою стрілкою. Якщо S1 і S4 тепер розімкнути, а замкнути S3 і S2, то позитивний полюс буде цього разу підключений до клеми B двигуна, що змінить напрямок обертання двигуна на протилежний.
У таблиці нижче показано, як буде вести себе двигун; 0 означає, що перемикач розімкнутий, 1 означає, що він замкнутий, а Х означає, що не має значення, в якому він знаходиться.
Таблиця.Таблиця істинності для комбінації перемикачів

Ми розглянули, як Н-міст може бути використаний для перемикання напрямком обертання двигуна, однак є деякі інші комбінації налаштувань перемикачів, про які вам треба знати.
По-перше, якщо всі перемикачі розімкнуті, ніякий струм не протікає через двигун і він швидко зупиняється.
Дуже важливо, що є комбінації перемикачів, які безпосередньо підключають позитивний полюс джерела живлення до негативного. Це називається коротким замиканням і, ймовірно, матиме катастрофічні наслідки через протікання великого струму.
Інша ситуація, коли немає короткого замикання, але контакти двигуна замкнули між собою. Це буде цікавий ефект гальмування двигуна: при цьому він швидше сповільнюється, якщо раніше обертався, а також виникає опір початку обертання, якщо двигун був у нерухомому стані. Таким чином, якщо двигун керує колесами іграшкового всюдиходу, то використання режиму гальмування може зупинити всюдихід від скочування, якщо всюдихід на схилі.

H-міст на мікросхемі

Простою у використанні інтегральною схемою (ІС) H-моста, яка користується популярністю у любителів, є L293D. Це чудова мікросхема для невеликих двигунів з максимальним струмом 600 мА і напругою до 36 В.
L293D містить два H-мости і трохи додаткових схем автоматичного вимкнення ІС, якщо вона починає перегріватися. Хоча цілком можна знищити L293D шляхом експериментів, але якщо ви дійсно спробуєте це зробити, то переконаєтесь, як важко її спалити. Розміщення виводів L293D:

Параметри L293D:

• Діапазон напруги живлення двигуна від 4,5 до 36В
• Постійний струм двигуна до 600mA
• Піковий струм двигуна 1.2A
• Діоди на всіх виходах для захисту від стрибків перепадів напруги двигуна
• Тепловий захист
• Сумісність з 3 В і 5 В логікою (RPi і Arduino)

На рис. нижче показана схема ІС, яку можете використовувати для управління двома двигунами постійного струму.

ІС насправді організована у вигляді чотирьох половин H-мостів, а не двох повних H-мостів. Ви можете розглядати кожну половині H-моста як цифровий вихід високої потужності, здатний забезпечити стік або витік струму до 600 мА. Це забезпечує більшу гнучкість при використанні ІС.
ІС має окремі контакти для живлення логіки і двигуна, що дозволяє, наприклад, управляти 6 В двигунами з використанням 3,3 В логіки RPi.
Функція кожного з виводів ІС L293D наведена в таблиці.
Таблиця. Призначення виводів L293D

Схема підключення L293D Н-моста для проекту:

RPi забезпечує логічне живлення 5 В через контакт 16, а живлення для двигуна подається на контакт 8 з акумуляторної батареї 6 В. Фактично використовується тільки один з Н-мостів в IC і тому вивід EN2 з'єднаний з землею, щоб відключити невикористану половину ІС.
Виводи EN1, IN1 і IN2 будуть підключені до цифрових вихідних контактів на RPi.
Проект буде працювати і без конденсаторів C1 та C2, але вам потрібно звикати до хорошої звички використовувати конденсатори, якщо це стає більшим, ніж просто експеримент, і хочете розгорнути проект по-справжньому.
Вказане розташування конденсаторів дуже типове для IC схеми H-моста. C1 називається роздільним конденсатором. Він повинен розташовуватися якомога ближче до ІС і бути між джерелом живлення логіки і GND. Досить 100 нФ (конденсатор невеликої ємності), який усуває будь-які електричні завади, які можуть створювати перешкоди в роботі логіки ІС. C2 забезпечує короткочасний запас енергії, але для двигунів, а не для логіки перемикання. Значення цього конденсатора, як правило, значно більше, ніж С1, зазвичай 100 мкФ або більше.
На монтажній платі зверніть особливу увагу на IC. Переконайтеся, що розташувати мікросхему правильно. Можете також підключити батарею. Спочатку мотор не повинен обертатися.
Перевагою використання такої IC Н-моста, як L293D, є те, що виводи керування вимагають дуже мало струму для керування двигуном. Насправді, технічний опис вказує, що це завжди буде менше, ніж 100 мкА (0.1mA), що означає, що не буде ніяких проблем з використанням слабкострумових виходів RPi.
Підключення макетної плати до RPi:

Доповніть та збережіть у файлі full_motor_control.py код для RPi на Python, щоб можна було змінювати напрям обертання двигуна, швидкість обертання та мати змогу його зупинити::

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
enable_pin = 18                #1
in_1_pin = 23
in_2_pin = 24
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(in_1_pin, GPIO.OUT)
GPIO.setup(in_2_pin, GPIO.OUT)
motor_pwm = GPIO.PWM(enable_pin, 500)
motor_pwm.start(0)
def forward(duty):             #2
    GPIO.output(in_1_pin, True)
    GPIO.output(in_2_pin, False)
    motor_pwm.ChangeDutyCycle(duty)
def reverse(duty):             #3
    GPIO.output(in_1_pin, False)
    GPIO.output(in_2_pin, True)
    motor_pwm.ChangeDutyCycle(duty)

def stop(): 
    GPIO.output(in_1_pin, False)
    GPIO.output(in_2_pin, False)
    motor_pwm.ChangeDutyCycle(0)

try:
    while True:                #4
        direction = input('Enter direction letter (f - forward, r - reverse, s - stop): ')
        if direction[0] == 's':
            stop()
        else:
           duty = int(input('Enter Duty Cycle (0 to 100): '))
        if direction[0] == 'f':
            forward(duty)
        elif direction[0] == 'r':
            reverse(duty)

finally:
    print("Cleaning up")
    GPIO.cleanup()

Цей код багато запозичує з попереднього коду Python.
1. У верхній частині файлу звичайний код налаштування GPIO і призначення виводів. Вивід Enable L293D використовується для управління швидкістю обертання двигуна, тому вивід 18 підключений до нього і налаштований як вихід ШІМ.
2. Функція forward встановлює контакти IN1 і IN2 для керування напрямком обертання, а потім встановлює шпаруватість каналу ШІМ.
3. Якщо порівняти функцію reverse з forward, то можете побачити, що значення контактів IN1 і IN2 поміняні місцями. Функція stop задає на виводах напрямку значення для зупинки (обидва LOW) і робочий цикл 0.
4. Команда запитує у користувача значення шпаруватості, а потім викликає stop, forward, або reverse, в залежності від введеного.
Запустіть програму full_motor_control.py, і переконайтеся, що можете змінювати напрямок обертання і швидкість.

$ sudo python3 full_motor_control.py
Enter direction letter (f - forward, r - reverse, s - stop): f
Enter Duty Cycle (0 to 100): 50
Enter direction letter (f - forward, r - reverse, s - stop): f
Enter Duty Cycle (0 to 100): 100
Enter direction letter (f - forward, r - reverse, s - stop): s
Enter direction letter (f - forward, r - reverse, s - stop): r
Enter Duty Cycle (0 to 100): 50
Enter direction letter (f - forward, r - reverse, s - stop): r
Enter Duty Cycle (0 to 100): 100
Enter direction letter (f - forward, r - reverse, s - stop): s
Enter direction letter (f - forward, r - reverse, s - stop):

Завдання. Додайте в код проекту керування швидкістю і напрямком обертання двигуна графічний інтерфейс користувача.

Приклад виконання завдання:

from tkinter import *
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
enable_pin = 18                
in_1_pin = 23
in_2_pin =.24
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(in_1_pin, GPIO.OUT)
GPIO.setup(in_2_pin, GPIO.OUT)
motor_pwm = GPIO.PWM(enable_pin, 500)
motor_pwm.start(0)

class App:
    
    def __init__(self, master):     
         frame = Frame(master, bg = 'purple')      
         frame.pack()
         Label(frame, text='velocity', bg = 'purple', fg = 'white').grid(row=0, column=0)     
         scaleVel = Scale(frame, from_=0, to=100, length=250, orient=HORIZONTAL, command=self.motorduty, bg = 'purple', fg = 'white')
         scaleVel.grid(row=0, column=1)
         Button(root, text = 'reverse', command=self.reverse, bg = 'purple', fg = 'white').place(x = 10, y = 60, width = 130, height = 80)
         Button(root, text = 'forward', command=self.forward, bg = 'purple', fg = 'white').place(x = 160, y = 60, width = 130, height = 80)
         Button(root, text = 'stop', command=self.stop, bg = 'purple', fg = 'white').place(x = 20, y = 155, width = 260, height = 90)

    def motorduty(self,duty):
          motor_pwm.ChangeDutyCycle(float(duty))
          print(duty)
            
    def forward(self):             
          GPIO.output(in_1_pin, True)
          GPIO.output(in_2_pin, False)
            
    def reverse(self):   
          GPIO.output(in_1_pin, False)
          GPIO.output(in_2_pin, True)

  def stop(self):  
          GPIO.output(in_1_pin, False)
          GPIO.output(in_2_pin, False)
          motor_pwm.ChangeDutyCycle(0)
    
root = Tk()
root.wm_title('Motor Control')
app = App(root)
root.geometry("300x250+400+250")
frame = Frame(root)
frame.pack()

try:
        root.mainloop()   

finally:
        print("Cleaning up")
        GPIO.cleanup()

Детальніше класи розглянемо в наступному уроці.

Попереднє заняття - Наступне заняття

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс