XBMC-Kodi.cz

Úplná verze: RPi- ovládání pomocí GPIO tlačítek ? (vyřešeno)
Prohlížíte si holou variantu vašeho obsahu. Prohlédněte si plnou verzi s příslušným formátováním.
Měl bych dotaz, jestli nemá někdo zkušenost s mapováním tlačítek. Mám v plánu vytvořit z RPi radio, které se bude převážně ovládat přes telefon. Rád bych ale k rpi připojil pár tlačítek, kterým bych přiřadil základní funkce jako play, stop, next,  či spuštění konkrétního souboru - streamu. Ideálně kdyby to šlo přes OpenELEC/LibreELEC, případně Raspbian-Kodi. Díky za reakce.
Jelikož to je linux, tak to bude fungovat pod Lirc. poohlédni se po lirc.conf ten bude pravděpodobně ve /storage/.config a po lircmap.xml ve usr/share/xbmc/system u openelec to bude asi ve /storage/.kodi/userdata/. V tvém případě pokud vše funguje tak budeš chtít pouze přemapovat tlačítka, takže tě bude zajímat jen lircmap.xml. Není to žádná věda kdysi jsem si dělal celý ovladač ještě pod MythTV a nedávno upravoval pod Kodi pár tlačítek, takže to je otestované že to maká.
Díky za rady, v Libreelec/Openelec by se mělo nastavení ukládat pod složkou keymaps ( /storage/.kodi/userdata/keymaps ) více zde : http://kodi.wiki/view/Keymaps

Nějak se mi ale nedaří dohledat zda lze k tlačítku přiřadit spuštění konkrétního souboru a ještě by mě zajímalo jestli lze zjistit že dané tlačítko se systémem komunikuje je aktivní např. příkazem ?

Jinak pro mé účely by mohl stačit modul s LCD a tlačítky :

[attachment=1758]
Teď si říkám ty si měl na mysli hardwarové tlačítka? Já pochopil že to místní ovládání pořešíš pomocí IR.

Jsem uživatel používající Passport , který neumí číst pravidla o nepoužívání podpisu z Tapatalku.
jj, uvažoval jsem o HW tlačítkách nebo nějakém modulu. Prozatím hledám informace a pak se rozhodnu pro finální řešení.
No tak tady se musíš rozhodnout zda jít cestou pythonu, bashe. U rasbianu obojí jde jednoduše a u openelec to budeš mít malinko složitější. Podporu pythonu si povolíš jako doplněk a u bashe budeš muset ke GPIO přistupovat malinko neohrabaně. Až budu na PC napíšu sem přímo příklady ať to nemusíš hledat.

Jsem uživatel používající Passport , který neumí číst pravidla o nepoužívání podpisu z Tapatalku.
Takže pokud se vydáš cestou pythonu musíš si aktivovat doplněk RPi.GPIO a pak ve scriptu zavolat knihovnu
Kód:
import sys
sys.path.append('/storage/.kodi/addons/python.RPi.GPIO/lib')
import RPi.GPIO as GPIO

a pak samo sebou říct jaké označení GPIO budeš používat
Když se bude používat číslování hardwarových pinů konektoru, nastaví se příkaz na:
Kód:
GPIO.setmode(GPIO.BOARD)

Pokud se bude používat označení signálů jako v procesoru, nastaví se:

Kód:
GPIO.setmode(GPIO.BCM)

no a pak by si čekal na stisk tlačítka požadovaného pinu s pullup odporem
Kód:
GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print "cekam na stisk tlacitka"
GPIO.wait_for_edge(8, GPIO.FALLING)
print "tlacitko bylo stisknuto"
U raspbianu je vše totožné jen není třeba aktivovat doplněk. Ohledně použití bashe je situace složitější/jednodušší... podle toho jak co komu vyhovuje 6
U openelecu jsem nebyl schopen přistoupit ke GPIO jinak, než přímo/složitě.
Takhle nastavíš pin4 jako výstup a nahodíš ho

Kód:
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
echo "1" > /sys/class/gpio/gpio4/value
pin je pak vhodné pokud ho nepožíváš pustit
Kód:
echo "4" > /sys/class/gpio/unexport
 v případě vstupu
Kód:
echo "4" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio4/direction
a stav si přečteš
Kód:
cat /sys/class/gpio/gpio4/value
V tomhle přístupu ke GPIO jsem nepřišel na způsob aktivace interního pullup odporu. U raspbianu to je lepší, buď opět jde použít stejný přístup ke GPIO, nebo elegantně v případě výstupu dám 0
Kód:
raspi-gpio set 4 op dl
nebo 1
Kód:
raspi-gpio set 4 op dh
stav čteš
Kód:
raspi-gpio get 4
vstup
Kód:
raspi-gpio set 4 ip
s pullup
Kód:
raspi-gpio set 4 ip pu
s pulldown
Kód:
raspi-gpio set 4 ip pd
Osobně radši používám bash, protože je default shell v každém linuxu a na to moje scriptování bohatě dostačující.
Opět díky za užitečné informace, sice ne všem řádkům rozumím, ale časem to snad dám 4 .
Ještě k těm tlačítkům, pokud jsem to správně pochopil není třeba používat odpor externě, ale je možné ho aktivovat přímo na RPi ?

Jestli správně počítám, tak přes GPIO by mělo jít namapovat až 17 tlačítek :
[attachment=1761]
Ano u raspberry lze využít interní odpor. A tlačítek při použití sériové linky můžeš mít kolik chceš. Pokud by si využíval jen GPIO tak zatím používám jen ty zelené, takže jak si psal 17, ale myslím si, že jdou v případě nouze použít i ty ostatní.

Jsem uživatel používající Passport , který neumí číst pravidla o nepoužívání podpisu z Tapatalku.
OK, objednal jsem si testovací sadu, tak jak dorazí hned začnu laborovat.
Ovládání pomocí GPIO tlačítek mám již vyřešeno 82. Nebylo to však na první pokus a musel jsem řešit komplikace se správným formátem příkazu (chyba syntaxe) a další problém byl v limitaci, kdy OpenELEC nebral více jak 20 stisků za minutu 6 .

Než se pustíte do prvního skriptíku, tak je potřeba mít nainstalovaný doplněk RPi.GPIO (je součástí repozitáře OpenELEC/LibreELEC).

Tlačítko jsem zapojil nejednoduším způsobem, to jest pin GPIO (zelený) a GND (černý).

[attachment=1867]

Pro ty co budou začínat je vhodné si vyzkoušet zda tlačítko funguje a je správně zapojeno.
Jako příklad uvedu test tlačítka na OpenELEC zapojeného přes pin č. 7 (hardwarové značení).

Dále už jsem postupoval přes PuTTY:

1. pro pořádek jsem vytvořil složku ve které budu mít skripty uložené:
Kód:
mkdir skript

2. přejdu do složky a vytvořím soubor s názvem test.py
Kód:
cd ./skript
nano test.py

3. a do něj vložit (samozřejmě upravit podle použitého pinu)
Kód:
import sys
sys.path.append('/storage/.kodi/addons/python.RPi.GPIO/lib')
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print "cekam na stisk tlacitka"
GPIO.wait_for_edge(7, GPIO.FALLING)
print "tlacitko bylo stisknuto"

4. nyní si skript spustíme
Kód:
python test.py

5. v případě že máme správně zapojeno a zapsáno, dostaneme po stisknutí :
Kód:
tlacitko bylo stisknuto


Takto jednoduše si otestujeme jakékoliv tlačítko zapojené do GPIO.

Z předchozího víme že nám tlačítko funguje, takže zbývá zadat co se má stát po jeho stisknutí.
Při brouzdání po netu jsem objevil seznam vestavěných funkcí, díky kterým můžu mapovat dle libosti. Pomocí tohoto seznamu plně nahradím Keymap editor + další, např. probuzení CEC, vyčištění knihovny, vysunutí /zasunutí mechaniky, spuštění konkrétního streamu/videa, otevření vybraného doplňku ...

Kompletní seznam najdete zde: http://kodi.wiki/view/list_of_built-in_functions

Pro názornost uvedu příklad, kdy budu chtít "namapovat" tlačítka připojené k pinu č. 29, 31, 33, 35, 37 a přiřadím jim funkce: pohyb vlevo, pohyb vpravo, restart, spuštění spořiče a spuštění doplňku Sosáč.

Kód:
import sys
sys.path.append('/storage/.kodi/addons/python.RPi.GPIO/lib')  #cesta ke GPIO knihovne
import RPi.GPIO as GPIO  #importuji GPIO knihovnu
import time  #importuji time knihovnu pro casovaci instrukce
import os  #mimo jiné potřeba pro zadavani prikazu, v nasem pripade funkci
GPIO.setmode(GPIO.BOARD)  #pouzije se HW označení pinu

#nastaveni konkretnich pinu a pripojeni vnitrniho Pull-Up odporu(integrovan na RPi)
GPIO.setup(29, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(31, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(33, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(35, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(37, GPIO.IN, pull_up_down = GPIO.PUD_UP)

while True:  #vytvoreni nekonecne smycky, ktera neustale kontroluje, zda bylo tlacitko stisknuto
  if not ( GPIO.input(29)):  #po stisknuti tlacitka ...
      os.system('kodi-send --action="Action(left)"')  #...se spusti tento prikaz(pohyb vlevo)
  time.sleep(1)  # odruseni zakmitů při rozpínání tlacitka po dobu 1s
  if not (GPIO.input(31)):
      os.system('kodi-send --action="Action(right)"')  #pohyb vpravo
  time.sleep(1)
  if not (GPIO.input(33)):
       os.system('kodi-send --action="Reboot"')  #restart
   time.sleep(1)
  if not (GPIO.input(35)):
       os.system('kodi-send --action="ActivateScreensaver"')  #sporic obrazovky
   time.sleep(1)
  if not (GPIO.input(37)):
       os.system('kodi-send --action="RunAddon(plugin.video.sosac.ph)"')  #sposteni doplnku Sosac
   time.sleep(1)

aby se nám skript spustil automaticky po zapnutí  RPi je potřeba vytvořit soubor autostart.sh (/storage/.config/autostart.sh) a vložit do něj:

Kód:
python /storage/skript/test2.py &

samozřejmě cestu a název skriptu si upravíte podle svého.

Prozatím by to mohlo stačit , snažil jsem se popisovat celkem podrobně, aby se chytli i začínající uživatelé jako já 4 .
No vida a nějaké foto rádia nebude? Jinak jsem jen tak okrajově testnul nezelené GPIO konkrétně 2 a 3. Použitelné jsou, jen tyhle dva jsou po zapojení raspberry pod napětím a shodil jsem je až ve scriptu. Zajímavá vlastnost, která se může někdy hodit.

Jsem uživatel používající Passport , který neumí číst pravidla o nepoužívání podpisu z Tapatalku.
Zatím žádné není, takže není co fotit  6 . Přestavbu chci řešit až nahradím současné RPi 2, každopádně už vím jak na to. Ještě pořeším nějakej informační displej, zatím nejsem pevně rozhodnut, ale dnes dorazil první kandidát (HD44780), tak uvidím co z něj zítra vykouzlím...