Serwisy partnerskie:
Close icon
Serwisy partnerskie

Jak sterować silnikiem prądu stałego za pomocą Raspberry Pi 3

Article Image
Elmax
Kompletny poradnik, pokazujący krok po kroku jak kontrolować prędkość i kierunek obrotów silnika prądu stałego za pomocą Raspberry Pi 3.

W dzisiejszym poradniku pokażę jak sterować silnikiem prądu stałego za pomocą Raspberry Pi 3. Będziemy kontrolować zarówno prędkość jak i kierunek obrotów silnika prądu stałego. Mam nadzieję, że mamy już za sobą poprzedni poradnik dotyczące tego jak stworzyć GUI w Raspberry Pi 3, ponieważ w tym poradniku również stworzymy małe GUI, a następnie będziemy sterować naszym silnikiem prądu stałego za pomocą przycisków w GUI.

W celu kontrolowania silnika prądu stałego, musimy użyć jakiegoś sterownika pomiędzy naszym mikrokontrolerem, a silnikiem. Funkcjonalność tego sterownika polega na sterowaniu silnikiem prądu stałego 12 V sygnałem 5 V z mikrokontrolera.

W dzisiejszym poradniku użyjemy sterownika silnika L298. Tak więc, zacznijmy z tematem jak kontrolować silnik prądu stałego z Raspberry Pi 3.

Jak sterować silnikiem prądu stałego za pomocą Raspberry Pi 3

Podzieliłem ten poradnik na cztery części, którymi są:

  1. Projektowanie zasilacza 5 V,
  2. Projektowanie obwodu sterownika silnika L298,
  3. Sterowanie kierunkiem silnika prądu stałego za pomocą Raspberry Pi 3,
  4. Sterowanie prędkością silnika prądu stałego za pomocą Raspberry Pi 3.

Zatem, najpierw zaprojektujmy nasz zasilacz 5 V:

Projektowanie zasilacza 5 V

Po pierwsze, musimy zaprojektować zasilacz używając Regulatora Napięcia 7805, który obniży nasze napięcie z 12 V do 5 V.

Potrzebujemy 12 V dla naszego silnika prądu stałego, a 5 V jest wymagane dla sterownika silnika L298.

Używam zasilacza 12 V, więc muszę obniżyć to napięcie do 5 V.

Możemy użyć 5 V z Raspberry Pi, jeśli nie chcemy projektować tego zasilacza, chociaż jest to dość proste.

Na przykład, jeśli projektujemy jakiegoś robota, to nie możemy umieścić na nim swojego laptopa. W takich przypadkach musimy zaprojektować zasilacz 5 V dla naszego Pi.

Oto lista komponentów, które zostaną użyte do budowy tego zasilacza:

  • 7805,
  • kondensator 100 μF,
  • kondensator 1000 μF,
  • Rezystor 1 kΩ,
  • Dwupinowe gniazdo,
  • Męskie piny gniazda programującego (header).

Oto schemat naszego zasilacza w Proteusie. Jeśli chcemy poznać więcej szczegółów na jego temat, powinniśmy zajrzeć na stronę jak zaprojektować zasilacz 5 V w Proteusie?.

Na powyższym rysunku możemy zobaczyć, że użyliśmy baterii 12 V, a następnie użyliśmy 7805 aby uzyskać 5 V na wyjściu.

Oto prawdziwy układ, który zaprojektowałem na płytce vero:

Tak więc, teraz mamy wszystkie trzy poziomy napięcia, czyli:

  • 12 V: Biały przewód.
  • 5 V: Szary przewód.
  • GND (0 V): Przewód czerwony.

Następną rzeczą, którą musimy zrobić, jest zaprojektowanie układu sterownika silnika przy użyciu sterownika silnika L298.

Obwód sterownika silnika L298

L298 jest doskonałym sterownikiem silnika. Za pomocą jednego takiego sterownika można kontrolować dwa silniki prądu stałego.

Użyłem L298 Motor Driver Shield (nakładka). Można przeczytać więcej o tej nakładce na stronie Biblioteka sterownika silnika L298 dla Proteusa.

Oto obwód, który zaprojektowałem do sterowania moim silnikiem prądu stałego za pomocą Raspberry Pi 3:

Można dość łatwo zaprojektować ten obwód, ponieważ wystarczy połączyć zwykłe przewody.

Oto mój rzeczywisty setup z L298 Motor Driver i Raspberry Pi 3:

Zatem, teraz skończyliśmy połączenia i możemy zobaczyć na powyższych zdjęciach, że używamy tych trzech pinów Raspberry Pi 3:

  • Pin 12: Podłączony do Enable A.
  • Pin 16: Podłączony do Wejścia 1.
  • Pin 18: Podłączony do Wejścia 2.
  • Czwarty przewód to GND. Musimy połączyć GND Raspberry Pi 3 z GND naszego zasilacza.
  • +12 V i 5 V są dostarczane do sterownika silnika L298 z naszego zasilacza vero board.

Teraz zaprojektujmy nasz kod w Pythonie. Najpierw będziemy kontrolować kierunek obrotów silnika prądu stałego, a następnie będziemy kontrolować ich prędkość.

Sterowanie kierunkiem obrotów silnika prądu stałego za pomocą Raspberry Pi 3

Po pierwsze, umieszczę trzy przyciski na moim GUI, a następnie będę kontrolował kierunek obrotów mojego silnika prądu stałego za pomocą tych przycisków.

Wyjaśniałem już ten kod w kawałkach w moim poprzednim poradniku migania LEDem z Raspberry Pi 3, więc nie będę wyjaśniać go ponownie. Zajmę się jedynie wyjaśnieniem nowego kodu.

Tak więc, oto nasza pierwsza część kodu, w której dokonałem podstawowej konfiguracji naszych pinów oraz GUI:

# ************************************************************************** #
# **** **** #
# *********** Code Designed by www.TheEngineeringProjects.com ************** #
# **** **** #
# ************** How to Control DC Motor in Raspberry Pi 3 ***************** #
# **** **** #
# ************************************************************************** #

# Importowanie bibliotek

import RPi.GPIO as GPIO
import time
from tkinter import *
import tkinter.font

# Biblioteki Zaimportowane pomyślnie

# Ustawienia pinów Raspberry Pi 3

PWMPin = 12 # Pin PWM podłączony do ENA.
Motor1 = 16 # Podłączony do Wejścia 1.
Motor2 = 18 # Podłączony do Wejścia 2.
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) # Uzyskujemy dostęp do GPIO zgodnie z ich fizyczną lokalizacją
GPIO.setup(PWMPin, GPIO.OUT) # Ustawiliśmy tryb pracy naszego pinu na wyjście
GPIO.setup(Motor1, GPIO.OUT)
GPIO.setup(Motor2, GPIO.OUT)

GPIO.output(PWMPin, GPIO.LOW) # Kiedy się uruchomi, wszystkie piny będą LOW.
GPIO.output(Motor1, GPIO.LOW)
GPIO.output(Motor2, GPIO.LOW)

PwmValue = GPIO.PWM(PWMPin, 2000) # Ustawiliśmy naszą częstotliwość PWM na 2000.
PwmValue.start(100) # To jest maksymalna wartość – 100 %.

# Ustawienia pinów Raspberry Pi 3 zakończone

# Podstawowe ustawienia tkinter GUI

Gui = Tk()
Gui.title("DC Motor Control with Pi 3")
Gui.config(background= "#0080FF")
Gui.minsize(800,300)
Font1 = tkinter.font.Font(family = 'Helvetica', size = 18, weight = 'bold')

# Proste GUI tkinter stworzone

Powyższy kod jest dość łatwy do zrozumienia. Widziałeś, że ustawiłem wartość PWM na maksimum, ponieważ nie chcę zmieniać prędkości, chcę tylko kontrolować kierunki obrotu.

Teraz dodajmy przyciski i etykiety do naszego GUI, oto kod:

Text1 = Label(Gui,text='Motor Status:', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 50, pady = 50)
Text1.grid(row=0,column=0)

Text2 = Label(Gui,text='Stop', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 0)
Text2.grid(row=0,column=1)

Text1 = Label(Gui,text=' ', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 150, pady = 50)
Text1.grid(row=0,column=2)

Button1 = Button(Gui, text='Clockwise', font = Font1, command = MotorClockwise, bg='bisque2', height = 1, width = 10)
Button1.grid(row=1,column=0)

Button2 = Button(Gui, text=' Motor Stop', font = Font1, command = MotorStop, bg='bisque2', height = 1, width = 10)
Button2.grid(row=1,column=1)

Button2 = Button(Gui, text='AntiClockwise', font = Font1, command = MotorAntiClockwise, bg='bisque2', padx = 50, height = 1, width = 10)
Button2.grid(row=1,column=2)

Text3 = Label(Gui,text='www.TheEngineeringProjects.com', font = Font1, bg = '#0080FF', fg='#FFFFFF', padx = 50, pady = 50)
Text3.grid(row=2,columnspan=2)

Gui.mainloop()

Użyłem trzech tekstów w pierwszym rzędzie, trzeci tekst jest używany tylko do wypełnienia. W ten sposób jest łatwiej.  

W drugim wierszu umieściłem trzy przyciski, a w ostatnim wierszu link do naszej strony.

Oto zrzut ekranu tego GUI:

Teraz, na koniec, musimy dodać funkcje dla tych przycisków.

Oto kod dla tych funkcji. Musimy umieścić go powyżej naszego kodu GUI.

def MotorClockwise():
    GPIO.output(Motor1, GPIO.LOW) # Silnik będzie się poruszał w kierunku zgodnym z ruchem wskazówek zegara.
    GPIO.output(Motor2, GPIO.HIGH)
    
def MotorAntiClockwise():
    GPIO.output(Motor1, GPIO.HIGH) # Silnik będzie się poruszał w kierunku przeciwnym do ruchu wskazówek zegara.
    GPIO.output(Motor2, GPIO.LOW)

def MotorStop():
    GPIO.output(Motor1, GPIO.LOW) # Silnik się zatrzyma.
    GPIO.output(Motor2, GPIO.LOW)

Mamy tutaj trzy funkcje i zwyczajnie, poprzez przełączanie pinów naszego silnika prądu stałego, zmieniłem jego kierunek.

Aby zatrzymać silnik prądu stałego, po prostu ustawiłem oba piny w stan LOW.

Teraz uruchomimy swój kod i jeśli wszystko pójdzie dobrze, to silnik będzie wykonywał nasze polecenia.

Oto zdjęcie mojego systemu kiedy jest uruchomiony:

Oto nasz kompletny kod dla sterowania kierunkiem silnika prądu stałego z Raspberry Pi 3, w jednym kawałku.  

# ************************************************************************** #
# **** **** #
# *********** Code Designed by www.TheEngineeringProjects.com ************** #
# **** **** #
# ************** How to Control DC Motor in Raspberry Pi 3 ***************** #
# **** **** #
# ************************************************************************** #

# Importowanie bibliotek

import RPi.GPIO as GPIO
import time
from tkinter import *
import tkinter.font

# Biblioteki Zaimportowane pomyślnie

# Ustawienia pinów Raspberry Pi 3

PWMPin = 12 # Pin PWM podłączony do ENA.
Motor1 = 16 # Podłączony do Wejścia 1.
Motor2 = 18 # Podłączony do Wejścia 2.
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) # Uzyskujemy dostęp do GPIO zgodnie z ich fizyczną lokalizacją
GPIO.setup(PWMPin, GPIO.OUT) # Ustawiliśmy tryb pracy naszego pinu na wyjście
GPIO.setup(Motor1, GPIO.OUT)
GPIO.setup(Motor2, GPIO.OUT)

GPIO.output(PWMPin, GPIO.LOW) # Kiedy się uruchomi, wszystkie piny będą LOW.
GPIO.output(Motor1, GPIO.LOW)
GPIO.output(Motor2, GPIO.LOW)

PwmValue = GPIO.PWM(PWMPin, 2000) # Ustawiliśmy naszą częstotliwość PWM na 2000.
PwmValue.start(100) # To jest maksymalna wartość – 100 %.

# Ustawienia pinów Raspberry Pi 3 zakończone

# Podstawowe ustawienia tkinter GUI

Gui = Tk()
Gui.title("DC Motor Control with Pi 3")
Gui.config(background= "#0080FF")
Gui.minsize(800,300)
Font1 = tkinter.font.Font(family = 'Helvetica', size = 18, weight = 'bold')

# tkinter simple GUI created

def MotorClockwise():
    GPIO.output(Motor1, GPIO.LOW) # Motor will move in clockwise direction.
    GPIO.output(Motor2, GPIO.HIGH)
    
def MotorAntiClockwise():
    GPIO.output(Motor1, GPIO.HIGH) # Silnik będzie się poruszał w kierunku przeciwnym do ruchu wskazówek zegara.
    GPIO.output(Motor2, GPIO.LOW)

def MotorStop():
    GPIO.output(Motor1, GPIO.LOW) # Silnik się zatrzyma.
    GPIO.output(Motor2, GPIO.LOW)

Text1 = Label(Gui,text='Motor Status:', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 50, pady = 50)
Text1.grid(row=0,column=0)

Text2 = Label(Gui,text='Stop', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 0)
Text2.grid(row=0,column=1)

Text1 = Label(Gui,text=' ', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 150, pady = 50)
Text1.grid(row=0,column=2)

Button1 = Button(Gui, text='Clockwise', font = Font1, command = MotorClockwise, bg='bisque2', height = 1, width = 10)
Button1.grid(row=1,column=0)

Button2 = Button(Gui, text=' Motor Stop', font = Font1, command = MotorStop, bg='bisque2', height = 1, width = 10)
Button2.grid(row=1,column=1)

Button2 = Button(Gui, text='AntiClockwise', font = Font1, command = MotorAntiClockwise, bg='bisque2', padx = 50, height = 1, width = 10)
Button2.grid(row=1,column=2)

Text3 = Label(Gui,text='www.TheEngineeringProjects.com', font = Font1, bg = '#0080FF', fg='#FFFFFF', padx = 50, pady = 50)
Text3.grid(row=2,columnspan=3)

Gui.mainloop()


Teraz spójrzmy na to, jak kontrolować prędkość naszego silnika prądu stałego z Raspberry Pi 3.

Sterowanie prędkością silnika prądu stałego za pomocą Raspberry Pi 3

Dodam suwak w naszym GUI i za pomocą tego suwaka będziemy zmieniać wartość PWM, co z kolei zmieni prędkość naszego silnika prądu stałego.

Oto kod do suwaka, który należy umieścić pod naszym ostatnim tekstem.

Scale1 = Scale(Gui, from_=0, to=100, orient = HORIZONTAL, resolution = 1, command = ChangePWM)
Scale1.grid(row=2,column=2)

Teraz uruchomimy GUI i otrzymasz coś podobnego, do tego, co pokazano na poniższym zrzucie ekranu:

Poniżej znajduje się kod funkcji, która będzie wykonywana w momencie zmiany wartości suwaka.

def ChangePWM(self):
    PwmValue.ChangeDutyCycle(Scale1.get())

Teraz, gdy uruchomimy symulację i zmienimy wartość tego suwaka, poczujemy wyraźną zmianę prędkości silnika prądu stałego.

Stworzę również filmik, który pozwoli lepiej zrozumieć ten projekt.

Oto nasz ostateczny, połączony kod, który będzie kontrolował zarówno prędkość jak i kierunek obrotu naszego silnika prądu stałego.

# ************************************************************************** #
# **** **** #
# *********** Code Designed by www.TheEngineeringProjects.com ************** #
# **** **** #
# ************** How to Control DC Motor in Raspberry Pi 3 ***************** #
# **** **** #
# ************************************************************************** #

# Importowanie bibliotek

import RPi.GPIO as GPIO
import time
from tkinter import *
import tkinter.font

# Biblioteki Zaimportowane pomyślnie

# Ustawienia pinów Raspberry Pi 3

PWMPin = 12 # Pin PWM podłączony do ENA.
Motor1 = 16 # Podłączony do Wejścia 1.
Motor2 = 18 # Podłączony do Wejścia 2.
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) # Uzyskujemy dostęp do GPIO zgodnie z ich fizyczną lokalizacją
GPIO.setup(PWMPin, GPIO.OUT) # Ustawiliśmy tryb pracy naszego pinu na wyjście
GPIO.setup(Motor1, GPIO.OUT)
GPIO.setup(Motor2, GPIO.OUT)

GPIO.output(PWMPin, GPIO.LOW) # Kiedy się uruchomi, wszystkie piny będą LOW.
GPIO.output(Motor1, GPIO.LOW)
GPIO.output(Motor2, GPIO.LOW)

PwmValue = GPIO.PWM(PWMPin, 2000) # Ustawiliśmy naszą częstotliwość PWM na 2000.
PwmValue.start(100) # To jest maksymalna wartość – 100 %.

# Ustawienia pinów Raspberry Pi 3 zakończone

# Podstawowe ustawienia tkinter GUI

Gui = Tk()
Gui.title("DC Motor Control with Pi 3")
Gui.config(background= "#0080FF")
Gui.minsize(800,300)
Font1 = tkinter.font.Font(family = 'Helvetica', size = 18, weight = 'bold')

# Proste GUI tkinter stworzone

def MotorClockwise():
    GPIO.output(Motor1, GPIO.LOW) # Silnik będzie się poruszał w kierunku zgodnym z ruchem wskazówek zegara.
    GPIO.output(Motor2, GPIO.HIGH)
    
def MotorAntiClockwise():
    GPIO.output(Motor1, GPIO.HIGH) # Silnik będzie się poruszał w kierunku przeciwnym do ruchu wskazówek zegara.
    GPIO.output(Motor2, GPIO.LOW)

def MotorStop():
    GPIO.output(Motor1, GPIO.LOW) # Silnik się zatrzyma.
    GPIO.output(Motor2, GPIO.LOW)
    
def ChangePWM(self):
    PwmValue.ChangeDutyCycle(Scale1.get())

Text1 = Label(Gui,text='Motor Status:', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 50, pady = 50)
Text1.grid(row=0,column=0)

Text2 = Label(Gui,text='Stop', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 0)
Text2.grid(row=0,column=1)

Text1 = Label(Gui,text=' ', font = Font1, fg='#FFFFFF', bg = '#0080FF', padx = 150, pady = 50)
Text1.grid(row=0,column=2)

Button1 = Button(Gui, text='Clockwise', font = Font1, command = MotorClockwise, bg='bisque2', height = 1, width = 10)
Button1.grid(row=1,column=0)

Button2 = Button(Gui, text=' Motor Stop', font = Font1, command = MotorStop, bg='bisque2', height = 1, width = 10)
Button2.grid(row=1,column=1)

Button2 = Button(Gui, text='AntiClockwise', font = Font1, command = MotorAntiClockwise, bg='bisque2', padx = 50, height = 1, width = 10)
Button2.grid(row=1,column=2)

Text3 = Label(Gui,text='www.TheEngineeringProjects.com', font = Font1, bg = '#0080FF', fg='#FFFFFF', padx = 50, pady = 50)
Text3.grid(row=2,columnspan=2)

Scale1 = Scale(Gui, from_=0, to=100, orient = HORIZONTAL, resolution = 1, command = ChangePWM)
Scale1.grid(row=2,column=2)

Gui.mainloop()

To wszystko na dzisiaj. Mam nadzieję, że dzisiejszy poradnik przypadł wam do gustu. W razie pytań, wystarczy dać mi znać.

Wykaz elementów
Ilość
Symbol
Nazwa/opis/gdzie kupić
Do pobrania
Download icon Plik z kodem Pythona

Artykuł How to Control DC Motor with Raspberry Pi 3 opracowano w wersji polskiej na podstawie współpracy z portalem www.theengineeringprojects.com.

Firma:
Tematyka materiału: Raspberry PI 3, L298, Sterowanie silnikiem
AUTOR
Źródło
www.theengineeringprojects.com
Udostępnij
Zobacz wszystkie quizy
Quiz weekendowy
Edukacja
1/10 Jak działa rezystor LDR?
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"