W tej części kursu zapoznamy się prostym narzędziem biblioteki Wiring Pi do ustawienia stanów pinów GPIO. Za pomocą ustawienia stanów możemy sterować wieloma elementami elektronicznymi oraz modułami. Przygotujemy prosty układ wykorzystując diody i przyciski. Napiszemy też prostą aplikację do reagowania na przyciski. Dzięki poleceniu gpio
będziemy mogli ustawiać tryby pinów, ich stan oraz wartości PWM.
Ważne
Zanim zaczniemy kolejną część mamy małe ogłoszenie odnośnie modułu ProtoPi plus. W tej wersji producent popełnił drobny błąd w opisie. W związku z tym nieprawidłowe podpisy posiadają wyprowadzenia 22 i 27. Prawidłowy układ znajduje się na rysunku poniżej.
Wiring Pi
Wiring Pi oprócz możliwości ustawiania pinów GPIO za pomocą jej bibliotek pozwala korzystać z gotowej aplikacji gpio
, która pozwala bez potrzeby pisania aplikacji sterować pinami GPIO. Wszystkie dostępne opcje można zobaczyć po wpisaniu polecenia
[bash]man gpio[/bash]
Numeracja pinów GPIO w Wiring Pi
Wiring Pi używa własnej numeryzacji pinów GPIO. Poniżej widzimy wynik polecenia gpio readall, które wyświetla stan wszystkich pinów GPIO ,a przy okazji pokazuje numeryzację tych pinów oraz ich tryb.
[bash]
$ gpio readall
+—–+—–+———+——+—+–B Plus–+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 0 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 1 | 11 || 12 | 1 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 1 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 1 | 15 || 16 | 1 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 1 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 1 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 1 | 21 || 22 | 1 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 1 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 1 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 1 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 1 | 35 || 36 | 1 | OUT | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 1 | 37 || 38 | 1 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 1 | IN | GPIO.29 | 29 | 21 |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+–B Plus–+—+——+———+—–+—–+
[/bash]
Przy wydawaniu poleceń za pomocą programu gpio
, możemy używać również domyślnej numercji pinów, dodając do polecenia gpio
flagę -g
. Czyli np dla pinu 17, który w Wiring Pi ma numer 0, polecenie włączenia stanu wysokiego będzie wyglądać tak:
[bash]gpio -g write 17 1[/bash]
Tryb pinu
Pin GPIO może być ustawiony w trybie in, out, pwm, clock, up, down i tri
. W tej części zajmiemy się trybami in, out , up, down i tri
. W pierwszej kolejności wytłumaczę in
i out
, czyli jeśli np. pin ma posłużyć nam do włączenia diody lub przekaźnika, musimy go ustawić w trybie out – wyjściowym. Gdy chcemy odczytać wartość, ustawiamy pin na tryb in – wejściowy. Opcję trybu ustawiamy za pomocą opcji mode
.
[bash]
gpio -g mode nr_pinu in/out
[/bash]
Czyli aby ustawić pin 0, jako wyjściowy wydajemy polecenie:
[bash]gpio -g mode 17 out[/bash]
Ustawianie stanu pinu
Piny w Raspberry Pi są cyfrowe i mogą mieć stan: 0 lub 1 (wysoki lub niski). Stan wysoki mamy wtedy, gdy na pinie jest załączone zasilanie (w przypadku Maliny jest to 3,3V). Stan niski natomiast określa masę (GND) czyli -. Stan pinu możemy ustawić za pomocą opcji write
:
[bash]gpio -g write nr_pinu 0 lub 1[/bash]
Czyli aby ustawić pin 0 na stan wysoki wykonamy polecenie
[bash]gpio -g write 17 1[/bash]
Powyższe operacje można napisać w języku C++:
[bash]
#include <wiringPi.h>
int main (void)
{
wiringPiSetup () ;
pinMode (0, OUTPUT) ;
for (;;)
{
digitalWrite (0, HIGH) ; delay (500) ;
digitalWrite (0, LOW) ; delay (500) ;
}
return 0 ;
}
[/bash]
Bardziej doświadczonym oraz zainteresowanym czytelnikom polecam zapoznanie się z przykładami.
Odczyt stanu pinu
Uwaga: Należy pamiętać że do pinu można podpiąć maksymalnie prąd o napięciu 3,3V i natężeniu nie większym niż 50mA. Podłączenie większego prądu może uszkodzić Raspberry Pi!
[bash]gpio -g read nr_pinu[/bash]
Czyli aby odczytać np stan pinu 23 wydajemy polecenie
[bash]gpio -g read 23[/bash]
Jeśli weźmiemy kilkukrotnie odczytamy stan pinu zauważymy że jego stan potrafi się zmienić (pin otrzymuje wtedy stan obojętny). Dlatego warto podciągnąć nasz pin albo do stanu pull_down lub pull_up za pomocą trybu up
lub down
[bash]gpio -g mode 23 down[/bash]
Aby wyłączyć podciągnięcie pinu ze stanu niskiego lub wysokiego, możemy użyć trybu tri
[bash]gpio -g mode 23 tri[/bash]
Teraz gdy wiemy już jak ustawić dany pin oraz odczytać jego wartość, zrobimy prosty skrypt w bash-u i układ, który po naciśnięciu przycisku zaświeci nam diodę. Skrypt nazwałem przycisk.sh.
[bash]nano przycisk.sh[/bash]
wklejamy poniższy kod
[bash]
#!/bin/bash
gpio -g mode 23 in
gpio -g mode 17 out
gpio -g mode 23 down
echo "nacisnij CTR+C aby zakonczyc program"
while true; do
x=`gpio -g read 23`
if [ $x -ge 1 ]
then
gpio -g write 17 1
else
gpio -g write 17 0
sleep 0.2
fi
done
[/bash]
następnie zamykamy i zapisujemy plik CTRL+X, i zmieniamy uprawnienia dla pliku:
[bash]chmod +x przycisk.sh[/bash]
I uruchamiamy program:
[bash]./program.sh[/bash]
Sposób działania widoczny na filmiku.
Sterowanie PWM
Za pomocą narzędzia gpio możemy starować tylko sprzętowym PWM, który jest dostępny na pinie 18. Czym jest modulacja PWM możemy dowiedzieć się z nagrania Elektroprzewodnika.
Aby przełączyć pin ma tryb PWM musimy wydać polecenie:
[bash]gpio -g mode 18 pwm[/bash]
teraz jeśli chcemy sterować modulacją pwm używamy polecenia:
[bash]gpio -g pwm 18 <zakres od 0 do 1023>[/bash]
np. ustawiając modulacje na połowę wydajemy polecenie:
[bash]gpio -g pwm 18 512[/bash]
Za pomocą PWM możemy sterować m.in. jasnością diody czy obrotami silników.
Schematy do Filmu
Narzędzie gpio posiada jeszcze klika dodatkowych funkcji, których nie będę już opisywać. Ciekawskim polecam zapoznanie się z wpisem na stronie projektu Wiring Pi.
W późniejszych wpisach będziemy potrzebować sterować silnikami jak również serwami. Narzędzie gpio
nie posiada obsługi serw oraz możemy skorzystać za jego pomocą tylko z jednego sprzętowego PWM (pin 18). My będziemy potrzebować przynajmniej trzy porty PWM oraz prostą obsługę serw, dlatego w kolejnych częściach skorzystamy już z biblioteki pigpio i narzędzia pigs. Wiring Pi jest rozbudowaną bibliotekę i pozwala na praktycznie każde operacje (również na programowy PWM), lecz wymagane jest pisanie kodu w C/C++. Obecnie będę prezentować proste narzędzia i póki co omijać pisane kodu poza prostymi skryptami bash.
#3 Start z Raspberry Pi – Wiring Pi – sterowanie pinami za pomocą polecenia gpio http://t.co/Btkn7ynxGA via @Picoboardpl
Lepiej późno niż wcale ;)
Lepiej późno niż wcale ;)
Cyryl Sochacki liked this on Facebook.
Cyryl Sochacki liked this on Facebook.
Mariusz Golon liked this on Facebook.
Mariusz Golon liked this on Facebook.
picoboard.pl liked this on Facebook.
picoboard.pl liked this on Facebook.
osworld.pl liked this on Facebook.
[…] Więcej o bibliotece znajdziecie w naszym artykule […]
[…] Więcej o bibliotece znajdziecie w naszym artykule […]
Witam zrobiłem to samo z przełącznikiem i nie chce mi to działać pomoże Pan ?