Wpis z mikrobloga

Zaczynam zabawę z #bananapi i ogólnie wszystko fajnie, ale użeram się jeszcze z pinami. Mam przygotowaną przez kogoś
innego obudowę i działający sprzęt (nie znam konkretnych połączeń).
Poczytałem w necie i znalazłem sobie bibliotekę WiringPi/WiringBP. Metodą prób i błędów wszystko działa na niej super. Mam pin 0 i 2 gdzie mam podpięte diody - i da się je ustawić przez: gpio set 2 1
Mam przycisk na pinie 3, który mogę odczytać przez gpio read 3.

# gpio readall
+----------+-Rev3-+------+--------+------+-------+
| wiringPi | GPIO | Phys | Name | Mode | Value |
+----------+------+------+--------+------+-------+
| 0 | 17 | 11 | GPIO 0 | OUT | Low |
| 1 | 18 | 12 | GPIO 1 | IN | Low |
| 2 | 27 | 13 | GPIO 2 | OUT | Low |
| 3 | 22 | 15 | GPIO 3 | IN | High |
| 4 | 23 | 16 | GPIO 4 | IN | Low |
| 5 | 24 | 18 | GPIO 5 | IN | Low |
| 6 | 25 | 22 | GPIO 6 | IN | Low |
| 7 | 4 | 7 | GPIO 7 | IN | Low |

Tylko teraz chciałbym się dostać cyklicznie do przycisku. Np. wywołać skrypt kiedy ktoś naciśnie, lub zwolni przycisk. Odpalenie skryptu w stylu "petla-czytaPrzezWiring-sprawdzaj-sleep_sekunda" nie wchodzi w grę, bo zżera 30% procesora w trybie ciągłym.

Do głowy przyszedł pomysł z inotify-wait. Spróbowałem więc wyeksportować piny: 3, 22, 15 (w sumie nie wiem który mam wyeksportować?), ustawiłem im direction na "in". Tylko, że nic nie reaguje. Wyeksportwałem brutalnie w pętli piny od 0 do 32, to samo z direction i potem odczyt wszystkich (/sys/class/gpio/xyz) - zero reakcji na cokolwiek.
Co ciekawe, w odczycie "brutalnym" zmieniają mi się losowo jakieś dwa piny (chyba RX i TX). W odczycie przez WiringPI readall nic takiego nie ma miejsca - wszystkie piny są stabilne i reaguje TYLKO na przycisk.
Może mi ktoś powiedzieć o co tu chodzi, albo co robię źle? Odnoszę wrażenie, że mam jakieś 2 zestawy pinów, które jedne widzę przez WiringPi, a drugie przez /sys/class/gpio.

Ewentualnie zawołam jeszcze #linux, bo może ktoś ma pomysł, jak zmniejszyć obciążenie skryptu inaczej niż przez ionotify.

#bananapi #raspberrypi
  • 2
@RRybak: jako kuc linuksowiec embedded to znam na taki problem kilka rozwiązań:

1. [trudne ale porządne] żeby było jak Pan Jezus powiedział to bym edytował device-tree i podpiął do gpio sterownik gpio-keys. W systemie pojawiłoby się nowe urządzenie w /dev/input z którego da się czytać eventy:
Tu jak to robić w C
https://askubuntu.com/questions/826719/decoding-key-values-from-dev-input-eventx-in-c
Tu w pytągu
https://thehackerdiary.wordpress.com/2017/04/21/exploring-devinput-1/

Jak dodać overlay do device tree:
http://blog.gegg.us/2017/01/setting-up-a-gpio-button-keyboard-on-a-raspberry-pi/

2. [łatwiejsze] tak jak poprzednik napisał wykorzystać