Kök olmadan GPIO pinlerine erişin. / Dev / mem dosyasına erişim yok. Kök olarak koşmayı deneyin!


34

RPi.GPIO kütüphanesini kullanarak bir python betiği hazırladım. Kök olmadan çalıştırmam gerekiyor, ancak "python ./script.py" ile çalıştırırken bu hatayı alıyorum:

No access to /dev/mem. Try running as root!

Artık kütüphanenin en son sürümüyle birlikte kök gerekmeyen birçok yerde okudum ancak güncellemeden sonra hala hata alıyorum. Sahip olduğum sürüm RPi.GPIO 0.6.0a3

İşte 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)

Ve tam hata:

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!

Kök olarak çalıştırdığımda çalışıyor.


sudo adduser my_new_user gpio doğrudur, ancak grup üyeliğinin güncellenmesi aktif olmak için tekrar oturum açmayı gerektirdiğinden dolayı oturumu kapatıp tekrar açmayı unutmayın.
Blindfreddy

Yanıtlar:


49

RPi.GPIO'yu root olmayan bir kullanıcı olarak kullanmak için Raspbian kullanıyor olmanız gerekiyor, muhtemelen jessie olması da gerekiyor.

Does /dev/gpiomemvar? Öyleyse, RPi.GPIO, GPIO'ya erişmek için bu cihazı kullanmalıdır. Eğer /dev/gpiomemyoksa, deneyin:

sudo rpi-update

Son zamanlarda bir çekirdek kullandığınızdan emin olmak için

sudo apt-get update
sudo apt-get upgrade

Son bir RPI.GPIO kullandığınızdan emin olmak için.

Ayrıca gpiogrubun bir üyesi olduğunuzdan emin olmanız gerekir :

sudo adduser pi gpio

EKLENMİŞ

Raspbian sistemi bir akış halinde görünüyor. Bir Raspbian veya (daha büyük olasılıkla) bir raspberrypi.org sorunu olup olmadığından emin değilim.

/ Dev / gpiomem'in doğru izinlere sahip olduğunu kontrol edin.

$ ls -l /dev/gpiomem
crw-rw---- 1 root gpio 244, 0 Dec 28 22:51 /dev/gpiomem

Daha sonra doğru izinleri aşağıdaki gibi ayarlamazsa

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem

4
Hala çalışmıyor. Her şey güncellendi, / dev / gpiomem var ve kullanıcıyı gpio grubuna eklemeye çalıştığımda zaten bir üye olduğunu söylüyor
JoeyCK

3
@JoeyCK: Grup üyeliğini değiştirmenin zaten çalışmakta olan işlemleri etkilemediğini unutmayın. idKabuğunuzun mevcut gruplarını listelemek için çalıştırın ve gpiolistelenmemişse tekrar oturum açın veya yeniden başlatın .
3'te

@JoeyCK Hangi sürüm RPi.GPIO tarafından rapor edildi?
joan

@joan sürüm 0.5.11
JoeyCK

1
@mjwittering Raspbian her zaman Pi'de daha iyi desteklenecek. Ubuntu'yu tercih ederseniz, değişiklikleri her açılışta uygulamanız gerekecektir. Otomatik olarak bir önyükleme komut dosyası veya bir crontab bir yeniden başlatma girişi ile yapabilirsiniz.
joan

7

Bu sorunu hemen yaşadım ve sadece bununla çözdüm:

sudo adduser my_new_user gpio

Bununla, "my_new_user" kullanıcısı gpio grubuna eklenir, böylece gpio grubundaki tüm kullanıcılar GPIO pinlerine erişebilir.


1
/ Dev / gpiomem (değil / dev / mem).
joan

her ikisi de, eğer /
dev'i araştırırsanız

1
Hayır. Gpio grubunun bir üyesinin / dev / mem dosyasına erişimi yoktur.
joan

sağ,
kmem

2
Tamam, ama mesele GPIO'ya güvenli, köksüz erişim sağlamak. Kullanıcıları kmem grubuna eklemek güvenli değildir ve GPIO'ya erişim vermez.
joan

5

Buna cevap verebilirim.

sudo chown root.gpio /dev/mem

Bu kullanıcı ve grup değiştirir /dev/memiçin rootve gpiosırasıyla.

sudo chmod g+rw /dev/mem

daha sonra gruba bu /dev/memnesneye okuma yazma izni verir .

/dev/memNesne temelde sistemde tüm hafıza alanıdır. Bu, artık grubun gpiove içindeki herkesin bellek alanını okuyabildiği ve yazabildiği anlamına gelir .

Şimdi, bellek alanında CPU kayıtları da dahil olmak üzere birçok şey var. GPIO pinlerini değiştirdiğinizde, bu kayıtlardan birinde biraz değişiyorsunuz. Kicker, doğru yaptığınızdan emin olmanız gerekir, aksi takdirde sisteminizde kötü şeyler olabilir.

Tüm hafıza alanını korumaya yardımcı olmak için, sadece GPIO ile çalışmamız gereken hafıza parçalarının eşlendiği güçler /dev/gpiomem. Bu aslında hafıza alanının geri kalanını erişime karşı korur / korur ve sadece GPIO bitlerine erişime izin verir. Bu, GPIO belleğine erişime izin verir ve şu anda başka programlar tarafından kullanılmakta olan bellek gibi, belleğin diğer bölümlerine izin vermez.

Aslında bu, GPIO öğelerine ve ayrıca belleğin geri kalan kısmına erişime izin vermek için hem güvenlik hem de sistem kararlılığı korumalarında bir delik açar, ancak yalnızca Pi'nin üyesi olduğu GPIO grubundaki kullanıcılar için.

Gelecekte, bcm2835kütüphane gibi sürücüler wiringPidaha fazla güncellenecek (bazı güncellemeler zaten oluyor) ve bu araçların üzerine inşa edilmiş olan uygulamalar daha da güncellenecek ve daha sonra gelecekte, bu GPIO sorununu kök olacaktır kaybolmak.

O zamana kadar iki seçeneğiniz olacak, /dev/memgruba gpiookuma / yazma olarak açın veya hepsine tam okuma yazma olan bir root olarak çalıştırın /dev/mem.

Umarım anlamlı olur.

Halen, hala koşmanız gereken bazı konular var root. Örneğin, node-red-contrib-dht-sensorbağlı node-dht-sensorolan, BCM2835'e bağlı olan modülün kullanılması. Bu kullanarak-hatalarını seg /dev/gpiomemya hala bazı hatalar olduğu gibi node-dht-sensorveya /dev/gpiomemveya yolu birlikte çalışıyoruz. Hangisi olduğunu bilmiyorum, ama sonunda işe yarayacak. BCM2835 'root olmayan' /dev/gpiomemolarak çalıştığında ve mevcut olduğunda, /dev/gpiomemyerine onu kullanmaya çalışır /dev/mem, böylece /dev/memgrubun açılması gpioyardımcı olmaz. Aylak.


1

Terminalde aşağıdaki komutu kullanmanız yeterlidir:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem

2
Bu komutun ne yaptığı ve neden Joan'ın cevabından farklı olduğu konusunda bir açıklama yapabilir misiniz ? Arasındaki fark nedir /dev/memve /dev/gpiomem?
Greenonline

Eğer Joan'ın cevabını kullanmak daha iyi olabilir, ancak bunu değiştiremezseniz /dev/mem, sahip olduğunuzla /dev/gpiomemkullanmak için aynı izne /dev/memsahip olacaksınız/dev/gpiomem
Natim

Daha cerrahi bir yaklaşım soruyu cevapladığında, / dev / mem'in tümüne erişim sağlamak güvenli değildir.
Bryce,

1

Yukarıdaki yanıtların hiçbiri tüm adımları içermez. GPIO pinlerine root dışı erişim sağlamak için aşağıdaki adımları tamamlamam gerekiyordu. Yeni bir grup oluşturmak zorunda kaldım, kullanıcımı bu gruba ekledikten sonra izinleri değiştirdim (önceki yazılarda olduğu gibi).

sudo groupadd gpio
sudo usermod -a -G gpio user_name
sudo grep gpio /etc/group
sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem

1

Eğer geany'de inşa ediyorsanız, sadece inşa komutlarını değiştirin.

Derlenecek Java komutları

sudo pi4j --compile "%f"

ve execute komutu

sudo pi4j --run "%e" 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.