RPi opencv + GPIO root jog probléma

 ( makgab | 2015. március 31., kedd - 10:23 )

Üdv!

Adott egy teszt Qt app: opencv + GPIO (a GPIO-t wiringPi-vel használnám).
Raspbian-on az opencv csak sima userként megy (root-ként nem) - mivel az X root-ként nem elérhető, ez ok. A GPIO/wiringPi viszont meg csak root-ként megy rendesen:

// root-ként inicializál:
wiringPiSetup();

// nem root-ként inicializál:
wiringPiSetupSys();

A második esetben (azaz a wiringPiSetupSys() inicializálásakor) a GPIO gombokat nem kezeli a rendszer, nem érzékeli a GPIO gombnyomást. Ezt írja is a doksija:
http://wiringpi.com/reference/setup/

Mivel lehetne ezt az apró problémát áthidalni? Azaz sima userként szeretném a GPIO gombokat (állapotukat) elérni.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

To use it as an ordinary user without being root, or using sudo … You need to use the Sys interface. This uses the system provided mechanism that exists in the /sys/class/gpio heirarchy.

So.. The first thing to do is work out what pins you are using (and note that all pin numbers in this mode use the BCM_GPIO numbering scheme), then you use the gpio command to “export” the pins. So if you want to use pin 17 for an input and 18 for an output, run the following command:

gpio export 17 in
gpio export 18 out

That will export the pins, and change ownership of the special files so your program can use them.

Next, you make sure your program initialises wiringPi as follows:

x = wiringPiSetupSys () ;

after that, you can use digitalWrite () and digitalRead () as before, but do note that many things are not supported in Sys mode – changing a pins direction, using the internal pull up/down resistors (althoug hyou can set them using the gpio program).

Let me know if that helps.

-Gordon

Lehet, hogy rosszul értem a fentieket, de nálam ez volt pl.:

* ~# gpio export 18 in
* ~# gpio -g mode 18 up

* Ezek után az app-ban wiringPiSetupSys() után a digitalRead() fv. nem tudja olvasni a GPIO (18) állapotát.

Tehát hiába állítottam a gpio-val a 18-as pin-t, nem működött a digitalRead() fv (mindig 0 érték jött vissza)! Tehát a wiringPiSetup() fv-t kell használnom.
Ha az app-ra adok setuid jogot, akkor működik a dolog (wiringPiSetup()). Egyébként nem.

Google://linux gpio permissions

Illetve udev a barátod.

Kettő megoldás is létezik a problémára:
a) rootként is elérhető legyen az X (xauth a barátod, nálam pl. Gentoon ez alapból megy, tennem sem kellett érte)
b) a device legyen elérhető userként (itt meg az udev rules lesz a megfejtés)

A legtrivialisabb megoldas, hogy osszedobsz egy agent daemont, unix socketen fogadja a parancsokat, adatot ir/olvas, az eredmenyt unix socketen visszaadja.
--
Blog | @hron84
Üzemeltető macik

Na ne. Ezt inkább ne. Bonyolítsuk el az egészet egy UNIX domain socketes bohóckodással, aztán kezelhetjük annak az összes hibáját, latencyjét, whatever. Gondolkodjál már egy kicsit.

(Hint: megoldás fentebb már le lett írva: pl. udev)

Nekem az udev-vel az a bajom, hogy... kb. minden. Nem tudni pl., hogy a systemd mikor fogja atvenni az uralmat annyira, hogy beleeroszakoljak a beagyazott cuccokba is, aztan lehet kidobni az udev szabalyokat az ablakon... Na jo, kicsit tobb komolysaggal: az a tipp, hogy nem veletlen root-only a GPIO.

Adott esetben egyebkent ki lehet pakolni az agentbe egy csomo business logikat is, es az X-es cucc inkabb affele GUI frontendkent szolgal, semmint valodi, munkavegzo cuccnak. Elso lepes a webmanagement fele :-)
--
Blog | @hron84
Üzemeltető macik

Egyrészt létezik mdev is, és akkor hagyhatod a systemd-t. Másrészt persze, hogy root a GPIO, hiszen pl. egy PC-ben is vannak GPIO perifériák. Harmadrészt viszont van group kezelés, ezzel finomhangolható a történet, ha szeretnéd.

Bocsi, nem leszólni szeretnélek (nagyon :-)).

Szerk: ha meg még az mdevvel is bajod van: https://www.kernel.org/doc/pending/hotplug.txt

Hu, mindketto nagyon izgalmas dolog, meg egyikrol se hallottam. Egyebkent szerintem az mdev sokkal jobban megfelel az embedded cuccok kivanalmainak, ott nem olyan suru a hotplug, mint mondjuk egy PC-nel.
--
Blog | @hron84
Üzemeltető macik