GPIO w Cubietruck z poziomu Pythona na przykładzie sterowaniem diod LED

Moderator: bbiernat

Post Reply
User avatar
pancio
Administrator
Posts: 67
Joined: 18 September 2013, 23:02 - Wed
Location: SILESIA

GPIO w Cubietruck z poziomu Pythona na przykładzie sterowaniem diod LED

Post by pancio »

Tutorial napisany na podstawie: Using Python Program Control GPIOs


Założenia:
- Cubietruck
- DVK570 (niewymagana, jednak jeśli nie masz kitu - musisz sam zadbać o odpowiednie parametry prądowe np dla diod LED)
- CTdebian 4.1 (do pobrania ze strony Igora Pecovnik-a lub z działu Wsady)

Przestroga 1.
Wszystkie operacje wykonuję jako uprzywilejowany użytkownik root . Nie jest to dobra praktyka więc proponuję używać sudo i wykonywać wszystkie komendy z poziomu normalnego użytkownika...


Uwaga.
Dystrybucja, której używam to kompilacja ze źródeł CTDebian Igora Pecovnik-a. Możesz pobrać najnowszą wersję ze strony Igora lub skorzystać z mojej kompilacji.


Przestroga 2
Wszystko co robisz - robisz na własną odpowiedzialność. W trakcie tutoriala wykonywane są czynności, które mogą uszkodzić twoje urządzenie...


Dostępne piny
Cubietruck posiada dwa gniazda z wyprowadzonymi na nich wszystkimi dostępnymi pinami - w tym GPIO możliwymi do wykorzystania do sterowania urządzeń. Niestety, raster pinów na złączach jest dość nieprzyjazny i musimy stosować przejściówki lub bardzo cienkie 'dupointy'. Problem z dostępem rozwiązuje też dowolny DEVKIT. W przypadku użytego przeze mnie DVK570 mamy 4 diody LED podłączone odpowiednio do pinów portu PG00 - PG03. Spróbujmy dla przykładu wysterować te diody...
ct_cn8.png
ct_cn8.png (62.73 KiB) Viewed 29350 times
ct_cn9.png
ct_cn9.png (54.43 KiB) Viewed 29350 times

Konfiguracja
Konfiguracja pinów i portów wykorzystywanych do sterowania z poziomu Pythona jest 2 etapowa:

1. Konfiguracja script.bin (musimy poinformować nasze jądro gdzie i jakie sygnały będą używane)
2. Konfiguracja i modyfikacja skryptów biblioteki pySUNXI


Modyfikacja script.bin
W większości przygotowanych dla CT obrazów systemu istnieje pewna domyślna konfiguracja wszystkich pinów i sygnałów używanych przez jądro. Konfiguracja ta jest ładowana podczas uruchamiania systemu i znajduje się w binarnym pliku /boot/script.bin. Niestety, jeśli chcemy rozszerzyć możliwości sterowania pinami GPIO musimy zmodyfikować istniejącą konfigurację. W moim przypadku do konfiguracji domyślnej musiałem dodać definicje dla pinów 0 do 3 portu G.

Code: Select all

root@ctdev:~# cd /boot/
root@ctdev:/boot# 
root@ctdev:/boot# bin2fex script.bin script.fex
root@ctdev:/boot# cp script.fex script.fex.backup #kopia bezpieczenstwa
root@ctdev:/boot# vim script.fex
W pliku script.fex szukamy fragmentu:

Code: Select all

[gpio_para]
gpio_used = 1
gpio_num = 4
gpio_pin_1 = port:PH20<1><default><default><1>
gpio_pin_2 = port:PH10<0><default><default><0>
gpio_pin_68 = port:PH18<0><default><default><0>
gpio_pin_69 = port:PH24<0><default><default><0>
wyszukiwana cześć może się różnić w zależności od wersji systemu... generalnie wyszukujemy blok [gpio_para] a następnie wprowadzamy wymagane do obsługi nowych pinów modyfikacje:

Code: Select all

[gpio_para]
gpio_used = 1
gpio_num = 8
gpio_pin_1 = port:PH20<1><default><default><1>
gpio_pin_2 = port:PH10<0><default><default><0>
gpio_pin_68 = port:PH18<0><default><default><0>
gpio_pin_69 = port:PH24<0><default><default><0>
gpio_pin_3 = port:PG00<0><default><default><0>
gpio_pin_4 = port:PG01<0><default><default><0>
gpio_pin_5 = port:PG02<0><default><default><0>
gpio_pin_6 = port:PG03<0><default><default><0>
W omawianym przykładzie dodaliśmy 4 piny gpio_pin3 do gpio_pin6, które zostaną przypisane do rejestru G. Zmieniamy też ilość dostępnych pinów GPIO (parametr gpio_num = 8) i zapisujemy plik.

Następnie sprowadzamy nasz script.fex do postaci binarnej:

Code: Select all

root@ctdev:/boot# fext2bin script.fex script.bin
Aby jądro mogło poprawnie odczytać konfigurację musimy ponownie uruchomić system.


pySUNXI
Uaktualniamy system i pobieramy wymagane pakiety. Pobieramy bibliotekę:

Code: Select all

root@ctdev:~# apt-get update
root@ctdev:~# apt-get install python-dev
root@ctdev:~# wget http://dl.cubieboard.org/software/libs/pySUNXI-0.1.12.tar.gz
root@ctdev:~# tar zxf pySUNXI-0.1.12.tar.gz
root@ctdev:~# cd pySUNXI-0.1.12
root@ctdev:~/pySUNXI-0.1.12#
Przed instalacją biblioteki musimy zmodyfikować źródła. W tym celu w pliku source/pysunxi.c dodajemy definicje:

Code: Select all

#define PG0    SUNXI_GPG(0)
#define PG1    SUNXI_GPG(1)
#define PG2    SUNXI_GPG(2)
#define PG3    SUNXI_GPG(3)
następnie w tym samym pliku pod koniec musimy uzupełnić dostępne dla biblioteki obiekty związane z obsługą portu G:

Code: Select all

    PyModule_AddObject(module, "PG0", Py_BuildValue("i", PG0));
    PyModule_AddObject(module, "PG1", Py_BuildValue("i", PG1));
    PyModule_AddObject(module, "PG2", Py_BuildValue("i", PG2));
    PyModule_AddObject(module, "PG3", Py_BuildValue("i", PG3)); 
Tak zmodyfikowany plik zapisujemy i możemy przystąpić do instalacji biblioteki:

Code: Select all

root@ctdev:~/pySUNXI-0.1.12# python setup.py install
Jeśłi kompilacja przebiegła poprawnie możemy przystąpić do testu naszych dodatkowych GPIO. Stwórz nowy plik o nazwie blink.py przeklej do niego poniższą zawartość:

Code: Select all

#!/usr/bin/env python
import SUNXI_GPIO as GPIO
import time

LED1 = GPIO.PG0
LED2 = GPIO.PG1
LED3 = GPIO.PG2
LED4 = GPIO.PG3

GPIO.init()
GPIO.setcfg(LED1, GPIO.OUT)
GPIO.setcfg(LED2, GPIO.OUT)
GPIO.setcfg(LED3, GPIO.OUT)
GPIO.setcfg(LED4, GPIO.OUT)

while True:
        GPIO.output(LED1, GPIO.HIGH)
        time.sleep(0.1)
        GPIO.output(LED1, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED2, GPIO.HIGH)
        time.sleep(0.1)
        GPIO.output(LED2, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED3, GPIO.HIGH)
        time.sleep(0.1)
        GPIO.output(LED3, GPIO.LOW)
        time.sleep(0.1)
        GPIO.output(LED4, GPIO.HIGH)
        time.sleep(0.1)
        GPIO.output(LED4, GPIO.LOW)
        time.sleep(0.1)
Program cyklicznie zapala i gasi poszczególne diody LED:

Code: Select all

oot@ctdev:~/pySUNXI-0.1.12# python blink.py
Działąnie skryptu...
Działąnie skryptu...
ct_devkit570.jpg (147.82 KiB) Viewed 29350 times
Załączniki
pySUNXI-0.1.12_PG00_PG03.tar.gz
Biblioteka pySUNXI po modyfikacjach opisanych w tutorialu
(41.08 KiB) Downloaded 2074 times
script.fex.tar.gz
Plik script.fex po modyfikacjach opisanych w tutorialu
(5 KiB) Downloaded 2060 times
script.tar.gz
Plik script.bin wygenerowany z pliku script.fex
(8.01 KiB) Downloaded 2026 times

Post Reply