Akses pin GPIO tanpa root. Tidak ada akses ke / dev / mem. Coba jalankan sebagai root!

34

Saya telah membuat skrip python menggunakan perpustakaan RPi.GPIO. Saya perlu menjalankannya tanpa root tetapi saya mendapatkan kesalahan ini ketika menjalankannya dengan "python ./script.py":

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

Saya telah membaca di banyak tempat bahwa Anda tidak perlu lagi melakukan root dengan versi terbaru dari pustaka tetapi saya masih mendapatkan kesalahan setelah memperbarui. Versi yang saya miliki adalah RPi.GPIO 0.6.0a3

Ini kodenya:

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)

Dan kesalahan penuh:

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!

Ketika saya menjalankannya sebagai root berfungsi.

JoeyCK
sumber
sudo adduser my_new_user gpio benar tetapi ingat untuk logout dan kembali karena memperbarui keanggotaan grup memerlukan login ulang untuk menjadi aktif.
Blindfreddy

Jawaban:

49

Anda mungkin perlu menjalankan Raspbian untuk menggunakan RPi.GPIO sebagai pengguna non-root, mungkin juga perlu jessie.

Apakah /dev/gpiomemada Jika demikian, RPi.GPIO harus menggunakan perangkat ini untuk mengakses GPIO. Jika /dev/gpiomemtidak ada coba:

sudo rpi-update

untuk memastikan Anda menggunakan kernel terbaru, dan

sudo apt-get update
sudo apt-get upgrade

untuk memastikan Anda menggunakan RPi.GPIO terbaru.

Anda juga perlu memastikan bahwa Anda adalah anggota gpiogrup:

sudo adduser pi gpio

DIedit UNTUK MENAMBAH

Sistem Raspbian tampaknya dalam keadaan fluks. Saya tidak yakin apakah itu Raspbian atau (lebih mungkin) masalah raspberrypi.org.

Periksa / dev / gpiomem memiliki izin yang benar.

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

Jika tidak maka atur izin yang benar sebagai berikut

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem
joan
sumber
4
Masih tidak bekerja. Semuanya diperbarui, / dev / gpiomem ada dan ketika saya mencoba untuk menambahkan pengguna ke grup gpio ia mengatakan itu sudah menjadi anggota
JoeyCK
3
@ JoeyCK: perhatikan bahwa mengubah keanggotaan grup tidak memengaruhi proses yang sudah berjalan. Jalankan iduntuk mendaftar grup shell Anda saat ini, dan jika gpiotidak terdaftar, login lagi, atau reboot.
deltab
@ JoeyCK Versi apa yang dilaporkan oleh RPi.GPIO?
joan
@ joan versi 0.5.11
JoeyCK
1
@mjwittering Raspbian akan selalu lebih baik didukung di Pi. Jika Anda lebih suka Ubuntu Anda harus menerapkan perubahan setiap boot. Anda dapat melakukannya secara otomatis dengan skrip boot atau entri reboot di crontab.
joan
7

Saya memiliki masalah ini segera dan diselesaikan hanya dengan ini:

sudo adduser my_new_user gpio

Dengan ini, pengguna "my_new_user" ditambahkan ke grup gpio, jadi, semua pengguna dalam grup gpio dapat mengakses pin GPIO.

Иван Андреевич Черногоров
sumber
1
Maksud Anda / dev / gpiomem (bukan / dev / mem).
joan
keduanya sebenarnya, jika Anda melihat / dev Anda akan melihat bahwa kedua perangkat ada, dan topik pertanyaannya adalah tentang / dev / mem
Иван Андреевич Черногоров
1
Tidak. Seorang anggota grup gpio tidak memiliki akses ke / dev / mem.
joan
benar, anggota kmem tidak, solusinya simmilar
Иван Андреевич Черногоров
2
Oke, tapi intinya adalah memberikan akses yang aman, tidak dapat ditembus, ke GPIO. Menambahkan pengguna ke grup kmem tidak aman, dan tidak akan memberikan akses ke GPIO.
joan
5

Saya bisa menjawab ini.

sudo chown root.gpio /dev/mem

Ini mengubah pemilik dan grup /dev/memmenjadi rootdan gpiomasing - masing.

sudo chmod g+rw /dev/mem

kemudian berikan grup akses tulis baca untuk ini /dev/mem objek .

Itu /dev/mem objek pada dasarnya adalah seluruh ruang memori pada sistem. Ini berarti bahwa sekarang grup gpio, dan semua orang di dalamnya, dapat membaca dan menulis ke ruang memori.

Sekarang, di ruang memori ada banyak hal, termasuk register CPU. Saat Anda mengaktifkan pin GPIO, Anda mengubah sedikit di salah satu register ini. Kicker adalah, Anda harus yakin Anda melakukannya dengan benar atau hal-hal buruk dapat terjadi pada sistem Anda.

Untuk membantu melindungi seluruh ruang memori, kekuatan yang dipetakan hanya bagian memori yang kita perlukan untuk bekerja dengan bit GPIO untuk /dev/gpiomem . Ini pada dasarnya menutupi / melindungi sisa ruang memori dari akses dan hanya memungkinkan bit GPIO diakses. Ini memungkinkan akses ke alamat memori GPIO dan melarang semua bagian lain dari memori, seperti memori yang saat ini digunakan oleh program lain.

Akibatnya, ini membuat lubang pada perlindungan keamanan dan stabilitas sistem untuk memungkinkan akses ke hal-hal GPIO, serta sisa memori, tetapi hanya untuk pengguna dalam grup GPIO, yang menjadi anggota Pi.

Di masa depan, driver seperti bcm2835perpustakaan danwiringPi akan diperbarui lebih (beberapa pembaruan sudah terjadi) dan aplikasi yang dibangun di atas alat-alat tersebut akan diperbarui lebih lanjut dan kemudian di masa depan, semoga semua kerumitan GPIO ini sebagai root akan menghilang.

Sampai saat itu Anda memiliki dua pilihan, buka /dev/memgrup untuk gpiomembaca / menulis, atau jalankan sebagai root, yang memiliki baca tulis penuh untuk semua /dev/mem.

Harapan itu masuk akal.

Saat ini masih ada beberapa masalah di mana Anda masih perlu menjalankannya root. Misalnya, menggunakan node-red-contrib-dht-sensormodul, yang tergantung pada node-dht-sensor, yang tergantung pada BCM2835. Ini kesalahan menggunakan /dev/gpiomemkarena memiliki beberapa bug masih dalam node-dht-sensoratau di /dev/gpiomematau cara mereka bekerja bersama. Saya tidak tahu yang mana masalahnya, tetapi akhirnya akan berhasil. Ketika BCM2835 berjalan sebagai 'non-root' dan /dev/gpiomemada, ia mencoba untuk digunakan /dev/gpiomemalih-alih /dev/mem, jadi membuka /dev/memgrup to gpiotidak membantu. Gelandangan.

Karl Easterly
sumber
1

Cukup gunakan perintah berikut di terminal:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
harkirat1892
sumber
2
Bisakah Anda memberikan penjelasan tentang apa yang dilakukan perintah ini, dan mengapa itu berbeda dari jawaban joan ? Apa perbedaan antara /dev/memdan /dev/gpiomem?
Greenonline
Jika Anda dapat lebih baik untuk menggunakan jawaban Joan, namun jika Anda tidak dapat mengubah /dev/memuntuk /dev/gpiomemini akan membuat Anda mendapatkan izin yang sama untuk penggunaan /dev/memyang Anda miliki dengan/dev/gpiomem
Natim
Tidak aman untuk menawarkan akses ke semua / dev / mem, ketika pendekatan yang lebih bedah menjawab pertanyaan.
Bryce
1

Tidak ada balasan di atas yang mencakup semua langkah. Saya perlu menyelesaikan langkah-langkah berikut untuk mendapatkan akses non-root ke pin GPIO. Saya harus membuat grup baru, tambahkan pengguna saya ke grup ini kemudian ubah izin (seperti pada posting sebelumnya).

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
Mark Tyers
sumber
1

Jika Anda sedang membangun di geany, ubah saja perintah build.

Perintah Java untuk dikompilasi seharusnya

sudo pi4j --compile "%f"

dan perintah eksekusi seharusnya

sudo pi4j --run "%e" 
Francesca Bannister
sumber