Raspberry Pi Pico jako sterownik silnika prądu stałego
Raspberry Pi to już ikona w świecie miniaturowych komputerów. Każdy nowy wypust od Raspberry Pi Foundation niesie za sobą nowinki konstrukcyjne. Na początku roku 2021, producent wprowadził na rynek najmniejszą wersję “malinki” pod nazwą Raspberry Pi Pico. Jest to znakomite rozwiązanie dla twórców aplikacji embedded, którzy potrzebują bardziej wydajnego sterownika niż Arduino UNO, ale jednocześnie nie wymagają mocy obliczeniowej na poziomie Raspberry Pi Zero.
Raspberry Pi Pico w sterowaniu napędami elektrycznymi
W niniejszym artykule przedstawiono jak połączyć Raspberry Pi z podzespołami zewnętrznymi w prostej aplikacji sterującej miniaturowym silnikiem prądu stałego. Artykuł obejmuje także kod programu w środowisku CircuitPython, które jest kompatybilne z Raspberry Pi Pico.
Wykaz niezbędnych podzespołów
Aby zrealizować projekt sterownika silników prądu stałego z wykorzystaniem płytki Raspberry Pi Pico, niezbędne będą następujące podzespoły:
- Raspberry Pi Pico RP2040
- Płytka stykowa 830-polowa
- Przewody do płytki stykowej
- Dwukanałowy sterownik silników DC L298N 12V/2A
- Mini silnik MT78 3-6V z wałem o średnicy 2,0 mm
- Koło z oponą 14,0 mm x 14,5 mm dla wału o średnicy 2,0 mm
- Koszyk na 6 baterii typu AA (LR6)
- 6 baterii AA (LR6) 1,5V
- Przewód USB-A na micro USB-B do połączenia płytki Raspberry Pi Pico z komputerem PC
Raspberry Pi Pico jako sterownik silnika DC – sposób podłączenia układu
Zanim uruchomimy nasz układ, należy go prawidłowo połączyć. W tym celu lutujemy przewody do wyprowadzeń silnika. Na płytce sterownika z układem L298N, do zacisków ARK “OUT3” i “OUT4” podłączamy przewody silnika. Kolejność łączenia przewodów jest dowolna, ponieważ kierunek obrotów będziemy mogli w naszym projekcie przełączać bez konieczności zamiany przewodów pomiędzy zaciskami.
Na potrójnym złączu ARK, do wyprowadzenia “12V” podłączamy czerwony przewód koszyka z bateriami, a do zacisku “GND” podłączamy czarny przewód koszyka, a także pin nr 38 płytki Raspberry Pi Pico (“GND”). Natomiast sygnały sterujące podłączamy z pinów GPIO nr 19 (“GP14”) i nr 20 (“GP15”) podłączamy odpowiednio do pinów “IN2” i “IN1” sterownika L298N. Zworka założona na piny “ENB” i “5V” będzie powodowała, że wał silnika będzie obracał się z maksymalną możliwą prędkością. Teraz wystarczy nałożyć koło z oponą na wał silnika…i gotowe!
Sterownik silnika prądu stałego na Raspberry Pi Pico – kod programu
Jeśli już połączyliśmy nasz układ, wystarczy teraz uruchomić środowisko CircuitPython i napisać krótki kod, a następnie załadować go do pamięci mikrokontrolera na płytce Raspberry Pi Pico RP2040. W pierwszej części kodu importujemy bibliotekę odpowiedzialną za sterowanie portami wejścia/wyjścia oraz bibliotekę odpowiedzialną za wprowadzanie opóźnień czasowych w kodzie programu. Następnie przypisujemy nazwy portom na płytce Raspberry Pi, z których będziemy korzystać oraz ustawiamy te wyprowadzenia jako wyjścia.
Z tych wyprowadzeń podawane będą stany logiczne na wejścia sterownika L298N. Po zainicjowaniu tych warunków przechodzimy do pętli while, która zawiera wszystkie możliwe kombinacje stanów logicznych na użytych wyprowadzeniach GPIO. Efektem następujących kolejno po sobie kombinacji, będzie obrót wału silnika. Podanie przeciwnych sobie stanów logicznych spowoduje obrót silnika zgodnie lub przeciwnie do ruchu wskazówek zegara. Będzie to zależało także od tego, które przewody silnika podłączyliśmy do wyprowadzeń “OUT3” i “OUT4” na płytce sterownika.
Natomiast podając na oba wyprowadzenia stan niski lub stan wysoki, silnik bardzo szybko zahamuje. Aby wprowadzić silnik w tryb łagodnego hamowania, należy zdjąć zworkę z wyprowadzenia “ENB” i podać na oba piny stan wysoki. Każda z kombinacji stanów logicznych w poniższym kodzie, jest wykonywana z 1-sekundowym opóźnieniem.
Kod programu:
from machine import Pin
import utime
in1 = Pin(15, Pin.OUT)
in2 = Pin(14, Pin.OUT)
while True:
in1.value(0)
in2.value(0)
utime.sleep(1)
in1.value(0)
in2.value(1)
utime.sleep(1)
in1.value(1)
in2.value(0)
utime.sleep(1)
in1.value(1)
in2.value(1)
utime.sleep(1)