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.

modul-protopi-plus-errata

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

man gpio

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.

$ 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--+---+------+---------+-----+-----+

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:

gpio -g write 17 1

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.

gpio -g mode nr_pinu in/out

Czyli aby ustawić pin 0, jako wyjściowy wydajemy polecenie:

gpio -g mode 17 out

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:

gpio -g write nr_pinu 0 lub 1

Czyli aby ustawić pin 0 na stan wysoki wykonamy polecenie

gpio -g write 17 1

Powyższe operacje można napisać w języku C++:

#include <wiringPi.h>
int main (void)
{
  wiringPiSetup () ;
  pinMode (0, OUTPUT) ;
  for (;;)
  {
    digitalWrite (0, HIGH) ; delay (500) ;
    digitalWrite (0,  LOW) ; delay (500) ;
  }
  return 0 ;
}

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!

gpio -g read nr_pinu

Czyli aby odczytać np stan pinu 23 wydajemy polecenie

gpio -g read 23

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

gpio -g mode 23 down

Aby wyłączyć podciągnięcie pinu ze stanu niskiego lub wysokiego, możemy użyć trybu tri

gpio -g mode 23 tri

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.

nano przycisk.sh

wklejamy poniższy kod

#!/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

następnie zamykamy i zapisujemy plik CTRL+X, i zmieniamy uprawnienia dla pliku:

chmod +x przycisk.sh

I uruchamiamy program:

./program.sh

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:

gpio -g mode 18 pwm

teraz jeśli chcemy sterować modulacją pwm używamy polecenia:

gpio -g pwm 18 &lt;zakres od 0 do 1023&gt;

np. ustawiając modulacje na połowę wydajemy polecenie:

gpio -g pwm 18 512

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.