Ostatnio Na Forum
Logowanie

Polityka prywatno?ci

Portal openrouter.info stosuje pliki cookies ("ciasteczka") pozwalające na dostosowanie zawartości portalu do indywidualnych potrzeb. Korzystanie z portalu bez zmiany ustawień dotyczących ciasteczek oznacza akceptację umieszczenia ich na urządzenia użytkownika. Zmianę ustawień pliku ciasteczek można wykonać zmieniając opcję w ustawieniach przeglądarki internetowej. Więcej informacji można znaleźć w Polityce prywatności.

Sterowanie liniami GPIO w OpenWrt

Email Drukuj

GPIO (General Purpose Input/Output) s? uniwersalnymi liniami wyprowadzonymi z procesora, ktre zwykle wykorzystywane s? przez system operacyjny do sterowania innymi komponentami systemu. Mo?e to by? prze??cznik, mo?e to by? realizacja magistrali np. i2c lub 1-wire, SDMOD albo od innych celw. Takie linie s? zwykle programowalne i mo?na jest ustawi? jako wej?cie lub wyj?cie. Lini jest zwykle 8 do 22, cz??? jest ca?kowicie wolna i mo?na je wykorzysta? do w?asnych celw.

Najwa?niejsze aby system mia? wkompilowan? obs?ug? GPIO. Je?eli istnieje katalog /sys/class/gpio to mo?emy programowo sterowa? liniami z wykorzystaniem mechanizmu tzw. sysfs.

W??czenie obs?ugi GPIO

Aby sterowa? lini? nale?y je najpierw udost?pni? do przestrzeni u?ytkownika ("wyeksportowa?"). Robi si? to podaj?c odpowiedni numer GPIO do pliku export w w/w katalogu (w tym przyk?adzie gpio o numerze 2):

# echo "2" > /sys/class/gpio/export

Powinien pojawi? si? katalog o nazwie /sys/class/gpio/gpio2. Je?eli takiego nie ma - najprawdopodobniej GPIO o numerze 2 jest wykorzystywane przez system i nie mo?na z niego skorzysta?.

Linia wyj?ciowa

Lini? mo?na zdefiniowa? jako wyj?cie poleceniem:

# echo out > /sys/class/gpio/gpio2/direction

Lini? zdefiniowan? jako wyj?cie mo?na sterowa? ustawiaj?c odpowiedni? warto?? w pliku value

# echo 1 > /sys/class/gpio/gpio2/value
# echo 0 > /sys/class/gpio/gpio2/value

Je?eli pod??czymy pod t? lini? np. diod? LED lub przeka?nik to mo?na tak dane urz?dzenie w??czy? i wy??czy?.

Nale?y pami?ta? ?e w??czona linia ma napi?cie zwykle 3.3V (takie jak router), oraz ma niewielk? obci??alno?? pr?dow? (rz?du kilku - kilkunastu mA).

Linia wej?ciowa

Lini? mo?na zdefiniowa? jako wej?cie poleceniem:

# echo in > /sys/class/gpio/gpio2/direction

Stan linii zdefiniowanej jako wej?cie mo?na odczyta? tak samo z pliku value

# echo /sys/class/gpio/gpio2/value

Je?eli pod??czymy pod t? lini? np. przycisk, to naciskaj?c do mo?na odczyta? jego stan (w??czone lub nie)

Zwolnienie linii

Je?eli nie u?ywamy ju? linii mo?na "odda?" j? systemowi poleceniem

# echo "2" > /sys/class/gpio/unexport

Przy odrobinie umiej?tno?ci mo?na takie linie wykorzysta? do w?asnych potrzeb.

Cze?? linii mo?e by? wykorzystywana przez system i wtedy nale?y wykorzystywa? mechanizmy dost?pne systemowo lub odpowiednio modyfikuj?c kody ?rd?owe zwolni? system od wykorzystywania tych linii.

W przyk?adach za?o?ono, ?e dost?pne s? cztery GPIO o numerach 2,3,4 oraz 5. Dost?pne numery zale?? od konkretnego modelu urz?dzenia; nale?y wi?c polecenia dostosowa? o posiadanego sprz?tu. U?yto tak?e kernela z serii 2.6.

Liczba dost?pnych GPIO: 1

Sterowanie diod?

# echo "2" > /sys/class/gpio/export
# echo out > /sys/class/gpio/gpio2/direction

Sterowanie to:

# echo 1 > /sys/class/gpio/gpio2/value

dla w??czenia linii, oraz

# echo 0 > /sys/class/gpio/gpio2/value

dla wy??czenia linii.

LED

Odczyt przycisku

Ustawiamy lini? i odczytujemy jej warto??

# echo "2" > /sys/class/gpio/export
# echo in > /sys/class/gpio/gpio2/direction
# cat /sys/class/gpio/gpio2/value

Poniewa? nie jest to skojarzone z systemem, to musimy samodzielnie zapewni? odpytywanie linii (nie b?dzie wo?any ?aden skrypt z hotpluga).

Cykliczny odczyt warto?ci mo?emy zrobi? prostym skryptem:

# GPIO=2; while true; do sleep 1; [ $(cat /sys/devices/virtual/gpio/gpio$GPIO/value) = "1" ] && echo -n -|| echo -n _; done

Stan "_" to wci?ni?cie przycisku.

Przycisk

Sterowanie przeka?nikiem

Podobnie jak w poprzednim przyk?adzie, linia wyj?ciowa mo?e s?u?y? do sterowania przeka?nikami czy triakami, a tym samym w??czeniem/wy??czeniem urz?dze? zasilanych z 230V. Przyk?adowe schematy:

schemat 1 schemat 2 schemat 3

Osobi?cie wykona?em urz?dzenie wg schematu pierwszego - dzia?a wy?mienicie. Koszt elementw takiego uk?adu dla jednego kana?u - ok 10z?.

Magistarala 1-Wire

Magistrala 1-Wire jest znana chocia? by z powodu popularnego czujnika temperatury DS1820 - ale oczywi?cie s? te? dost?pne inne czujniki, a tak?e chipy pami?ci czy portw I/O. Zalet? tej magistrali jest u?ycie tylko jednej linii danych.

Aby utworzy? magistral? 1-Wire nale?y zainstalowa? pakiet kmod-w1-gpio-custom

# opkg install kmod-w1 kmod-w1-master-gpio kmod-w1-gpio-custom

Konfiguracja to okre?lenie ktra linia GPIO ma by? wykorzystywana; w tym przyk?adnie to GPIO2, wiec wygl?da to w nast?puj?cy sposb:

# insmod w1-gpio-custom bus0=0,2,0

Oczywi?cie mo?na upro?ci? sobie spraw? wprowadzaj?c ten parametr na sta?e

# echo "w1-gpio-custom bus0=0,2,0" > /etc/modules.d/59-w1-gpio-custom

Nale?y pami?ta? ?e linie gpio s? bezpo?rednio wprowadzone do uk?adw SoC, w zwi?zku z tym wyprowadzenie ich na zewn?trz i pod??czenie d?ugim kablem bez ?adnych zabezpiecze? jest raczej z?ym pomys?em. Nale?y tak?e pami?ta? ?e napi?cie z routera to 3,3v, niektre uk?adu mog? wymaga? zasilania z 5V.

Jako przyk?ad mo?na poda? w?a?nie odczyt temperatury z chipu DS1820. Nale?y zainstalowa? pakiet kmod-w1-slave-therm

# opkg install kmod-w1-slave-therm

A nast?pnie odczyta? warto?? z czujnika. Dane zawarte s? w podkatalogu /sys/bus/w1/drivers/w1_slave_driver/numer_seryjny_czujnika. Czujnikw mo?e by? kilka i nale?y jest po??czy? rwnolegle. Odczyt warto?ci to:

# cat /sys/bus/w1/drivers/w1_slave_driver/*/w1_slave

W tym przypadku by? to wynik

7c 01 4b 46 7f ff 04 10 09 : crc=09 YES
7c 01 4b 46 7f ff 04 10 09 t=23750

Wa?n? dan? jest warto?? CRC (YES) wskazuj?cy poprawno?? odczytu. Temperatura to warto?? t=, jej odczyt w postaci czytelnej dla cz?owieka to:

# awk -F= '/t=/ {printf "%.02f\n", $2/1000}' /sys/bus/w1/drivers/w1_slave_driver/*/w1_slave

1-Wire

Liczba dost?pnych GPIO: 2

Magistrala i2c

Podobnie jak w poprzednim przypadku wymagane jest zainstalowanie modu?u kmod-i2c-gpio-custom

# opkg install kmod-i2c-gpio-custom

Konfiguracja to za?adowanie modu?u z odpowiednimi opcjami:

# insmod i2c-gpio-custom.ko bus0=0,2,3

lub

# echo "i2c-gpio-custom bus0=0,2,3" > /etc/modules.d/i2c-gpio-custom

Je?eli zosta?o to wykonane, mo?na ju? odczyta? warto?ci z rejestrw pod??czonego chipu (w tym przypadku by? to LM75)

# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# i2cget 0 0x48 0 w
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will read from device file /dev/i2c-0, chip address 0x48, data address
0x00, using read word data.
Continue? [Y/n]
0x0016

Nale?y teraz zdekodowa? tylko t? warto?? (zgodnie z wymaganiami danego chipu).

Nale?y tak?e pami?ta? ?e napi?cie z routera to 3,3v, niektre chipy mog? wymaga? zasilania z 5V.

I2C

Liczba dost?pnych GPIO: 4

SDMOD

Jeden z najpopularniejszych sposobw wykorzystania linii - SDMOD, czyli dodanie karty SD do systemu. Pozwala?o to uzyska? dodatkow? przestrze? na dane i programy w czasach, kiedy routery z portem USB nie by?y dost?pne.

Do obs?ugi niezb?dne s? pakiety kmod-mmc-over-gpio z zale?no?ciami oraz obs?uga systemu plikw, np. vfat.

# opkg install kmod-mmc-over-gpio kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1

Konfiguracja zawarta jest w pliku /etc/config/mmc_over_gpio. W zale?no?ci od sposobu pod??czenia nale?y umie?ci? tam odpowiednie warto?ci, np.

# uci set mmc_over_gpio.@mmc_over_gpio[0].enabled=1
# uci set mmc_over_gpio.@mmc_over_gpio[0].DI_pin=3
# uci set mmc_over_gpio.@mmc_over_gpio[0].DO_pin=5
# uci set mmc_over_gpio.@mmc_over_gpio[0].CLK_pin=4
# uci set mmc_over_gpio.@mmc_over_gpio[0].CS_pin=2
# uci commit mmc_over_gpio

Przy takim po??czeniu

Karta SD router

9
1 CS GPIO 2
2 DI GPIO 3
3 GND GND
4 VDD +3,3v
5 CLK GPIO 4
6 GND GND
7 DO GPIO 5
8

Uruchomienie to

# /etc/init.d/mmc_over_gpio start

Je?eli zosta?o to poprawnie pod??czone to w logach powinna pojawi? si? informacja typu:

mmc_spi spi0.0: ASSUMING 3.2-3.4 V slot power
mmc_spi spi0.0: SD/MMC host mmc0, no DMA, no WP, no poweroff
gpio-mmc: MMC-Card "mmc" attached to GPIO pins di=3, do=5, clk=4, cs=2
mmc_spi spi0.0: can't change chip-select polarity
mmcblk0: mmc0:0000 SD 1960448KiB
mmcblk0: p1

Zostaje jeszcze tylko zamontowanie systemu plikw (lub wykona si? do automatyczne je?eli zosta? zainstalowany pakiet block-hotplug)

# mkdir -p /mnt/sd
# mount -t vfat /dev/mmcblk0p1 /mnt/sd

W wi?kszo?ci przypadkw (magistrala 1-Wire, i2c, a tak?e sterowanie prze??cznikami) dost?pne s? tak?e gotowe modu?y na USB (do kupienia np. na allegro), ktre umo?liwiaj? realizacj? podobnych tematw.

W?tek na forum: http://openrouter.info/forum/viewtopic.php?f=19&t=539

 
Share
designed by digi-led.pl
góra
...Copyright © 2010-2013, Ekipa openrouter.info