Zrobiłem skrypt Pythona przy użyciu biblioteki RPi.GPIO. Muszę uruchomić go bez roota, ale pojawia się ten błąd podczas uruchamiania go z „python ./script.py”:
No access to /dev/mem. Try running as root!
Przeczytałem w wielu miejscach, że nie potrzebujesz już roota z najnowszą wersją biblioteki, ale nadal pojawia się błąd po aktualizacji. Moja wersja to RPi.GPIO 0.6.0a3
Oto kod:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18,GPIO.OUT)
print "LED on"
GPIO.output(18,GPIO.HIGH)
time.sleep(1)
print "LED off"
GPIO.output(18,GPIO.LOW)
I pełny błąd:
pi@raspberrypi ~/Desktop/python $ python ./sensors.py
Traceback (most recent call last):
File "./sensors.py", line 5, in <module>
GPIO.setup(18,GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
Kiedy uruchamiam go jako root, działa.
Odpowiedzi:
Prawdopodobnie musisz uruchomić Raspbian, aby używać RPi.GPIO jako użytkownik inny niż root, być może musi to być również jessie.
Czy
/dev/gpiomem
istnieje Jeśli tak, RPi.GPIO powinno użyć tego urządzenia do uzyskania dostępu do GPIO. Jeśli/dev/gpiomem
nie istnieje, spróbuj:aby upewnić się, że używasz najnowszego jądra, i
aby upewnić się, że korzystasz z najnowszego RPi.GPIO.
Musisz także upewnić się, że jesteś członkiem
gpio
grupy:ZMIENIONO DO DODANIA
System Raspbian wydaje się być w stanie ciągłego przepływu. Nie jestem pewien, czy jest to problem Raspbian, czy (bardziej prawdopodobne) problem raspberrypi.org.
Sprawdź, czy / dev / gpiomem ma odpowiednie uprawnienia.
Jeśli nie, ustaw odpowiednie uprawnienia w następujący sposób
źródło
id
aby wyświetlić listę bieżących grup powłoki, a jeśligpio
nie ma jej na liście, zaloguj się ponownie lub uruchom ponownie.Miałem ten problem od razu i rozwiązałem właśnie to:
Dzięki temu użytkownik „my_new_user” zostaje dodany do grupy gpio, więc wszyscy użytkownicy w grupie gpio mogą uzyskać dostęp do pinów GPIO.
źródło
Mogę na to odpowiedzieć.
Zmienia to odpowiednio właściciela i grupę
/dev/mem
naroot
igpio
.następnie daje grupie prawo odczytu do zapisu dla tego
/dev/mem
obiektu./dev/mem
Obiekt jest w zasadzie cała przestrzeń pamięci w systemie. Oznacza to, że teraz grupagpio
i wszyscy w niej mogą czytać i zapisywać w pamięci.Teraz w przestrzeni pamięci jest wiele rzeczy, w tym rejestry procesora. Kiedy przełączasz piny GPIO, zmieniasz nieco w jednym z tych rejestrów. Kicker polega na tym, że musisz upewnić się, że robisz to poprawnie, inaczej złe rzeczy mogą przytrafić się Twojemu systemowi.
Aby pomóc chronić całą przestrzeń pamięci, moce, które są mapowane tylko na części pamięci, do których musimy pracować z bitami GPIO
/dev/gpiomem
. To w efekcie maskuje / chroni pozostałą część pamięci przed dostępem i pozwala tylko na dostęp do bitów GPIO. Umożliwia to dostęp do adresów pamięci GPIO i uniemożliwia wszelkie inne części pamięci, takie jak pamięć używana obecnie przez inne programy.W efekcie powoduje to lukę zarówno w zabezpieczeniach, jak i zabezpieczeniach stabilności systemu, aby umożliwić dostęp do rzeczy GPIO, a także reszty pamięci, ale tylko dla użytkowników w grupie GPIO, której członkiem jest Pi.
W przyszłości sterowniki, takie jak
bcm2835
biblioteka,wiringPi
zostaną zaktualizowane w większym stopniu (niektóre aktualizacje już się odbywają), a aplikacje zbudowane na tych narzędziach będą dalej aktualizowane, a następnie w przyszłości, mam nadzieję, że wszystkie te problemy GPIO będą kłopotliwe z rootowaniem znikać.Do tego czasu masz dwie możliwości: otwórz
/dev/mem
grupęgpio
jako odczyt / zapis lub uruchom jako root, który ma pełny odczyt zapisu do wszystkich/dev/mem
.Mam nadzieję, że to ma sens.
Obecnie nadal istnieje wiele problemów, w których nadal musisz działać jako
root
. Na przykład za pomocąnode-red-contrib-dht-sensor
modułu, który zależy odnode-dht-sensor
, który zależy od BCM2835. To SEG-usterek przy użyciu/dev/gpiomem
jak to ma pewne błędy ciągle albo wnode-dht-sensor
lub w/dev/gpiomem
lub sposób ich współpracy. Nie wiem, co się dzieje, ale w końcu to się rozwiąże. Gdy BCM2835 działa jako „inny niż root” i/dev/gpiomem
istnieje, próbuje użyć/dev/gpiomem
zamiast/dev/mem
, więc otwarcie/dev/mem
grupygpio
nie pomaga. Bummer.źródło
Wystarczy użyć następującego polecenia w terminalu:
źródło
/dev/mem
i/dev/gpiomem
?/dev/mem
, aby/dev/gpiomem
to dostanie to samo uprawnienie do używania/dev/mem
, że masz z/dev/gpiomem
Żadna z powyższych odpowiedzi nie obejmuje wszystkich kroków. Musiałem wykonać następujące kroki, aby uzyskać dostęp użytkownika innego niż root do styków GPIO. Musiałem utworzyć nową grupę, dodać mojego użytkownika do tej grupy, a następnie zmienić uprawnienia (jak w poprzednich postach).
źródło
Jeśli budujesz w geany, po prostu zmień polecenia kompilacji.
Polecenia Java do kompilacji powinny być
i polecenie wykonania powinno być
źródło