Raspberry Pi to wszechstronna platforma do projektów z robotyki i elektroniki, a jej piny GPIO (General Purpose Input/Output) umożliwiają bezpośrednie sterowanie urządzeniami zewnętrznymi, takimi jak diody LED, przyciski czy silniki. W tym artykule omówimy podstawy programowania GPIO za pomocą skryptów Python, w tym instalację bibliotek, konfigurację pinów, obsługę wejść i wyjść oraz praktyczne przykłady, idealne dla początkujących entuzjastów robotyki.
Czym są piny GPIO w Raspberry Pi?
Raspberry Pi wyposażone jest w 40-pinowe złącze GPIO, składające się z dwóch rzędów po 20 pinów. Nie wszystkie z nich służą do programowalnych operacji – część jest zarezerwowana na zasilanie (3,3 V i 5 V) oraz masę (GND). Pozostałe piny GPIO można konfigurować jako wejścia (do odczytu sygnałów) lub wyjścia (do wysyłania sygnałów), co czyni je kluczowym elementem w projektach elektronicznych i robotycznych.
Piny GPIO pracują na napięciu 3,3 V z maksymalnym prądem obciążenia 16 mA na pin. Dzięki temu można bezpiecznie podłączyć jedną lub dwie diody LED przez rezystor ograniczający, ale do bardziej prądożernych urządzeń (np. silniki) potrzebne są tranzystory lub przekaźniki. Numery pinów zależą od trybu numeracji: BOARD (fizyczne pozycje na złączu, stałe dla wszystkich modeli) lub BCM (numery procesora, różniące się między wersjami Pi).
W robotyce GPIO pozwala na sterowanie sensorami, aktuatorami czy modułami komunikacyjnymi jak SPI (np. MOSI – GPIO10 i MISO – GPIO9).
Przygotowanie środowiska – instalacja i podstawy Pythona
Aby zacząć programować GPIO, zainstaluj system operacyjny Raspberry Pi OS i uruchom Pi. Python jest preinstalowany, ale kluczowa biblioteka RPi.GPIO wymaga instalacji. Wykonaj polecenia w terminalu:
sudo apt update
sudo apt install python3-rpi.gpio
Dla nowszych projektów polecana jest biblioteka gpiozero, prostsza w użyciu. Zainstaluj ją poleceniem:
sudo apt install python3-gpiozero
Podstawy składni Pythona niezbędne do skryptów GPIO to zmienne, pętle i funkcje. Przykładowo, pętla for iterująca od 0 do 4:
for x in range(5):
print(x)
Zapis i uruchomienie prostego skryptu wykonasz następująco:
echo "print('Hello World')" > hello.py
chmod +x hello.py
python3 hello.py
To wystarczy, by przejść do sterowania GPIO i tworzyć pierwsze interfejsy z elektroniką.
Konfiguracja pinów GPIO w Pythonie z biblioteką RPi.GPIO
Import biblioteki i ustawienie trybu numeracji to podstawa każdego skryptu:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD) # numeracja fizyczna pinów
Konfigurację kierunku pracy pinu wykonasz tak:
- wyjście –
GPIO.setup(pin, GPIO.OUT); - wejście –
GPIO.setup(pin, GPIO.IN); - wejście z rezystorem podciągającym –
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)(podciąga do 3,3 V); - wejście z rezystorem ściągającym –
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)(do masy).
Sterowanie stanem wyjścia realizujesz poleceniami:
GPIO.output(pin, GPIO.HIGH) # stan wysoki (3,3 V)
GPIO.output(pin, GPIO.LOW) # stan niski (0 V)
Odczyt wejścia wykonasz wprost: stan = GPIO.input(pin) (zwraca True dla stanu wysokiego i False dla niskiego).
Na końcu zawsze wywołaj GPIO.cleanup(), by zwolnić piny i uniknąć konfliktów.
Praktyczny przykład – diody LED i przycisk
Podłącz diodę LED (np. na pin 40) przez rezystor 330 Ω do masy i przycisk (np. na pin 36, drugi koniec do masy – z rezystorem podciągającym włączonym programowo). Oto skrypt sprawdzający przycisk i zapalający diodę:
import RPi.GPIO as GPIO
import time
ledPin = 40
btnPin = 36 # przycisk łączy pin z masą (aktywny stan niski)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(ledPin, GPIO.OUT)
GPIO.setup(btnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # rezystor podciągający
btnState = GPIO.input(btnPin)
if btnState == GPIO.HIGH:
print('Przycisk nie jest wciśnięty')
else:
print('Przycisk jest wciśnięty')
GPIO.output(ledPin, GPIO.HIGH)
while GPIO.input(btnPin) == GPIO.LOW: # czekaj na puszczenie
pass
GPIO.output(ledPin, GPIO.LOW)
GPIO.cleanup()
print('Koniec programu')
Ten kod odczytuje stan przycisku, zapala diodę na czas wciśnięcia i gasi ją po puszczeniu.
Uproszczone programowanie z gpiozero
Biblioteka gpiozero upraszcza kod, abstrakcjonując szczegóły konfiguracji. Przykładowo, sterowanie diodą i przyciskiem wygląda tak:
from gpiozero import LED, Button
from time import sleep
led = LED(40)
button = Button(36, pull_up=True)
while True:
if button.is_pressed:
led.on()
sleep(2)
led.off()
sleep(0.1)
To idealne dla początkujących – klasy LED i Button automatycznie dbają o konfigurację pinów.
Sekwencja trzech diod (zielona na pinie 11, żółta 13, czerwona 15) może wyglądać następująco:
from gpiozero import LED
from time import sleep
zielona = LED(11)
zolty = LED(13)
czerwona = LED(15)
while True:
zielona.on()
sleep(1)
zielona.off()
zolty.on()
sleep(1)
zolty.off()
czerwona.on()
sleep(1)
czerwona.off()
Taki kod w prosty sposób symuluje sygnalizację świetlną, przydatną w projektach mobilnych robotów.
Zaawansowane zastosowania – PWM i sterowanie silnikami
Do płynnego sterowania jasnością LED lub pozycją serwomechanizmu użyj PWM (Pulse Width Modulation). W bibliotece RPi.GPIO zrobisz to tak:
GPIO.setup(pin, GPIO.OUT)
pwm = GPIO.PWM(pin, 50) # częstotliwość 50 Hz dla serwa
pwm.start(0)
pwm.ChangeDutyCycle(7.5) # pozycja środkowa serwa
W robotyce PWM to podstawa sterowania silnikami DC i serwami.
Biblioteka wiringPi (język C) umożliwia wykorzystanie PWM programowego lub sprzętowego dla większej precyzji, np. do serw:
#include <wiringPi.h>
#include <softPwm.h>
wiringPiSetupGpio();
pinMode(18, OUTPUT);
softPwmCreate(18, 0, 200);
softPwmWrite(18, 10); // pozycja w zakresie 5–20
Kompilacja: gcc servo.c -o servo -lwiringPi, uruchomienie: ./servo 10. Przy pracy ze sprzętowym PWM często wymagane są uprawnienia sudo – zachowaj ostrożność.
Ostrzeżenia i najlepsze praktyki w projektach robotycznych
Dbaj o bezpieczeństwo i stabilność układu, kierując się poniższymi zasadami:
- bezpieczeństwo – nigdy nie przekraczaj 3,3 V/16 mA na pin; stosuj tranzystory, przekaźniki i level shiftery przy elementach 5 V;
- uprawnienia – uruchamiaj skrypty z
sudo, jeśli jest to wymagane (np. przy PWM lub dostępie do urządzeń systemowych); - debugowanie – używaj
print(), diod LED lub logów do wizualizacji stanów i zdarzeń; - integracja z robotyką – łącz GPIO z kamerami, czujnikami ultradźwiękowymi czy modułami Bluetooth w projektach autonomicznych;
- alternatywy – Node-RED do wizualnego programowania, JavaScript dla interfejsów webowych.