LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[PROJEKT] Sterowanie silnikami za pomocą Raspberry Pi i sterownika DRV8835

W projekcie wykorzystano moduł sterownika silników z układem DRV8835 dołączony do komputera Raspberry Pi. Taka konfiguracja pozwala sterować prędkością oraz kierunkiem obrotów silników prądu stałego.

Do realizacji projektu będziemy potrzebować:

Układ DRV8835 pozwala na sterowanie dwoma silnikami prądu stałego. Silniki mogą być zasilane napięciem od 1,5 V do 11 V. Maksymalnie jeden silnik może pobierać 1,2 A (chwilowo 1,5 A). Możliwe jest połączenie szeregowe kanałów, co pozwoli na zwiększenie wydajności prądowej, a w rezultacie na podłączenie silnika, który będzie mógł pobierać do 2,4 A (chwilowo 3 A). Używanie modułu jest bardzo łatwe – wystarczy moduł dołączyć do 40-pinowego złącza znajdującego się na Raspberry PI (pamiętając o odpowiedniej orientacji), co pokazano na rysunku 1.

Rysunek 1. Moduł ze sterownikiem DRV8835 wpięty w Raspberry Pi 3

UWAGA!
Podłączenie wyższego napięcia zasilania niż maksymalne zalecanie (powyżej 11 V), spowoduje uszkodzenie układu DRV8835.

Moduł posiada 3 złącza śrubowe. Jedno do podłączenia zasilania silników (baterie lub zasilacz), a dwa kolejne do podłączenia silników (złącza o lewej na rysunku 1). W moim przypadku podłączone silniki oraz zasilanie (z pakietu Li-pol 7,4 V) wygląda następująco (rysunek 2).

Rysunek 2. Układ wykorzystywany w projekcie 

W projekcie użyłem Rasbperry Pi 3 z wgranym systemem Raspbian Jessie with Pixel (wersja z dnia 2.03.2017). Najnowsze wersje systemu można znaleźć na stronie Raspberry Pi.

Po włączeniu naszego Rasbperry PI oraz zalogowaniu warto zaktualizować system oraz inne komponenty systemu do najnowszej wersji, można to wykonać poleceniami:

sudo apt-get update
sudo apt-get dist-upgrade

Podczas wykonywania drugiego polecenia zostaniemy zapytani, czy zgadzamy się na aktualizacje, naciskamy klawisz i zatwierdzamy klawiszem enter.

Rysunek 3. Potwierdzenia aktualizacji systemu

Po procesie aktualizacji możemy przystąpić do instalacji narzędzi oraz biblioteki do obsługi sterownika silników. Ponieważ biblioteka WiringPi niezbędna do prawidłowego działania sterownika silników wykorzystuje do swojego działania Python, musimy zainstalować interpreter języka Python. Zrobimy to za pomocą polecenia:

sudo apt-get install python-dev python-pip

Następnie instalujemy bibliotekę WiringPi-Python poleceniem:

sudo pip install wiringpi

Po poprawnej instalacji, przystępujemy do pobrania biblioteki do obsługi naszego sterownika DRV8835. Musimy wpisać w terminalu następujące polecenie:

git clone https://github.com/pololu/drv8835-motor-driver-rpi.git

Gdy biblioteka zostanie pobrana, przechodzimy do utworzonego folderu drv8835-motor-driver-rpi poleceniem:

cd drv8835-motor-driver-rpi

Oraz instalujemy bibliotekę poleceniem:

sudo python setup.py install

Od teraz możemy korzystać z naszego sterownika silników. Następnie uruchomimy przykład:

from __future__ import print_function
import time
from pololu_drv8835_rpi import motors, MAX_SPEED

# Set up sequences of motor speeds.
test_forward_speeds = list(range(0, MAX_SPEED, 1)) + \
  [MAX_SPEED] * 200 + list(range(MAX_SPEED, 0, -1)) + [0]  

test_reverse_speeds = list(range(0, -MAX_SPEED, -1)) + \
  [-MAX_SPEED] * 200 + list(range(-MAX_SPEED, 0, 1)) + [0]  

try:
    motors.setSpeeds(0, 0)

    print("Motor 1 forward")
    for s in test_forward_speeds:
        motors.motor1.setSpeed(s)
        time.sleep(0.005)

    print("Motor 1 reverse")
    for s in test_reverse_speeds:
        motors.motor1.setSpeed(s)
        time.sleep(0.005)

    print("Motor 2 forward")
    for s in test_forward_speeds:
        motors.motor2.setSpeed(s)
        time.sleep(0.005)

    print("Motor 2 reverse")
    for s in test_reverse_speeds:
        motors.motor2.setSpeed(s)
        time.sleep(0.005)

finally:
  # Stop the motors, even if there is an exception
  # or the user presses Ctrl+C to kill the process.
  motors.setSpeeds(0, 0)

W pierwszych linijkach została załączona biblioteka pololu_drv8835_rpi do programu za pomocą polecenia:

from pololu_drv8835_rpi import motors, MAX_SPEED

Następnie zostały stworzone dwie tablice test_forward_speeds (wartości 0…480…0) oraz test_reverse_speeds (wartości 0…-480…0). Wartość -480 odpowiada za obroty z maksymalną prędkością do tyłu, natomiast wartość 480 za obroty z maksymalną prędkością do przodu. Jak widać, aby sterować kierunkiem obrotów silniku, należy uwzględnić przed wartością znak. Te wartości są umieszczane w funkcji motors.motor1.setSpeed(x) (sterowanie pierwszym silnikiem) oraz motors.motor2.setSpeed(x) (sterowanie drugim silnikiem). Aby poruszać dwoma silnikami jednocześnie, należy wykorzystać funkcje motors.setSpeeds(x, y) i w nawiasie podać prędkość odpowiednio dla pierwszego i drugiego silnika. I tak np. aby poruszyć silnikiem pierwszym na połową prędkości, należałoby w programie umieścić następujący kod.

motors.motor1.setSpeed(240)

Wróćmy do kodu przykładowego programu. Po stworzeniu tablic test_forward_speeds oraz test_reverse_speeds, zaczyna się główna cześć naszego programu. Rozpoczyna się ona od linii, która zawiera polecenie try:. Na początku naszego programu prędkość obu silników ustawiana jest na 0, poleceniem:

motors.setSpeeds(0, 0)

Następnie wyświetlany jest komunikat „Motor 1 forward” informujący użytkownika, że silnik 1 obraca się do przodu:

print("Motor 1 forward")

Następnie w kodzie znajduje się pętla for wykorzystująca wcześniej zadeklarować tablice test_forward_speeds. Dzięki niej silnik jest powoli rozpędzany od wartości zerowej do maksymalnej prędkości (wartość 480). Po osiągnięciu wartości 480, silnik zaczyna zwalniać, aż do zatrzymania, czyli wartości 0 (zgodnie z wartościami jakie zawiera tablica test_forward_speeds)

Następnie zostaje wykonana pętla for, jednak teraz zmieniony jest kierunek obrotu silnika 1. Silnik rozpędza się do wartości -480, czyli do tyłu z maksymalną prędkością. Gdy ją osiągnie, zaczyna zwalniać do 0 (zgodnie z wartościami jakie zawiera tablica test_reverse_speeds).

Po wykonaniu tego fragmentu kodu, identyczna sekwencja zostaje wykonana dla silnika 2.

Aby uruchomić program, należy w konsoli wpisać następującą komendę (musimy być w folderze drv8835-motor-driver-rpi ) :

sudo python example.py

W każdej chwili można przerwać działanie programu naciskając kombinacje klawiszy CRTL+C.

Po wykonaniu całego programu w konsoli zobaczymy następujący widok:

Rysunek 4. Komunikaty wyświetlane podczas działania programu example.py

Działanie programu zostało zaprezentowane na wideo:

 

Autor: Patryk Mądry