बिना रूट के GPIO पिन एक्सेस करें। / Dev / mem तक कोई पहुंच नहीं है। रूट के रूप में चलाने की कोशिश करें!


34

मैंने RPi.GPIO लाइब्रेरी का उपयोग करके एक पायथन स्क्रिप्ट बनाई है। मुझे इसे बिना रूट के चलाने की आवश्यकता है, लेकिन "python ./script.py" के साथ चलने पर मुझे यह त्रुटि मिलती है:

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

मैंने कई स्थानों पर पढ़ा है कि आपको लाइब्रेरी के नवीनतम संस्करण के साथ रूट की आवश्यकता नहीं है, लेकिन मुझे अपडेट करने के बाद भी त्रुटि मिलती है। मेरे पास जो संस्करण है वह RPi.GPIO 0.6.0a3 है

यहाँ कोड है:

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)

और पूरी त्रुटि:

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!

जब मैं इसे रूट करता हूं तो यह काम करता है।


sudo adduser my_new_user gpio सही है, लेकिन याद रखें कि लॉग इन करना और वापस जाना क्योंकि समूह सदस्यता को अपडेट करने के लिए सक्रिय होने के लिए पुनः लॉगिन की आवश्यकता होती है।
ब्लाइंडफ्रेड्डी

जवाबों:


49

आरपीआई.जीपीआईओ को एक गैर-रूट उपयोगकर्ता के रूप में उपयोग करने के लिए आपको शायद रास्पियन को चलाने की आवश्यकता है, संभवतः इसे जेसी होने की भी आवश्यकता है।

है /dev/gpiomemमौजूद हैं? यदि RPI.GPIO को GPIO तक पहुंचने के लिए इस उपकरण का उपयोग करना चाहिए। यदि /dev/gpiomemमौजूद नहीं है कोशिश:

sudo rpi-update

यह सुनिश्चित करने के लिए कि आप हाल के कर्नेल का उपयोग कर रहे हैं, और

sudo apt-get update
sudo apt-get upgrade

यह सुनिश्चित करने के लिए कि आप हाल ही में RPi.GPIO का उपयोग कर रहे हैं।

आपको यह भी सुनिश्चित करना होगा कि आप gpioसमूह के सदस्य हैं :

sudo adduser pi gpio

एडीडी से जुड़े

रास्पियन प्रणाली प्रवाह की स्थिति में प्रतीत होती है। मुझे यकीन नहीं है कि यह एक रास्पियन या (अधिक संभावना है) एक raspberrypi.org समस्या है।

जांचें कि / dev / gpiomem की सही अनुमति है।

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

यदि यह सही अनुमतियों को निम्न प्रकार सेट नहीं करता है

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

4
अभी भी काम नहीं कर रहा है। सब कुछ अपडेट किया गया है, / dev / gpiomem मौजूद है और जब मैं उपयोगकर्ता को gpio समूह में जोड़ने का प्रयास करता हूं तो यह कहता है कि यह पहले से ही सदस्य है
JoeyCK

3
@JoeyCK: ध्यान दें कि समूह सदस्यता बदलने से पहले से चल रही प्रक्रियाओं पर कोई असर नहीं पड़ता है। idअपने शेल के वर्तमान समूहों को सूचीबद्ध करने के लिए चलाएँ , और यदि gpioसूचीबद्ध नहीं है, तो फिर से लॉग इन करें, या रिबूट करें।
डेल्टैब

@JoeyCK RPi.GPIO द्वारा किस संस्करण की सूचना दी गई है?
जौन

@joan संस्करण ०.५.११
जॉयकेक

1
@mjwittering रास्पियन, पी पर बेहतर ढंग से समर्थित होंगे। यदि आप उबंटू पसंद करते हैं तो आपको प्रत्येक बूट में परिवर्तन लागू करने की आवश्यकता होगी। आप इसे बूट स्क्रिप्ट या क्रॉस्टैब में रिबूट प्रविष्टि के साथ स्वचालित रूप से कर सकते हैं।
जौन

7

मेरे पास अभी यह मुद्दा था और बस इसी के साथ हल हुआ:

sudo adduser my_new_user gpio

इसके साथ, उपयोगकर्ता "my_new_user" को gpio समूह में जोड़ा जाता है, इसलिए, gpio समूह के सभी उपयोगकर्ता GPIO पिन तक पहुंच सकते हैं।


1
आपका मतलब / देव / गिपोमेम (नहीं / देव / मेम) है।
joan

दोनों वास्तव में, यदि आप / देव में देखते हैं तो आप देखेंगे कि दोनों उपकरण मौजूद हैं, और प्रश्न विषय / देव / मेम के बारे में था
Иван Андреевич ноерногоров

1
नहीं, समूह gpio के सदस्य की / dev / mem तक कोई पहुँच नहीं है।
जौन

सही, kmem का सदस्य करता है, तो समाधान simmilar है
Иван Андреевич оверногоров

2
ठीक है, लेकिन यह बिंदु सुरक्षित, मूल, GPIO तक पहुंच प्रदान करना है। उपयोगकर्ता को समूह kmem में जोड़ना सुरक्षित नहीं है, और GPIO तक पहुँच नहीं देगा।
जोआन

5

मैं इसका जवाब दे सकता हूं।

sudo chown root.gpio /dev/mem

यह मालिक और के समूह में परिवर्तन /dev/memकरने के लिए rootऔर gpioक्रमशः।

sudo chmod g+rw /dev/mem

तब समूह इस /dev/memवस्तु को रीड राइट एक्सेस देता है ।

/dev/memवस्तु मूल रूप से सिस्टम पर पूरे स्मृति स्थान है। इसका मतलब यह है कि अब समूह gpio, और उसमें मौजूद हर कोई मेमोरी स्पेस को पढ़ और लिख सकता है।

अब, मेमोरी स्पेस में सीपीयू रजिस्टर सहित कई चीजें हैं। जब आप GPIO पिन को टॉगल करते हैं, तो आप इनमें से एक रजिस्टर में थोड़ा बदलाव कर रहे हैं। किकर है, आपको यह सुनिश्चित करने की आवश्यकता है कि आप इसे सही तरीके से करते हैं या आपके सिस्टम में खराब बुरी चीजें हो सकती हैं।

संपूर्ण मेमोरी स्पेस को सुरक्षित रखने में मदद करने के लिए, जिन शक्तियों को केवल मेमोरी भागों में मैप किया जाता है, जिन्हें हमें GPIO बिट्स के साथ काम करने की आवश्यकता होती है /dev/gpiomem। यह प्रभाव मास्क / शेष मेमोरी स्पेस को एक्सेस करने से रोकता है और केवल GPIO बिट्स को एक्सेस करने की अनुमति देता है। यह GPIO मेमोरी एड्रेस तक पहुंच की अनुमति देता है और मेमोरी के किसी भी अन्य हिस्से को बंद कर देता है, जैसे कि मेमोरी वर्तमान में किसी अन्य प्रोग्राम द्वारा उपयोग की जा रही है।

वास्तव में, यह GPIO सामान तक पहुँच की अनुमति देने के लिए सुरक्षा और सिस्टम स्थिरता सुरक्षा दोनों में एक छेद को नष्ट कर देता है, साथ ही साथ शेष मेमोरी, लेकिन केवल समूह GPIO में उपयोगकर्ताओं के लिए, जो Pi का एक सदस्य है।

भविष्य में, ड्राइवर जैसे bcm2835लाइब्रेरी और wiringPiअधिक अपडेट किए जाएंगे (कुछ अपडेट पहले से ही हो रहे हैं) और उन टूल्स के शीर्ष पर बनाए गए एप्लिकेशन आगे अपडेट हो जाएंगे और फिर भविष्य में, उम्मीद है कि यह सब GPIO परेशानी जड़ के रूप में होगा गायब होना।

तब तक आपके पास दो विकल्प हैं, /dev/memसमूह gpioको पढ़ने / लिखने के रूप में खोलें , या रूट के रूप में चलाएं, जिसमें सभी को पूरा पढ़ा लिखा है /dev/mem

आशा है कि समझ में आता है।

वर्तमान में अभी भी कुछ ऐसे मुद्दे हैं जहाँ आपको अभी भी चलाने की आवश्यकता है root। उदाहरण के लिए, node-red-contrib-dht-sensorमॉड्यूल का उपयोग करना , जो पर निर्भर करता है node-dht-sensor, जो कि BCM2835 पर निर्भर करता है। यह का उपयोग कर SEG-दोष /dev/gpiomemके रूप में यह कुछ कीड़े अभी भी है या तो में node-dht-sensorया में /dev/gpiomemया जिस तरह से वे एक साथ काम कर रहे हैं। मुझे नहीं पता कि मामला क्या है, लेकिन यह आखिरकार काम कर जाएगा। जब BCM2835 'नॉन-रूट' के रूप में चलता है और /dev/gpiomemमौजूद होता है, तो /dev/gpiomemइसके बजाय इसका उपयोग करने की कोशिश करता है /dev/mem, इसलिए /dev/memसमूह को खोलने से gpioमदद नहीं मिलती है। ओह।


1

बस टर्मिनल में निम्नलिखित कमांड का उपयोग करें:

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

2
क्या आप इस बात की व्याख्या कर सकते हैं कि यह कमांड क्या करता है, और यह जोआन के जवाब से अलग क्यों है ? बीच क्या अंतर है /dev/memऔर /dev/gpiomem?
ग्रीनोनलाइन

यदि आप इसे जॉन का जवाब उपयोग करने के लिए, फिर भी अगर आप नहीं बदल सकते हैं बेहतर है सकते हैं /dev/memकरने के लिए /dev/gpiomemइस आप उपयोग करने के लिए एक ही अनुमति मिल जाएगा /dev/memआप के साथ है/dev/gpiomem
Natim

जब अधिक सर्जिकल दृष्टिकोण प्रश्न का उत्तर देता है, तो यह सभी / देव / मेम तक पहुंच प्रदान करने के लिए असुरक्षित है।
ब्राइस

1

उपरोक्त उत्तरों में से कोई भी सभी चरणों में शामिल नहीं है। मुझे GPIO पिन तक गैर-रूट पहुंच प्राप्त करने के लिए निम्नलिखित चरणों को पूरा करने की आवश्यकता है। मुझे एक नया समूह बनाना था, अपने उपयोगकर्ता को इस समूह में जोड़ना था तब अनुमतियाँ बदलनी चाहिए (पिछली पोस्टों की तरह)।

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

यदि आप geany में निर्माण कर रहे हैं तो बस बिल्ड कमांड बदलें।

संकलित करने के लिए जावा कमांड होना चाहिए

sudo pi4j --compile "%f"

और निष्पादित कमांड होनी चाहिए

sudo pi4j --run "%e" 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.