Zugriff auf GPIO-Pins mit dem Programm c in Himbeer-Pi

8

Ich benutze Himbeer-Pi mit Debian Wheezy 18-09-2012 Bild. Ich kann mit dem Wiring Pi Tool auf GPIO-Pins zugreifen. Aber ich würde gerne wissen, ob es eine andere Methode gibt, mit der wir direkt auf GPIO-Pins zugreifen können, ohne Pi zu verdrahten.

Wenn ich den folgenden Befehl auf dem Terminal ausführe

echo 0 >/sys/class/gpio/export

es zeigt

-bash: /sys/class/gpio/export: Permission denied

Gibt es dafür eine Lösung?

Ich habe auch das folgende Skript ausprobiert

#!/bin/sh

echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction

while true
do
        echo 1 > /sys/class/gpio/gpio4/value
        echo 0 > /sys/class/gpio/gpio4/value
done

von hier und ich bekomme den gleichen Fehler.

Ich möchte den Code auf C ausführen, da ich momentan nicht mit Java und Python vertraut bin.

Sumith
quelle
Hallo, ich habe solche gpio-Operationen in beagleboard ausgeführt, indem ich mit c auf die Methoden open / write / read für Dateien mit dem Befehl / sys / class / gpio / gpio (portpin) / value zugegriffen habe. Aber hier zeigt es die verweigerte Erlaubnis ...
Sumith
Sie sollten die Gruppe davon Ihrem Benutzer hinzufügen oder als Root mit sudo ausführen. Beachten Sie, dass die Umleitung vor der Ausführung von sudo erfolgt, sodass versucht wird, sie als Benutzer und nicht als Root zu öffnen.
Anders

Antworten:

10

Ja, es gibt mindestens zwei davon:

GPIO-Kernelmodul

Die vollständige Dokumentation dieses Subsystems finden Sie hier (siehe Sysfs Interface for UserspaceUnterabschnitt). Grundsätzlich exportiert der Kernel einige Dateien in ein /sys/class/gpio/Verzeichnis. Hier ist ein Beispiel für eine Verwendung (Pin 0 als Eingang verwenden und dann als Ausgang umschalten und auf 1 setzen):

# echo 0 >/sys/class/gpio/export
# echo in >/sys/class/gpio/gpio0/direction
# cat /sys/class/gpio/gpio0/value
# echo out >/sys/class/gpio/gpio0/direction
# echo 1 >/sys/class/gpio/gpio0/value

Beachten Sie, dass Sie im Normalfall Root-Berechtigungen benötigen, um dies zu tun.

Da all dies nur eine Datei - Operationen ist, kann es leicht mit in C - Programm durchgeführt werden open()/ read()/ write()Funktionen. Seien Sie vorsichtig bei der Verwendung von fopen()/ fread()/ fwriteFunktionen , da sie mich gepuffert verwenden / O.

Register direkt verwenden

Ich glaube, dieser wird von WiringPi selbst verwendet. Es verwendet ein /dev/memGerät, um auf den physischen RaspberryPi-Speicher zuzugreifen und direkt mit BCM2835-Speicherregistern zu arbeiten. Um es verwenden zu können, müssten Sie das BCM2835-Datenblatt ( General Purpose I/O (GPIO)Abschnitt) lesen . Es ist jedoch nicht so trivial. Beachten Sie, dass Sie dazu Root-Berechtigungen benötigen.

Es gibt auch eine weitere C-Bibliothek, die diese Methode verwendet. Sie finden sie hier . Es kann viel mehr als nur GPIO manipulieren, aber da es recht einfach ist, sollte es einfach sein, nur den GPIO-Code zu extrahieren und zu verstehen, wie es funktioniert.

Krzysztof Adamski
quelle
Vielen Dank. Aber wenn versucht wird, echo 0> / sys / class / gpio / export auszuführen, wird -bash: / sys / class / gpio / export angezeigt: Berechtigung verweigert Warum? Sag es mir bitte
Sumith
1
@Sumith: Wie in der Antwort erwähnt, benötigen Sie Root-Benutzerberechtigungen. Versuchen Sie sudo -i, Root-Benutzer zu werden, und geben Sie dann die Beispielbefehle ein.
Krzysztof Adamski
1
@sumith was wird ls -l /sys/class/gpio/exportangezeigt? @KrysztofAdamski Können Sie Ihre Antwort bearbeiten bold die Tatsache , dass Sie diese Dateien root Zugriff sein müssen? Ich habe diesen Kommentar in Ihrer Antwort zunächst nicht gesehen.
HeatfanJohn
1
Das Ändern oder Chowning der Dateien (als Root) ist eine weitere Option, um einen nachfolgenden nicht privilegierten Zugriff zu ermöglichen. Sie müssen dies jedoch bei jedem Start tun. Versuchen Sie auch sudo -s, eine Shell als Root zum Ausführen von Tests zum Laufen zu bringen
Chris Stratton,
2
@sumith: Ja, Ihr Programm sollte diese Dateien nur öffnen und mit normalen Lese- / Schreibvorgängen von / zu ihnen lesen / schreiben. Es ist viel besser, ungepufferte read()/ write()Funktionen anstelle von gepufferten fread()/ zu verwenden fwrite(). Stellen Sie außerdem sicher, dass Ihr Programm mit Root-Rechten ausgeführt wird.
Krzysztof Adamski
3

Wenn Sie nicht streng "direkt" meinen, können Sie auch Python oder sogar Java verwenden

recantha
quelle
Vielen Dank, aber ich bin nicht mit Java und Python vertraut.
Sumith
0

Ich kann mit einer von Chris Stratton vorgeschlagenen Methode auf GPIO-Pins zugreifen.

In der Datei /etc/rc.local füge ich die Befehle hinzu

Echo 17 (GPIO-Pin)> / sys / class / gpio / export

und

chmod 777 -R / sys / class / gpio / gpio17.

Ich kann mein c-Programm ausführen, ohne zuerst sudo -s einzugeben.

Ich danke Ihnen allen, dass Sie mich unterstützen.

Sumith
quelle
0

Sie können mit C auf alle Raspberry Pi-Peripheriegeräte (einschließlich GPIO, C, ...) zugreifen, indem Sie in die entsprechenden Register auf dem Pi schreiben.

Ich habe hier ein Tutorial dazu geschrieben: http://www.pieter-jan.com/node/15

Auf diese Weise müssen Sie keine Bibliotheken verwenden, nur Grundkenntnisse von C. Ich hoffe, das hilft!

Wie oben erwähnt, müssen Sie alle Ihre Programme als Sudo-Benutzer ausführen.

Pieter-Jan
quelle