Tags Posts tagged with "gpio"

gpio

Raspberry Pi, sprzęt

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.

BeagleBoard

W poprzednim wpisie o BeagleBone Black pisaliśmy o złączach GPIO oraz dostępnych bibliotekach do zarządzania IO. W tej części przedstawimy jak za pomocą BBBlack oraz biblioteki do Pythona sterować diodami, a żeby nie było nudno zrobimy efekt świetlny, który posiadał na przedniej masce samochód “Nieustraszony” David’a Hasselhoff’a.

A oto jak prezentuje się nasza praca:

Lista zakupów

Do przygotowania efektu potrzebować będziemy następujące komponenty:

Instalacja biblioteki w systemie Ångström

Po uruchomieniu BeagleBone Black musimy pobrać i zainstalować biblioteki dla Pythona do obsługi IO BBBlack. Otwieramy przeglądarkę i wpisujemy:

http://beaglebone.local

Abyśmy mogli zalogować się do naszego BBB, wpisujemy następujące polecenia (zakładając użytkownika root w świeżej instalacji systemu):

Host/IP lub SSH URL [localhost]: beaglebone.local
Port [22]: (wystarczy wcisnąć Enter)
User: root
Connecting to <code>ssh://root@beaglebone.local:22</code>

Możemy także podłączyć się zdalnie do naszego BBB poprzez SSH (użytkownik: root, hasło: puste). Aktualizujemy czas zegara, aby nie było problemów z łącznością z repozytoriami:

/usr/bin/ntpdate -b -s -u pool.ntp.org

następnie instalujemy potrzebne pakiety oraz instalujemy bibliotekę.

opkg update && opkg install python-pip python-setuptools python-smbus
pip install Adafruit_BBIO

Po instalacji sprawdzimy czy biblioteki zainstalowały się poprawnie wpisując w konsoli

python -c "import Adafruit_BBIO.GPIO as GPIO; print GPIO"

Powinniśmy wtedy zobaczyć mniej więcej taką odpowiedź

<module 'Adafruit_BBIO.GPIO' from '/usr/local/lib/python2.7/dist-packages/Adafruit_BBIO/GPIO.so'>

Jeśli otrzymaliśmy taką odpowiedź możemy już brać się za pisanie programów.

Montaż układu

Poniżej znajduje się schemat układu jaki musimy zbudować do naszych testów. Podpinamy diody do pinów w rzędzie P8  od 7 do 15, zaś GDN podłączamy do pinu 2. (schemat złącz GPIO w BeagleBone Black).

Sterowanie diodami w BeagleBone Black - schemat podłączenia diód

Pierwszy program

Po zmontowaniu układu napiszemy prosty program za pomocą, którego pierwsza dioda z układu podłączona do portu GPIO66 na P8 (pin7) będzie migać.

W konsoli wpisujemy:

# nano dioda.py

I piszemy taki program:

import Adafruit_BBIO.GPIO as GPIO
import time

GPIO.setup("P8_7", GPIO.OUT)

while True:
    GPIO.output("P8_7", GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output("P8_7", GPIO.LOW)
    time.sleep(0.5)

zapisujemy plik (CTRL-x) i uruchamiamy program:

# python dioda.py

Po uruchomieniu nasza dioda powinna zacząć migać.
Gdy już nam się znudzi miganie diody zatrzymujemy program CTRL-c.

Efekt świetlny

Teraz zabieramy się za projekt efektu świetlnego z “Nieustraszonego”.
W konsoli wpisujemy

# nano nieustraszony.py

I piszemy taki program:

import Adafruit_BBIO.GPIO as GPIO
import time

GPIO.setup("P8_7", GPIO.OUT)
GPIO.setup("P8_8", GPIO.OUT)
GPIO.setup("P8_9", GPIO.OUT)
GPIO.setup("P8_10", GPIO.OUT)
GPIO.setup("P8_11", GPIO.OUT)
GPIO.setup("P8_12", GPIO.OUT)
GPIO.setup("P8_13", GPIO.OUT)
GPIO.setup("P8_14", GPIO.OUT)
GPIO.setup("P8_15", GPIO.OUT)

while True:
    for i in range(7, 15):
        GPIO.output("P8_%i" % (i), GPIO.HIGH)
        time.sleep(0.05)
        GPIO.output("P8_%i" % (i+1), GPIO.HIGH)
        time.sleep(0.05)
        GPIO.output("P8_%i" % (i), GPIO.LOW)
        time.sleep(0.05)

    for i in range(15, 7, -1):
        GPIO.output("P8_%i" % (i), GPIO.HIGH)
        time.sleep(0.05)
        GPIO.output("P8_%i" % (i-1), GPIO.HIGH)
        time.sleep(0.05)
        GPIO.output("P8_%i" % (i), GPIO.LOW)
        time.sleep(0.05)

zapisujemy plik (CTRL-x) i uruchamiamy program:

# python nieustraszony.py

Po uruchomieniu nasze diody powinny zachowywać się podobnie jak diody na samochodzie “Nieustraszonego”. Gdy już nam się znudzi miganie zatrzymujemy program Ctrl+c.

Artykuł ten jest częścią serii o BeagleBone Black. Za dostarczenie płytki dziękujemy BOTLAND.com.pl

BeagleBoard

BeagleBone Black posiada aż 96 złączy GPIO, za pomocą których możemy sterować urządzeniami oraz podłączać inne układy i sheldy m.in przez złącza analogowe, cyfrowe, SPI, I2C czy UART. W porównaniu np. do Raspberry Pi z 26 złaczami GPIO, BBBlack daje spore możliwości przy ich wykorzystaniu. Dostępne są biblioteki dla JavaScript i Phyton do zarządzania złączami GPIO, które można użyć w systemach Ubuntu i Angstrom.

Schemat złącz GPIO

BeagleBone Black posiada 2 rzędy po 46 złączy na których znajduje się:

BeagleBone Black

  • 7 złącz Analogowych
  • 65 złącz Cyfrowych na
  • 2x I2C
  • 2x SPI
  • 2x CAN Bus
  • 4 Zegary
  • 4x UART
  • 8x PWM
  • A/D Konverter

BeagleBone Black - schemat złączy GPIO

Biblioteki GPIO

Podstawową bibliotekę dostarczoną razem z BeagleBone Black jest BoneScript. Biblioteka napisana jest w JavaScript. Dzięki niej możemy w łatwy sposób z poziomu przeglądarki zarządzać złączami GPIO.

Przykładowy kod – migająca dioda.

var b = require('bonescript');
var led = "USR3";
var state = 0;</code>

b.pinMode(led, 'out');
toggleLED = function() {
state = state ? 0 : 1;
b.digitalWrite(led, state);
};

timer = setInterval(toggleLED, 100);

stopTimer = function() {
clearInterval(timer);
};

setTimeout(stopTimer, 3000);

Biblioteki dla Python-a od Adafruit dostępne na GitHubie. Biblioteka obecnie nie obsługuje wszystkich złącz IO, ale jest w ciągłym rozwoju i pomału są dodawane nowe funkcje.

Przykładowy kod – migająca dioda

import Adafruit_BBIO.GPIO as GPIO
import time</code>

GPIO.setup("P8_10", GPIO.OUT)

while True:
GPIO.output("P8_10", GPIO.HIGH)
time.sleep(0.5)
GPIO.output("P8_10", GPIO.LOW)
time.sleep(0.5)

Możliwa jest również obsługa złącz za pomocą  C++ oraz bash, ale lepszym wyborem jest wybranie jednej powyższych bibliotek.

Artykuł ten jest częścią serii o BeagleBone Black. Za dostarczenie płytki dziękujemy BOTLAND.com.pl

Raspberry Pi

Biblioteka RPi.GPIO została napisana w Pythonie i umożliwia prostą konfigurację, odczyt oraz zapis poprzez interfejs GPIO (General Purpose Input/Output). Zostały przygotowane specjalne paczki dla dystrybucji Raspbian. Niestety nie są one domyślnie dostępne w oficjalnym obrazie systemu. Interfejs ten umożliwia komunikację w obie strony z mikroprocesorami lub innymi urządzeniami peryferyjnymi. Pozwala on na zapis oraz odczyt różnych danych.

GPIO daje wiele możliwości rozbudowania Raspberry Pi o kolejne funkcje i możliwości. Jednym z takich dodatków jest np. Gertboard.

Schemat GPIO na Raspberry Pi

Schemat GPIO na Raspberry Pi

Paczka dostępna jest na stronie http://pypi.python.org/pypi/RPi.GPIO. Aby ją zainstalować należy zalogować się do terminala np. przy pomocy LXTerminal jeżeli jesteś w trybie graficznym.

Najpierw pobieramy paczkę

wget http://raspberry-gpio-python.googlecode.com/files/python-rpi.gpio_0.3.1a-1_armhf.deb

Instalacja

sudo dpkg -i python-rpi.gpio_0.3.1a-1_armhf.deb

Przykładowy skrypt (gpio.py) w Pythonie dla Raspberry Pi:

import RPi.GPIO as GPIO

# to use Raspberry Pi board pin numbers
GPIO.setmode(GPIO.BOARD)

# set up the GPIO channels - one input and one output
GPIO.setup(11, GPIO.IN)
GPIO.setup(12, GPIO.OUT)

# input from pin 11
input_value = GPIO.input(11)

# output to pin 12
GPIO.output(12, GPIO.HIGH)

# the same script as above but using BCM GPIO 00..nn numbers
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)
GPIO.setup(18, GPIO.OUT)
input_value = GPIO.input(17)
GPIO.output(18, GPIO.HIGH)

Aby go uruchomić należy wydać komendę jako root, gdyż dostęp do GPIO wymaga uprawnień administratora.

sudo python gpio.py

Polecane

Python

0 87
Python 3.6.4rc1 jest pierwszym kandydatem do następnego wydania Pythona 3.6.4 jako wydanie konserwacyjne. Podczas gdy wersja 3.6.4rc1 jest edycją poglądową, nie przeznaczoną dla środowisk...