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...
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
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>
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>
Następnie sprowadzamy nasz script.fex do postaci binarnej:
Code: Select all
root@ctdev:/boot# fext2bin script.fex script.bin
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#
Code: Select all
#define PG0 SUNXI_GPG(0)
#define PG1 SUNXI_GPG(1)
#define PG2 SUNXI_GPG(2)
#define PG3 SUNXI_GPG(3)
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));
Code: Select all
root@ctdev:~/pySUNXI-0.1.12# python setup.py install
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)
Code: Select all
oot@ctdev:~/pySUNXI-0.1.12# python blink.py