Raspberry Pi GPIO How-To
GPIO-Pin's - auch General Purpose Input Output - bilden die zentrale Schnittstelle zwischen dem Raspberry Pi zu externen Geräten und digitalen Schaltungen. Dabei übernehmen bestimmte Pin's neben der einfachen Ansteuerung auch bestimmte Funktionen wie die Kommunikation per I2C, UART oder SPI.
Raspberry Pi GPIO Belegung
|
|||||||||
WiringPi | Rev 2 | Rev 1 | Rev 1 | Rev 2 | WiringPi | ||||
1 | 2 | ||||||||
8 | GPIO 2 | GPIO 0 | 3 | 4 | |||||
9 | GPIO 3 | GPIO 1 | 5 | 6 | |||||
7 | GPIO 4 | GPIO 4 | 7 | 8 | GPIO 14 | GPIO 14 | 15 | ||
9 | 10 | GPIO 15 | GPIO 15 | 16 | |||||
0 | GPIO 17 | GPIO 17 | 11 | 12 | GPIO 18 | GPIO 18 | 1 | ||
2 | GPIO 27 | GPIO 21 | 13 | 14 | |||||
3 | GPIO 22 | GPIO 22 | 15 | 16 | GPIO 23 | GPIO 23 | 4 | ||
17 | 18 | GPIO 24 | GPIO 24 | 5 | |||||
12 | GPIO 10 | GPIO 10 | 19 | 20 | |||||
13 | GPIO 9 | GPIO 9 | 21 | 22 | GPIO 25 | GPIO 25 | 6 | ||
14 | GPIO 11 | GPIO 11 | 23 | 24 | GPIO 8 | GPIO 8 | 10 | ||
25 | 26 | GPIO 7 | GPIO 7 | 11 | |||||
1 | 2 | ||||||||
17 | GPIO 28 | GPIO 28 | 3 | 4 | GPIO 29 | GPIO 29 | 18 | ||
19 | GPIO 30 | GPIO 30 | 5 | 6 | GPIO 31 | GPIO 31 | 20 | ||
7 | 8 |
GPIO Export
Variante 1: Export mit der Bash
Bevor man einen Pin ansteuern kann, muss dieser bei jedem Neustart freigeschaltet werden. GPIO's werden auf dem Raspberry Pi und den meisten Mikrocontrollern als Dateien repräsentiert und befinden sich im Ordner /sys/class/gpio.Zunächst teilen wir dem System unseren zu exportierenden GPIO (z.B. 17) mit.
pi@raspberrypi
~ $ echo "17" > /sys/class/gpio/export
bash: export: Permission denied
Um einen GPIO zu exportieren müssen wir jedoch Root sein (was ein bisschen nervt). Entweder wechselt man vorher zum Root-Benutzer (Passwort: raspberry): bash: export: Permission denied
pi@raspberrypi
~ $ su root
oder man ändert die Rechte der export-Datei:
pi@raspberrypi
~ $ sudo chmod 222 /sys/class/gpio/export /sys/class/gpio/unexport
Das GPIO-System hat nun einen neuen Ordner /sys/class/gpio/gpio17/ angelegt mit dem wir arbeiten können. Als letztes definiert man ob man aus dem GPIO lesen ( in) oder schreiben ( out) will.
pi@raspberrypi
~ $ echo "out" > /sys/class/gpio/gpio17/direction
Nun ist der Pin exportiert und bereit zum ansteuern. Der GPIO selber kann zwei Zustände annehmen. Schreibt man eine "1" nach gpio17/value, so liegen genau 3,3 Volt an. Schreibt man eine "0" hinein, dann fließt natürlich kein Strom mehr.
pi@raspberrypi
~ $ echo "1" > /sys/class/gpio/gpio17/value
Um Alles wieder rückgänigig zu machen, gibt man folgendes ein:
pi@raspberrypi
~ $ echo "17" > /sys/class/gpio/unexport
Variante 2: Export mit WiringPi
WiringPi ist ein hilfreiches Programm zum Export und zur Steuerung von GPIO's. Darüberhinaus kann es mit den mitgelieferten Bibliotheken in C, C++, Python, Java und PHP eingebunden werden.Da es nicht standardmäßig im Betriebssystem integriert ist, muss es über Git nachinstalliert werden. Falls Git noch nicht installiert ist, müssen folgende Befehle ausgeführt werden:
pi@raspberrypi
~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get install git-core
Jetzt kann man wiringPi herunterladen und installieren. pi@raspberrypi ~ $ sudo apt-get install git-core
pi@raspberrypi
~ $ git clone git://git.drogon.net/wiringPi
pi@raspberrypi ~ $ cd WiringPi
pi@raspberrypi ~/WiringPi $ ./build
Nun exportieren wir wie oben den GPIO 17 mit dem eben installiertem Programm gpio. pi@raspberrypi ~ $ cd WiringPi
pi@raspberrypi ~/WiringPi $ ./build
pi@raspberrypi
~ $ gpio export 17 out
Und schalten ihn durch.
pi@raspberrypi
~ $ gpio -g write 17 1
Will man dagegen den aktuellen Wert lesen, gibt man folgendes ein.
pi@raspberrypi
~ $ gpio -g read 17
1
WiringPi benutzt eine andere GPIO-Belegung (Tabelle oben). Die Option -g weist WiringPi an, die normale Raspberry Pi Belegung zu benutzen. 1
Ansteuerung mit C/C++
GPIO schreiben
Als Beispiel lassen wir eine LED die über den Pin 11 (= GPIO 17 = WiringPi Pin 0) und dem Pin 14 (Masse) verbunden ist im Abstand von 100 ms blinken. Die Bibliothek wiringPi.h muss wie im letzten Kaptitel beschrieben, installiert sein.
pi@raspberrypi
~ $ vi gpio_write.cpp
// WiringPi-Api einbinden #include <wiringPi.h> // C-Standardbibliothek einbinden #include <stdio.h> int main() { // Starte die WiringPi-Api (wichtig) if (wiringPiSetup() == -1) return 1; // Schalte GPIO 17 (=WiringPi Pin 0) auf Ausgang // Wichtig: Hier wird das WiringPi Layout verwendet (Tabelle oben) pinMode(0, OUTPUT); // Dauerschleife while(1) { // LED an digitalWrite(0, 1); // Warte 100 ms delay(100); // LED aus digitalWrite(0, 0); // Warte 100 ms delay(100); } }
pi@raspberrypi
~ $ g++ gpio_write.cpp -o gpio_write -lwiringPi
und führen es mit Root-Rechten aus
pi@raspberrypi
~ $ sudo ./gpio_write
Eine detailierte Beschreibung der WiringPi-Api gibts hier. GPIO lesen
Jetzt erweitern wir das obere Beispiel um einen lesenden GPIO. In unserem Fall prüfen wir den GPIO 24 (= WiringPi-Pin 5) gegen den Pin 17 (3.3V) auf Durchgang und lassen dann die LED blinken. Ist der GPIO durchgeschaltet erhalten wir eine 1, ansonsten eine 0.Eine Ausnahme beim Raspberry Pi sind hier die GPIO's 2 (Pin 3) und 3 (Pin 5). Da diese Pins für I2C benutzt werden liegen dauerhaft 3.3V an. In der Praxis müssen diese gegen Masse geschaltet werden und signalisieren bei Durchgang eine 0 und bei Unterbrechung eine 1. Weitere Informationen dazu findet ihr hier.
// WiringPi-Api einbinden #include <wiringPi.h> // C-Standardbibliothek einbinden #include <stdio.h> int main() { // Starte die WiringPi-Api (wichtig) if (wiringPiSetup() == -1) return 1; // Schalte GPIO 17 (=WiringPi Pin 0) auf Ausgang pinMode(0, OUTPUT); // Schalte GPIO 24 (=WiringPi Pin 5) auf Eingang pinMode(5, INPUT); // Dauerschleife while(1) { // LED immer ausmachen digitalWrite(0, 0); // GPIO lesen if(digitalRead(5)==1) { // LED an digitalWrite(0, 1); // Warte 100 ms delay(100); // LED aus digitalWrite(0, 0); // Warte 100 ms delay(100); } } }
Ansteuerung mit C#
Um C# auf dem Raspberry Pi zu nutzen muss zuerst die Laufzeitumgebung Mono nachinstalliert werden.
pi@raspberrypi
~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get install mono-complete
Als nächstes laden wir die RaspberryPiDotNet-Api und kompilieren eine Bibliothek die wir später einbinden können. pi@raspberrypi ~ $ sudo apt-get install mono-complete
pi@raspberrypi
~ $ mkdir gpio_csharp
pi@raspberrypi ~ $ git clone git://github.com/cypherkey/RaspberryPi.Net.git
pi@raspberrypi ~ $ cd RaspberryPi.Net/RaspberryPiDotNet
pi@raspberrypi ~/RaspberryPi.Net/RaspberryPiDotNet$ xbuild RaspberryPiDotNet.csproj
pi@raspberrypi ~/RaspberryPi.Net/RaspberryPiDotNet$ cp bin/Debug/RaspberryPiDotNet.dll /home/pi/gpio_csharp/
Die RaspberryPiDotNet.dll bietet zwei Wege um die GPIO's anzusprechen. Zu einem können diese über die GPIO-Dateien (GPIOFile) oder direkt über den Speicher (GPIOMem) gesteuert werden. Die zweite Methode ist laut Dokumentation wesentlich schneller, braucht jedoch die die kompilierte bcm2835-Bibliothek: pi@raspberrypi ~ $ git clone git://github.com/cypherkey/RaspberryPi.Net.git
pi@raspberrypi ~ $ cd RaspberryPi.Net/RaspberryPiDotNet
pi@raspberrypi ~/RaspberryPi.Net/RaspberryPiDotNet$ xbuild RaspberryPiDotNet.csproj
pi@raspberrypi ~/RaspberryPi.Net/RaspberryPiDotNet$ cp bin/Debug/RaspberryPiDotNet.dll /home/pi/gpio_csharp/
pi@raspberrypi
~ $ wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.3.tar.gz
pi@raspberrypi ~ $ tar -zxf bcm2835-1.3.tar.gz
pi@raspberrypi ~ $ cd bcm2835-1.3
pi@raspberrypi ~/bcm2835-1.3$ ./configure
pi@raspberrypi ~/bcm2835-1.3$ make
pi@raspberrypi ~/bcm2835-1.3$ sudo make check
pi@raspberrypi ~/bcm2835-1.3$ sudo make install
pi@raspberrypi ~/bcm2835-1.3$ cd src
pi@raspberrypi ~/bcm2835-1.3/src$ cc -shared bcm2835.o -o libbcm2835.so
pi@raspberrypi ~/bcm2835-1.3/src$ cp libbcm2835.so /home/pi/gpio_csharp/
Nun kommen wir (endlich) zum eigentlichen Code. Ich habe wie beim oberen Beispiel zwischen dem Pin 11 (GPIO 17) und Pin 14 (Masse) eine LED gehängt. Wird nun der Pin 18 (GPIO 24) und Pin 17 (Masse) überbrückt, so blinkt die LED im 100ms-Takt. pi@raspberrypi ~ $ tar -zxf bcm2835-1.3.tar.gz
pi@raspberrypi ~ $ cd bcm2835-1.3
pi@raspberrypi ~/bcm2835-1.3$ ./configure
pi@raspberrypi ~/bcm2835-1.3$ make
pi@raspberrypi ~/bcm2835-1.3$ sudo make check
pi@raspberrypi ~/bcm2835-1.3$ sudo make install
pi@raspberrypi ~/bcm2835-1.3$ cd src
pi@raspberrypi ~/bcm2835-1.3/src$ cc -shared bcm2835.o -o libbcm2835.so
pi@raspberrypi ~/bcm2835-1.3/src$ cp libbcm2835.so /home/pi/gpio_csharp/
pi@raspberrypi
~/gpio_sharp$ vi gpio.cs
using System; using RaspberryPiDotNet; namespace Gpio { class Program { static void Main(string[] args) { span class="white">// GPIO's initialisieren GPIOMem gpio17 = new GPIOMem(GPIOPins.V2_GPIO_17); GPIOMem gpio24 = new GPIOMem(GPIOPins.V2_GPIO_24); while(true) { // LED immer ausmachen gpio17.Write(false); // GPIO lesen if(gpio24.Read()==true) { // LED an gpio17.Write(true); // Warte 100 ms System.Threading.Thread.Sleep(100); // LED aus gpio17.Write(false); // Warte 100 ms System.Threading.Thread.Sleep(100); } } } } }
pi@raspberrypi
~/gpio_sharp$ mcs gpio.cs -r:RaspberryPiDotNet.dll
pi@raspberrypi ~/gpio_sharp$ sudo mono --runtime=v4.0 gpio.exe
pi@raspberrypi ~/gpio_sharp$ sudo mono --runtime=v4.0 gpio.exe
Ansteuerung mit Python
Für die Programmierung der GPIO's mithilfe Python muss die Python-Entwicklungsungebung sowie die RPI.GPIO Bibliothek nachinstalliert werden.
pi@raspberrypi
~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get install python-dev
pi@raspberrypi ~ $ sudo apt-get install python-rpi.gpio
Das folgende Beispiel ist eine Portierung der oberen C/C++/C# Varianten. Sobald Pin 18 (GPIO 24) mit der Masse verbunden wird (z.B: Pin 17), blinkt eine über Pin 11 (GPIO 17) und Pin 14 (Masse) verbundene LED im 100ms Takt. pi@raspberrypi ~ $ sudo apt-get install python-dev
pi@raspberrypi ~ $ sudo apt-get install python-rpi.gpio
Info: Die Nummerierung der GPIO's ist gleich der Pinnummerierung
pi@raspberrypi
~/gpio_python$ vi gpio.py
import time import RPi.GPIO as GPIO # RPi.GPIO Layout verwenden (wie Pin-Nummern) GPIO.setmode(GPIO.BOARD) # Pin 18 (GPIO 24) auf Input setzen GPIO.setup(18, GPIO.IN) # Pin 11 (GPIO 17) auf Output setzen GPIO.setup(11, GPIO.OUT) # Dauersschleife while 1: # LED immer ausmachen GPIO.output(11, GPIO.LOW) # GPIO lesen if GPIO.input(18) == GPIO.HIGH: # LED an GPIO.output(11, GPIO.HIGH) # Warte 100 ms time.sleep(0.1) # LED aus GPIO.output(11, GPIO.LOW) # Warte 100 ms time.sleep(0.1)
pi@raspberrypi
~/gpio_python$ sudo python gpio.py
Hat dir dieser Artikel gefallen? Bewerte ihn!
Raspberry Pi GPIO How-To << Raspberry Pi Guide
Raspberry Pi GPIO How-To << Raspberry Pi Guide
111 Kommentare
- Thumbs up schrieb am 15.10.2013 um 22:29 Alle notwendigen Schritte zum Einstieg sind hier �bersichtlich und leicht verst�ndlich auf den Punkt gebracht. Man kann auch 500-Seiten-Spezifikationen lesen; Wer nicht Elektrotechnik studiert hat, ist hier aber definitiv besser aufgehoben. Vielen Dank!
- Bigspid schrieb am 30.7.2015 um 14:32 Auch als Elektrotechnik Absolvent bin ich sehr dankbar für die kurze und übersichtliche Anleitung! Spart einiges an Zeit und Arbeit!
- Huber schrieb am 11.8.2015 um 17:52 Wofür bräuchtest du hier so spezielle Kenntnisse in der ET? ^^
-
Martin schrieb am 20.10.2013 um 15:17
Hallo, erstmal super kompliment. Auch ein Windowser kommt hiermit leicht zurecht, wenn, ja wenn alles funzen w�rde ^^ Hab mir nach studieren dieser Seite auch ein Pi zugelegt. Er l�uft und selbst eine RDP Sitzung �ber mein Win8.1 Surface klappt. Leider kann ich die RaspberryPiDotNet nicht komplieren.
Bei xbuild RaspberryPiDotNet.csptoj kommt ein Fehler 'DS1620.cs(94,42): error CS0589 internal compiler errorduring parsing'. Was mach ich falsch?
Gr�sse
Martin -
Vincent.Vega schrieb am 7.3.2014 um 22:02
Die DS1620.cs ließ sich bei mir auch nicht kompilieren... Da in Zeile 94 beim Dividend ja schon explizit als Double gecastet wird, muss man sich keine Sorgen mehr über den Genauigkeitsverlust des Ergebnisses machen, da dieses zwangsläufig auch vom Typ Double sein wird. Das ".0" beim Divisor kann man sich also sparen, tut man dies klapps dann auch mit dem Kopilieren.
Testen kann man dieses Verhalten auch schön in der Konsole ($ csharp).
Da dieses Problem nur auftritt wenn man auf dem Pi selber Kompilieren will, vermute ich das es irgendetwas mit dem soft-/hard-Floting-Verhalten zu tun hat.
Grüße Vince... -
Boris Gaertner schrieb am 7.4.2014 um 17:37
Der Fehler kommt mir bekannt vor. Den hatte ich auch, solange ich Raspbian vollstaendig für Deutsch konfiguriert hatte.
Der Uebeltaeter ist in der Konfiguration von Raspbian im Konfigurationspunkt "Internationalisation options -> change locals" die Einstellung "Default locale for the system environment" Hier darf *nicht* de_de.UTF8 ausgewaehlt werden. Die Einstellung None ist in Ordnung, britisches oder amerikanisches Englisch würde wohl auch gehen.
Es scheint, dass der Compiler mcs bei der Konvertierung der Schreibform im Programm stehender Gleitkommazahlen die Einstellung für "Default locale..." berücksichtigt, was er natürlich nicht darf. Programmiersprachen sind vom Gebietsschema unabhängig!
Beste Grüße
Boris
PS. Es ist 15 Jahre her, dass IBM Visual Age for Smalltalk einen ganz ähnlichen Fehler in der Schnittstelle zu SQL hatte. Es werden eben immer wieder die gleichen Fehler gemacht :-) -
Boris Gaertner schrieb am 25.4.2015 um 12:14
Zur Ergänzung:
Statt
xbuild RaspberryPiDotNet.csproj
export LANG=NONE && xbuild RaspberryPiDotNet.csproj
sollte den Compiler dazu bringen, das eingestellte Gebietsschema zu ignorieren und Gleitkommazahlen richtig zu parsen. -
plipp schrieb am 22.4.2016 um 09:11
Statt auf dem Raspberry zu compilieren,gibt es auch die Möglichkeit des Cross-Compilierens
http://hackaday.com/2016/02/03/code-craft-cross-compiling-for-the-raspberry-pi/
PS: Gcc gibts auch für Windows. -
Emanuel schrieb am 26.1.2014 um 23:11
Hallo zusammen,
ich hab mir mal auch einen Rasperry Pi zugelegt und auch das dazugehörige Raspian installiert. Alles läuft super. Dazu kam ein SSH Server, ein Samba Server und das Mono Complete Paket. Ich muss sagen, ich als Windows only Programmierer bin mit dem Rasperry Pi und dem Raspian sehr gut zurecht gekommen. Natürlich habe ich als Windows Mensch C# verwendet. Die Quelle hab ich auf meinem Windows Laptop (mit VS 2013 und Win 8.1) entwickelt und über den Samba Server auf den Rasperry Pi transportiert. Zur Zeit habe ich eine kleine Lichterorgel laufen mit vier 3,3 Volt LEDs.
@Martin: Ich weiß nicht was du machst, aber bei mir läufts ohne Probleme.
Hier mal einen großen Dank an den Schreiber dieser Dokumentation und an die Entwickler des Rasperry Pi.
Gruß
Emanuel -
Zodiak schrieb am 31.1.2014 um 12:23
Man merkt das du:
A. Wenig Erfahrung mit Unixoiden Systemen hast.
B. Noch weniger Erfahrung über Rechtesystem derselben hast.
;) - RGuide schrieb am 3.2.2014 um 16:42 Oh, Verzeihung. Wie kann ich mir einbilden eine Seite über das Raspberry Pi zu machen
ohne alle Feinheiten über unixoide Systeme und deren Rechteverwaltung zu wissen.
Besser ich ich mach gar nichts und schreib unnötige Kommentare...ja, das ist um einiges erfüllender. - Schlauschiss schrieb am 4.2.2014 um 13:37 mal Ehrlich, hast du nichtmal den Kernel selbst kompilliert und die Inodes auf dem Flash per hand nachgezählt?
- Linuxfreak schrieb am 21.2.2014 um 15:05 Was???!!!??? Ich bin entsetzt! Du hast deinen Kernel etwas nicht selber geschrieben? Wie kannst du es dann wagen, ein Raspberry-Pi-Tutorial zu machen? Schäm dich, ich bin wirklich enttäuscht.
Aber sonst ein super Tutorial! :) - Dan schrieb am 3.7.2019 um 13:34 "Man merkt, dass Du"
(es fehlt ein Komma und ein "s") - mrBobDobalina schrieb am 13.3.2014 um 17:49 Hallo,
ein sehr schönes Tutorial.
Nicht nur der Inhalt, auch die Machart.
Die vielen kl. Konsolenbildchen im Text .. i like.
Aber ich würde gerne noch ein Bsp. in C sehen wo plain gearbeitet wird.
Also ohne WiringPI.h - Dillan schrieb am 16.3.2014 um 02:04 Ja das wäre wirklich super wenn noch ein Beispiel in C ergänzt werden könnte!
Danke - mrBobDobalina schrieb am 21.3.2014 um 04:09 Ich hab mir eine kl. Headerdatei in C geschrieben. Mit gcc auf raspbian compiliert.
Ich nutz sie nur für Ausgangsschaltungen (zB LED, Beeper, einzelne Pins etc).
Im BspCode schaltet GPIO17 für 5 sec an (3,3V).
GPIO.h:
/*=============================================================
* General Purpose Input/Output (GPIO) Management
* for the RaspberryPI Model B Revision 1
*
* GPIOCtrl(..) - GPIO Management
* GPIO(..) - GPIO Pin ON/OFF
* =============================================================
#include
#include
#include
enum{OFF, ON};
enum{OUT, IN};
enum{EXPORT, UNEXPORT, DIRECTION, VALUE};
char cGPIOPath[30] = {""};
char * GPIOPath(int cMode, char * cGPIONumber)
{
memset(cGPIOPath, 0, sizeof(cGPIOPath));
strcat(cGPIOPath, "/sys/class/gpio");
switch(cMode)
{
case EXPORT:
{
strcat(cGPIOPath, "/export");
break;
}
case UNEXPORT:
{
strcat(cGPIOPath, "/unexport");
break;
}
case DIRECTION:
{
strcat(cGPIOPath, "/gpio");
strcat(cGPIOPath, cGPIONumber);
strcat(cGPIOPath, "/direction");
break;
}
case VALUE:
{
strcat(cGPIOPath, "/gpio");
strcat(cGPIOPath, cGPIONumber);
strcat(cGPIOPath, "/value");
break;
}
}
return cGPIOPath;
}
==============================
test.c:
#include
#include
#include "GPIO.h"
int main(int argc, char** argv)
{
printf("Create GPIO Port\n");
GPIOCtrl(true, "17", OUT);
printf("sleep..\n");
sleep(5);
printf("Switch ON\n");
GPIO("17", ON);
printf("sleep..\n");
sleep(5);
printf("Switch OFF\n");
GPIO("17", OFF);
printf("Remove GPIO Port\n");
GPIOCtrl(false, "17", 0);
return 0;
}
Wenn man das Programm nicht als root laufen lassen möchte dann vorher natürlich Rechte anpassen:
sudo chmod 222 /sys/class/gpio/export /sys/class/gpio/unexport - MrBob schrieb am 21.3.2014 um 04:17 Hallo ... Admin
kannst du diese Posts (quellcode) bitte löschen?
ich kann den code hier nicht korrekt hochladen.
da immer etwas fehlt wird es so leider nicht laufen :(
merci - MrBobDobalina schrieb am 21.3.2014 um 04:12 Sehe gerade ich kann keine TagZeichen setzen daher ergänzend:
GPIO.h:
#include stdbool.h
#include string.h
#include fcntl.h
test.c
#include stdio.h
#include unistd.h
#include "GPIO.h"
- Ralph schrieb am 14.5.2014 um 15:41 Servus Leute, ich hab auch eine Frage an euch:
Ich versuche mit meinem Raspi einen Monochrom Rit-Display anzusteuern:
Panel resolution : 64*64
‐ Driver IC : SSD1305
‐ Excellent Quick response time : 10μs
‐ Extremely thin thickness for best mechanism design : 1.41 mm
‐ High contrast : 2000:1
‐ Wide viewing angle : 160
‐ Strong environmental resistance.
‐ 8-bit 6800-series Parallel Interface, 8-bit 8080-series Parallel Interface,
Serial Peripheral Interface and I2C Interface.
Da ich ein totaler Anfänger bin, hab ich mich im Internet nach einer fertigen Lösung in c oder c++ aumgeschaut, leider ohne Erfolg. Kann mir irgendjemand dabei helfen, da ich grad echt kurz vor Verzweiflung bin...
Vielen Dank - Little Basterd schrieb am 20.7.2014 um 20:45 Zunächst mal ein großes Kompliment für die Seite. Es steckt unwahrscheinlich viel Information drin, die Anfänger und erfahrenere User weiter bringt.
Mir kommt Python etwas zu kurz, weil das sozusagen die Muttersprache des Raspi ist und weil Python die GPIO-Steuerung am transparentesten macht. - Mathias schrieb am 7.8.2014 um 12:42 Hallo Leute,
bei xbuild RaspberryPiDotNet.csptoj kommt ein Fehler 'DS1620.cs(94,42): error CS2001: Source file PinState.cs could not be found
- Manuel schrieb am 18.8.2014 um 21:43 Hallo Matthias
Ich habe das gleiche Problem mit dem PinState.cs. Hast du schon eine Lösung dafür gefunden.
- Mathias schrieb am 7.8.2014 um 12:44 ups, ich meine nur error CS2001: Source file PinState.cs could not be found
- Bernd schrieb am 8.8.2014 um 11:42 Hallo zusammen,
habe am Raspi eine 8-Relaismodul von Sainsmart. Wenn ich den Raspi einschalte hat GPIO27 bereits Spannung, heißt ein Relais ist bereits eingeschalten.
Warum hat dieser Pin Spannung, wie kann ich das ändern? - Georg schrieb am 22.10.2016 um 10:37 Das liegt wie im Text beschrieben daran, dass Pin 27 für die I2C Schnittstelle vorkonfiguriert ist. Ich würde dir raten unter https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/ nachzulesen. Ich bin auch RASPI Neuling und kann diese Erklärung nur empfehlen.
Viel Glück mit deinem Projekt.
Gruß Georg - PIrat schrieb am 22.8.2014 um 17:51 hallo zusammen
icha
habe das programm im lx terminal unter python geschrieben wie kann ich dieses speichern?
so das ich es später wider aufrufen kann?
vielen dank - Dalyan schrieb am 28.8.2014 um 08:23 Hier hat sich ein Fehler eingeschlichen:
Variante 2: Export mit WiringPi
pi@raspberrypi ~ $ git clone git://git.drogon.net/wiringPi
pi@raspberrypi ~ $ cd WiringPi
pi@raspberrypi ~/WiringPi $ ./build
die mittlere Zeile müsste heissen:
pi@raspberrypi ~ $ cd wiringPi (GrossKlein-Schreibung...)
sonst super!!
Gruss - Bender schrieb am 2.9.2014 um 10:07 Hi zusammen,
finde das Tutorial auch super! :-)
Leider bleib ich beim C-Kompelieren immer hängen, mit folgender Fehlermeldung:
g++: error: unrecognized option '-1wiringPi'
Leider liefert Dr. Google auch keine Lösungshinweise :-/
Und ich bin auch kein Linuxguru (ja ich hab auch noch keinen Kernel selbst programmiert! ;-) )
Danke im Voraus
Gruß
Bender - Bender schrieb am 2.9.2014 um 13:02 Fehler gefunden:
Man macht aus dem 1 ein l und schon klappt es.
Eieieieieieiei.... - Tony schrieb am 30.9.2014 um 17:50 Die Pinbelegung für den neuen Banana Pi sieht ähnlich aus! Hier haben wir mal alle Pins zusammengetragen: http://www.bananapi-kaufen.de/aufbau-und-pindefinitionen/
- Ich einfach Dumm schrieb am 6.10.2014 um 16:31 Hallo
Kannst du bei:
Ansteuerung mit C/C++
den Befehl "vi gpio_write.cpp"
nicht in "nano gpio_write.cpp" ändern?
So hätten User,ohne Linx erfahrung auch ne Chance in die Raspberrywelt
einzutauchen.
MfG
Ich einfach Dumm - Thilbert schrieb am 15.12.2014 um 15:19 Vielen Dank fuer das Tutorial erstmal, ist mir eine große Hilfe!
Dir ist allerdings ein kleiner Tippfehler unterlaufen im Punkt 2. beim Export mit WiringPi,
dort hast du nachdem inkludieren der Wirinpi App
cd WiringPi anfangs mit Großbuchstaben geschrieben, nach langer sucherei ist mir der Tippfehler erst aufgefallen.
Weiter so &
Liebe Grueße Thilbert - Timo Schneider schrieb am 5.1.2015 um 07:37 Hallo und ein frohes neues Jahr euch allen. Kennt von euch jemand eine Möglichkeit die GPIOs via Interrupt abzufragen (C#)?
Vielen Dank euch schonmal
Gruß
Timo - Leyliner schrieb am 12.1.2015 um 18:00 Ich bekomme, wenn ich genau nach der Anleitung für C# vorgehe immer eine Fehlermeldung beim Compilieren des Projekts.
pi@raspberrypi ~/RaspberryPi.Net/RaspberryPiDotNet$ xbuild RaspberryPiDotNet.csproj - Alex schrieb am 10.2.2015 um 00:43 Hi,
ich konnte es kompilieren, wenn ich VORHER Folgendes in der Shell ausführe:
unset LANG
- Felli schrieb am 4.3.2015 um 11:18 Man muss kein root haben um auf die GPIOs zu zugreifen (zumindest nicht meinem Build) die beiden Dateien export und unexport gehören der Gruppe "gpio". Sollte der aktuelle Benutzer vermutlich "pi" nicht dieser Gruppe angehören, reicht folgendes:
sudo usermod -aG gpio pi
Im aktuellen Rasbian ist das allerdings schon geschehen. - Ark26 schrieb am 15.4.2015 um 09:53 Das ist wirklich mal ein super Tutorial.
Leider habe ich noch ein Problem. Beim Pi2 möchte ich wPin 1,4,5 als Schalter nutzen. Hierzu würde ich sie gern gegen Masse ziehen. wPin 4 funktioniert super da er auf Eingang( logisch 1) steht. Da jedoch leider wPin 1 und 5 Low sind (Eingang gesetzt sind sie auch) können nicht funktionieren. Wie kann ich einen Eingang auf "high" setzen??
Gern nehme ich auch Tips wegen der der Pull_down Beschaltung entgegen ;). Ich mag mein Spielzeug ja. - Lenny schrieb am 3.5.2015 um 16:22 Hi, ich habe deinen C++ Code versucht in Codeblocks ein zu geben, dieser meckert aber wegen der Zeile bzw der Funktion "if (wiringPiSetup() == -1)" rum (also wegen wiringPiSetup()). Finde da einfach keine Lösung für, kann mir da wer helfen?
- Ralf schrieb am 20.10.2015 um 14:26 Du musst dem Linker wiringPI mitgeben. Auf der Komandozeile wäre das -l wiringPi. Mit codeblocks gehts du zu Project -> Build Options. Dort dann bei Linker Options wiringPi eintragen. Sollte dann funktionieren.
Und nicht vergessen bei codeblocks: dann das Projekt speichern sonst ist die linkereintragung beim nächsten start wieder weg. - Hans-Peter schrieb am 14.5.2015 um 12:51 Hallo Leute,
Ich habe leider nur Java-Knowledge, wie würde der Programmcode für Java aussehen? Wäre sehr dankbar, wenn ihr mir helfen würdet. - SoulSurfer schrieb am 25.5.2015 um 22:42 Moin Hans-Peter,
für Java musst Du "FileWriter" und "FileReader" benutzen. Sofern Du das Javaprogramm nicht als Root ausführst, musst Du die Dateirechte entsprechend setzen (siehe oben bei "sudo chown ...")
Es empfiehlt sich eine Konstante zu definieren:
final String GPIO_PATH = "/sys/class/gpio/";
// Beispiel: Port gpio4 einschalten
FileWriter fw = new FileWriter( GPIO_PATH + "gpio4/value");
fw.write( "1" );
fw.close();
// Beispiel: Port gpio4 ausschalten
FileWriter fw = new FileWriter( GPIO_PATH + "gpio4/value");
fw.write( "0" );
fw.close();
// Beispiel: Port gpio4 einschalten
FileWriter fw = new FileWriter( GPIO_PATH + "gpio4/value");
fw.write( "1" );
fw.close();
// Beispiel: Port gpio4 einlesen (ergibt "0" oder "1")
String result = "";
byte[] bytes = new byte[16];
FileInputStream fr = new FileInputStream( GPIO_PATH + exportPath );
try {
int len = fr.read( bytes, 0, bytes.length );
fr.close();
result = new String( bytes, 0, len );
}
catch (IOException e) {
System.err.println( e.toString() );
}
- Danke (nicht-sehr-kreative-ich-weiss-Name) schrieb am 25.6.2015 um 15:29 Danke,
einfache Lösung, vertraute Sprache :) - Enigma schrieb am 1.6.2015 um 14:08 Hallo,
habe mal versucht das C-Programm "GPIO lesen" mit dem Programm Code::Blocks umzusetzen.
Leider kommen bei mir einige Fehlermeldungen: references delay
Das selbe auch mit den anderen Funktionenen, wie z.B. digitalWrite oder digitalRead.
Bin leider noch sehr unerfahren...
Aber sonst ein wirklich super Tutorial, dass mir schon sehr geholfen hat. - Enigma schrieb am 2.6.2015 um 09:26 OK,
anscheinend wurde lwiringPI nicht installiert.
Wie kann ich denn explizit das installieren?
Schon mal vilen Dank. - Viktor schrieb am 30.6.2015 um 09:57 Hallo ich möchte wie oben Beschrieben
xbuild RaspberryPiDotNet.csproj
ausführen ! bekomme aber: bash xbuild nicht gefunden
wer hat noch so ein Problem ??? - Alex schrieb am 17.7.2015 um 16:14 Hi,
ich möchte mittels c# und der monodevelop-entwicklungsumgebung ein paar gpio`s auf dem raspi ansprechen...
mit c# hab ich ein klein wenig erfahrung(weshalb ich mich auch für mono entschlossen habe) --> so weit so gut...mono installiert und läuft!
danach hab ich wirklich alles so installiert wie oben beschrieben! (habe auch wirklich alles auf rechtschreibfehler etc überprüft)
Jetzt das Problem...als ich den code fertig hatte und kompilieren wollte, kam der Fehler : "The type or namespace name ´RaspberryPiDotNet`could not be found. Are you missing an assembly reference? (CS0246)
Ich hab in Linux nicht wirklich eine ahnung! Kann mir da vllt einer helfen, wäre echt klasse! Die dll hab ich eigentlich auch im Projektordner... ist da was bei der installation schief gegangen?
vielen dank
- Dr.Dish schrieb am 26.8.2015 um 11:42 Hier wird mal leicht verständlich für den Anfänger alles wichtige beschrieben. Danke
- Finn schrieb am 3.10.2015 um 15:05 Hey, danke erstmal für das Tutorial.
Ich habe aber leider ein Problem, nämlich wenn ich den Befehl
echo "1" > /sys/class/gpio/gpio17/value
ausführe, kommt zwar keine Fehlermeldung, aber mein daran angeschlossener Motor geht nicht an. Habe ihn auch schon an den Power- und Ground-pin angeschlossen und es hat funktioniert.
Kann mir jemand helfen?
Würde mich sehr freuen, LG Finn - Finn schrieb am 3.10.2015 um 15:07 P.S. kenne mich mit dem Thema echt nicht gut aus :P
- ZufälligVorbeiSurfer schrieb am 12.10.2015 um 21:59 Motor direkt am GPIO??? Die GPIO-Pins können nur wenige mA liefern. Das reicht gerade so für eine (moderne) LED. Wenn man einen größeren Verbraucher anschließt, dann passiert bestenfalls gar nichts. Mit nicht geringer Wahrscheinlichkeit aber verabschiedet sich der komplette Pi mit einem Rauchwölkchen im Nirwana...
Daher: Größere Verbaucher NIE direkt an die GPIOs hängen, sondern IMMER eine Ansteuerschaltung oder Verstärker oder Ähnliches dazwischen schalten!
- Finn schrieb am 18.10.2015 um 12:33 Oh, ok :D
Gut zu wissen, danke! - Phill schrieb am 3.10.2015 um 18:31 Hammer Tutorial, definitiv.
Habe aber dennoch eine Frage offen.
Ich bin ein Fan von CSharp und möchte die Pins über den Speicher ansteuern.
Und ich bin mir Unsicher ob ich die Pins dann dennoch Freischalten muss. Bin recht neu in der Materie und würde mich über eine Kurze und Informative antwort sehr freuen :) - gerd schrieb am 6.1.2016 um 21:56 "unsicher" und "freischalten" schreibt man klein! :)
- gerd schrieb am 6.1.2016 um 22:00 "kurze" und "informative" schreibt man klein, "Antwort" schreibt man groß. Lernt man das heute nicht mehr in der Schule?
- Milan schrieb am 8.11.2015 um 17:19 Super Einleitung in GPIO-PIN-Programmierung, danke. Aber ich will einen Schritt weiter gehen und muss einen "kontinuierlichen", d. h. synchronen, Datenstrom erzeugen, also sozusagen "harte Echtzeitanforderungen" einhalten.
Ich möchte gern eine Art Effektgerät für elektronische Musikinstrumente auf dem Raspi realisieren, also z.B. Klangquelle (Keyboard) am A/D-Umsetzer an SPI-Schnittstelle, Signal in Echtzeit bearbeiten ("drauf-rumrechnen") und dann an D/A-Umsetzer an SPI wieder ausgeben.
Das muss natürlich sauber getaktet werden mit der gewählten Abtastrate. Auf einem DSP würde ich jetzt (in ASSEMBLER) die Interruptvektor-Tabelle erstellen und eine zugehörige Interrupt Service Routine (ISR) erstellen. Der A/D-Umsetzer soll den Takt liefern. Ich weiß, dass der ARM des Raspi auch (natürlich) Interrupts verarbeiten kann.
Weiß jemand wie das in C realisiert wird? Hat jemand eine alternative Idee, den synchronen Datenstrom aufrecht zu erhalten? Braucht man eine Echtzeiterweiterung wie das XENOMAI etc.? Wie kann man gezielt die Gleitkommaeinheit ansprechen?
Über Tipps, Beipiele, Quellcodeabschnitte oder auch einfach Links für die eigene Recherche würde ich mich freuen. Habt Dank.
- joe schrieb am 15.11.2015 um 14:23 Hallo und Danke für die Anleitung. Aber wie kann ich das Blinken der LED wieder anhalten?
- Rafael schrieb am 8.12.2015 um 19:34 Hallo zusammen,
danke für die Einführung.
Allerdings ist bei dem Pythonteil ein Fehler drin. Dort steht, dass man Pin 18 mit Masse verbinden soll (z.B. Pin17) Das ist aber falsch. Pin17 ist 3.3V Versorgung und nicht Masse. Also nicht verwirren lassen, es soll 3.3V heißen und nicht Masse.
Wenn man Pin18 mit Masse verbindet wird es nicht funktionieren.
Gruß - M. schrieb am 10.12.2015 um 12:26 Muss man eigentlich den GPIO Export auch machen, wenn man nut Python benutzt, oder reicht es, wenn man die python-rpi.gpio installiert?
Die Anleitung ist super, ohne Schnick-Schnack, leicht verständlich! - R. schrieb am 10.12.2015 um 12:58 Nee, denke nicht, dass Du das dann auch machen musst. Also ich habe es nicht gemacht und alles hat funktioniert. Ich glaube, dass musst du nur machen, wenn Du die GPIOs über die Bash oder wiringPi ansprechen willst.
- M. schrieb am 10.12.2015 um 14:29 @R. Danke. Hab's grade mal probiert. Komme im Moment nicht physikalisch an den Raspberry. Aber folgendes Programm liefert die richtige Ausgabe.
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
pins = [7,8,10,11,12,13,15,16,18,19,21,22,23,24,26]
for i in pins:
if i % 2: #Pinnummer ist ungerade
GPIO.setup(i, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
else:
GPIO.setup(i, GPIO.IN, pull_up_down = GPIO.PUD_UP)
if GPIO.input(i) == GPIO.HIGH:
print str(i) + " = HIGH"
else:
print str(i) + " = LOW"
GPIO.cleanup()
Ausgabe:
7 = LOW
8 = HIGH
10 = HIGH
11 = LOW
12 = HIGH
13 = LOW
15 = LOW
16 = HIGH
18 = HIGH
19 = LOW
21 = LOW
22 = HIGH
23 = LOW
24 = HIGH
26 = HIGH
- MrBeam schrieb am 11.12.2015 um 16:33 Vielen Dank für diese tolle Anleitung!
Die Erklärung für die verschiedenen Zählvarianten der GPIO-Nummern fand ich besonders erhellend. Dank des Pythonbeispiels konnte ich meinen Morsecodegenerator endlich um eine physische Ausgabe erweitern :)
Für alle, die wie ich eine neuere Version des Pis benutzen, habe ich hier noch eine URL zum GPIO Layout für den B+.
http://pi4j.com/pins/model-b-plus.html - Sven schrieb am 19.12.2015 um 20:36 Bitte mal den C# Teil aktualisieren für Raspberry Pi 2.
Dort wird eine aktuellere Version der libbcm benötigt - wohl 1.39 oder größer. Habe selber gerade die aktuellste 1.48 genommen und dann blinkt das Lämpchen :)
Gibt es unter http://www.airspayce.com/mikem/bcm2835 - DDD schrieb am 5.1.2016 um 11:34 Super Tutorial!!
Aber bei "Pin's" für den Plural eines Pin, bekomme ich eine Gänsehaut! -.- - DDD schrieb am 5.1.2016 um 11:37 ...genauso wie bei "GPIO's"!
Das Plural-s wird OHNE Hochkomma hinten an das Singular angefügt. - tristans unterdurchnitlicher penis schrieb am 12.1.2016 um 10:41 er hat nen kleienn
- bass schrieb am 13.1.2016 um 13:38 Hallo bei mir lassen sich unter c# die Pin's nicht beschreiben (High oder Low) gpio17 ist immer low
- bass schrieb am 13.1.2016 um 15:04 Ok den vorherigen Fehler habe ich behoben aber wieso kann man die PinDirection nicht auf In umstellen?
- Alex schrieb am 8.2.2016 um 19:46 Hallo,
vielleicht kann mir jemand helfen?
Ich habe die C# Anleitung umgesetzt, doch es passiert einfach keine Veränderung an den In-/Outputs :(
using System;
using RaspberryPiDotNet;
namespace GPIOC
{
class MainClass
{
public static void Main (string[] args)
{
GPIOMem gpio17 = new GPIOMem(GPIOPins.V2_GPIO_17);
Console.WriteLine ("Hello World!");
while(true)
{
gpio17.Write(true);
Console.WriteLine (gpio17.Read ());
System.Threading.Thread.Sleep(2000);
gpio17.Write(false);
Console.WriteLine (gpio17.Read ());
}
}
}
} - mozart schrieb am 11.2.2016 um 13:02 hallo,
ich habe noch nicht viel Erfahrung mit dem Raspi. Will mit den Raspberry Zero 20 LED's ansteuern. Kann mir hier jemand knapp sagen, was ich an Material brauche und wie die Pins angesteuert werden ? (weil die GPIO's ja unterschiedlich angesteurt werden) - Andreas schrieb am 2.3.2016 um 21:39 @Felli
sudo usermod -aG gpio pi
reicht alleine nicht aus. Es fehlt noch
newgrp gpio
damit für den aktuellen eingeloggten Benutzer die Gruppe aktiv wird oder ein logout gefolgt von einem login. - David schrieb am 3.3.2016 um 08:23 Servus!
Danke für den leichen Einstieg! Klappt bestens :)
Jetzt habe ich aber eine Frage.
Ich will das wiringPi in ein anderes Projekt einbinden, damit ich verschiedene Modi mit LED anzeigen kann.
Habe einfach in meinem Makefile dsa -lwiringPi zu den Flags hinzugefügt. Bekommme aber dann den Fehler:
/usr/bin/ld: cannot find -lwiringPi
Wenn ich aber zb das Blink.c in mein Makefile mitaufnehme klappt das compilen.
Ich habe bereits eine -L Flag, die auf eine andere Bibliothek linkt.
Irgendeine Lösung?
Danke - molsondry schrieb am 5.3.2016 um 02:48 Hallo zusammen,
hier noch ein lauffähiges Beispiel in C ohne wiringPI. Man braucht zwei Dateien: GPIO.h und led-blink_c.c
/******************************************************
* GPIO.h
* General Purpose Input/Output (GPIO) Management
* for the RaspberryPI Model B Revision 1 and 2
* Functions:
* char * getGPIOPath(int cMode, char * cGPIONumber)
* void GPIO(char* portId, int state)
* void GPIOCtrl(_Bool active, char* portId, int direction)
* *****************************************************/
#include
#include
#include
enum{OFF, ON}; //value
enum{OUT, IN}; //direction
enum{EXPORT, UNEXPORT, DIRECTION, VALUE};
char cGPIOPath[30] = {""};
char * getGPIOPath(int cMode, char * cGPIONumber){
//Assemble the linux file system path for GPIO configuration
memset(cGPIOPath, 0, sizeof(cGPIOPath));
strcat(cGPIOPath, "/sys/class/gpio");
switch(cMode)
{
case EXPORT:
{
strcat(cGPIOPath, "/export");
break;
}
case UNEXPORT:
{
strcat(cGPIOPath, "/unexport");
break;
}
case DIRECTION:
{
strcat(cGPIOPath, "/gpio");
strcat(cGPIOPath, cGPIONumber);
strcat(cGPIOPath, "/direction");
break;
}
case VALUE:
{
strcat(cGPIOPath, "/gpio");
strcat(cGPIOPath, cGPIONumber);
strcat(cGPIOPath, "/value");
break;
}
}
return cGPIOPath;
}
void GPIO(char* portId, int state){
//Switch a port on or off_type
FILE *f = fopen(getGPIOPath(VALUE, portId), "w");
if (f == NULL)
{
printf("GPIO() - Error opening file!\n");
exit(1);
}
switch (state) {
case ON:{
fprintf(f, "%i", ON);
}
case OFF:{
fprintf(f, "%i", OFF);
}
}
fclose(f);
} //end void GPIO(char* portId, int state)
void GPIOCtrl(_Bool active, char* portId, int direction) {
//Activate/ deactivate a port and set direction (in or out)
char* sDirection;
FILE *f;
if (active){
//First activate GPIO (export)
f = fopen(getGPIOPath(EXPORT, portId), "w");
if (f == NULL)
{
printf("GPIOCtrl - Activate GPIO - Error opening file!\n");
exit(1);
}
fprintf(f, "%s", portId);
fclose(f);
//Now set direction of GPIO (in or out)
f = fopen(getGPIOPath(DIRECTION, portId), "w");
if (f == NULL)
{
printf("GPIOCtrl - Set direction GPIO - Error opening file!\n");
exit(1);
}
if(direction==OUT) sDirection="out"; else sDirection="in";
fprintf(f,"%s",sDirection);
fclose(f);
}
else {//not active, close GPIO
f = fopen(getGPIOPath(UNEXPORT, portId), "w");
if (f == NULL)
{
printf("GPIOCtrl - not active - Error opening file!\n");
exit(1);
}
fprintf(f, "%s", portId);
fclose(f);
}
}//end GPIOCtrl()
//end GPIO.h
/*******************************************
* led-blink_c.c
*
*******************************************/
#include
#include
#include
#include "GPIO.h"
void GPIO(char*, int);
void GPIOCtrl(_Bool, char*, int);
int main(int argc, char** argv)
{
int i;
printf("Create GPIO Port\n");
GPIOCtrl(true, "23", OUT);
GPIO("23", ON);
for (i=1;i - molsondry schrieb am 5.3.2016 um 02:54 Leider funktioniert in diesem Forum immer noch nicht das "
- molsondry schrieb am 5.3.2016 um 02:57 Leider funktioniert in diesem Forum immer noch nicht das "<"Zeichen
- molsondry schrieb am 5.3.2016 um 03:01 /******************************************************
* GPIO.h
* General Purpose Input/Output (GPIO) Management
* for the RaspberryPI Model B Revision 1 and 2
* Functions:
* char * getGPIOPath(int cMode, char * cGPIONumber)
* void GPIO(char* portId, int state)
* void GPIOCtrl(_Bool active, char* portId, int direction)
* *****************************************************/
#include <stdbool.h>
#include <string.h>
#include <fcntl.h>
enum{OFF, ON}; //value
enum{OUT, IN}; //direction
enum{EXPORT, UNEXPORT, DIRECTION, VALUE};
char cGPIOPath[30] = {""};
char * getGPIOPath(int cMode, char * cGPIONumber){
//Assemble the linux file system path for GPIO configuration
memset(cGPIOPath, 0, sizeof(cGPIOPath));
strcat(cGPIOPath, "/sys/class/gpio");
switch(cMode)
{
case EXPORT:
{
strcat(cGPIOPath, "/export");
break;
}
case UNEXPORT:
{
strcat(cGPIOPath, "/unexport");
break;
}
case DIRECTION:
{
strcat(cGPIOPath, "/gpio");
strcat(cGPIOPath, cGPIONumber);
strcat(cGPIOPath, "/direction");
break;
}
case VALUE:
{
strcat(cGPIOPath, "/gpio");
strcat(cGPIOPath, cGPIONumber);
strcat(cGPIOPath, "/value");
break;
}
}
return cGPIOPath;
}
void GPIO(char* portId, int state){
//Switch a port on or off_type
FILE *f = fopen(getGPIOPath(VALUE, portId), "w");
if (f == NULL)
{
printf("GPIO() - Error opening file!\n");
exit(1);
}
switch (state) {
case ON:{
fprintf(f, "%i", ON);
}
case OFF:{
fprintf(f, "%i", OFF);
}
}
fclose(f);
} //end void GPIO(char* portId, int state)
void GPIOCtrl(_Bool active, char* portId, int direction) {
//Activate/ deactivate a port and set direction (in or out)
char* sDirection;
FILE *f;
if (active){
//First activate GPIO (export)
f = fopen(getGPIOPath(EXPORT, portId), "w");
if (f == NULL)
{
printf("GPIOCtrl - Activate GPIO - Error opening file!\n");
exit(1);
}
fprintf(f, "%s", portId);
fclose(f);
//Now set direction of GPIO (in or out)
f = fopen(getGPIOPath(DIRECTION, portId), "w");
if (f == NULL)
{
printf("GPIOCtrl - Set direction GPIO - Error opening file!\n");
exit(1);
}
if(direction==OUT) sDirection="out"; else sDirection="in";
fprintf(f,"%s",sDirection);
fclose(f);
}
else {//not active, close GPIO
f = fopen(getGPIOPath(UNEXPORT, portId), "w");
if (f == NULL)
{
printf("GPIOCtrl - not active - Error opening file!\n");
exit(1);
}
fprintf(f, "%s", portId);
fclose(f);
}
}//end GPIOCtrl()
//end GPIO.h
/*******************************************
* led-blink_c.c
*
*******************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "GPIO.h"
void GPIO(char*, int);
void GPIOCtrl(_Bool, char*, int);
int main(int argc, char** argv)
{
int i;
printf("Create GPIO Port\n");
GPIOCtrl(true, "23", OUT);
GPIO("23", ON);
for (i=1;i <= 10;i++){
printf("Switch ON\n");
GPIO("23", OFF);
printf("sleep..\n");
sleep(1);
printf("Switch OFF\n");
GPIO("23", ON);
printf("sleep..\n");
sleep(1);
}
printf("Remove GPIO Port\n");
GPIOCtrl(false, "23", 0);
return 0;
}
- Manfred schrieb am 3.4.2016 um 19:32 Sehr gute Einführung für Anfänger wie mich! Danke!
Einen Fehler habe ich festgestllt:
Das Kommando "pi@raspberrypi ~ $ cd WiringPi" führt zu einer Fehlermeldung. Richtig ist "pi@raspberrypi ~ $ cd wiringPi" (wiringPi mit kleinem "w")
Ergänzende Hinweise:
1.
Nach dem Kapitel "Variante 2: Export mit WiringPi" muss der Port noch frei gegeben werden.
"pi@raspberrypi ~ $ gpio unexport 17"
2.
Auf deutscher Tastatur ist der Doppelpukt im vi-Editor ist ein großes "Ö"
- Markus schrieb am 7.4.2016 um 14:03 In der csharp Lösung:
gpio.cs(20,27): error CS0019: Operator `==' cannot be applied to operands of type `RaspberryPiDotNet.PinState' and `bool' - Kayden schrieb am 9.5.2016 um 18:19 De shopping non, ces petites robes ne sont ni de mon goût ni de mon style, mais que la couleur ensivashe à nouveau les rues oh que oui. Marre des noirs sinistres (et mochasses il faut bien le dire).
- DagiBee schrieb am 6.8.2016 um 19:08 shut up frazose
- Janese schrieb am 11.5.2016 um 18:51 Gave, I really appreciate your &q;uquunreview&toot;. You are a reviewer but at the same time also a reader. So I liked to read your impression as a reader. I will get my copy of TWELVE in July 2009.I read several books with a "flat" beginning. Despite your unreview – which I understand very well when I think about other books I read – I will give it a try and don't cancel my preorder.Anyway if there is a need for more unreviews please post them. http://svopbxz.com [url=http://hpnhxspkzcf.com]hpnhxspkzcf[/url] [link=http://dddhlwtzufa.com]dddhlwtzufa[/link]
- Ice schrieb am 14.5.2016 um 08:58 Por eso es que digo que muchos hablan de comunismo, sooiclisma, izquierda y demás, pero están justo en el extremo opuesto. La verdad es que Europa está cada vez más a la derecha.Un saludo. http://tmsuagaj.com [url=http://ttddywfakvc.com]ttddywfakvc[/url] [link=http://brfyvb.com]brfyvb[/link]
- Horst schrieb am 18.5.2016 um 00:33 Diese Anleitung hätte noch einen größeren Charme, wenn sie auch funktionieren würde.
Beim Compilieren kommen Fehlermeldungen dass er die Referenzen wie piMode, delay, etc. nicht kennt.
Weiterhin wurden bei der Installation Hinweise gegeben, dass zur Nutzung diese Library noch weitere Libraries erforderlich sind, damit es in C-Programmen genutzt werden kann.
- DagiBee schrieb am 6.8.2016 um 19:02 Was für Elektrotechnik lan
- Wolfgang schrieb am 15.9.2016 um 17:03 Danke für die Programmierbeispiele!
Kann ich über den "export" in der Bash auch solche Pins für eigene Zwecke bereitstellen, die mit "MOSI", "MISO", u.a. bezeichnet sind? In allen Anleitungen und Büchern, die ich bis jetzt gefunden habe, werden für diese Zwecke immer nur die 12 Pins benutzt, die mit "GPIO-0" bis "GPIO-11" bezeichnet werden. Was aber mache ich, wenn ich für ein Projekt mehr als 12 Taster / Schalter anschließen will? - Raspberry.Tips schrieb am 23.10.2016 um 12:57 Schaut euch doch mal das Interaktive GPIO Tool an, auf einen Klick bekommt ihr alle Infos zu den Raspberry Pi GPIOs
http://raspberrypi.ws/ - Achim schrieb am 5.11.2016 um 07:20 Herzlichen Dank für diese simpel geschriebene Seite. Mit der en Hilfe habe sogar ich es gschafft meine RasPi 3 B zum laufen zu bekommen.
Jetzt möchte ich damit aber die GPIOs ansteuern. Ich glaube das c++ für mich das Richtige ist (hab aber noch gar keine Kenntnisse). Wie bekomme ich denn den c++ Compiler auf die RasPi?
Danke für eunre Hilfe,
Achim
- pulsar schrieb am 16.11.2016 um 21:48 Hi Achim, der g++(C++ Compiler) sollte sich bereits vorinstalliert auf deinem aktuellen Raspbian System befinden. Du kannst auch nochmal nachsehen, am besten kann ich das auf der Konsole(Terminal hier beschreiben) einfach copy & past:
pi@raspberrypi:~ $ apt list g++
Auflistung... Fertig
g++/stable,now 4:4.9.2-2 armhf [Installiert,automatisch]
wenn der obige Kommando (apt list g++) ein "Installiert,automatisch" zurück gibt ist der Compiler drauf :-)
Falls nicht instalierst du ihn mit
sudo apt update && apt install g++
Viel Erfolg.
- Test schrieb am 17.12.2016 um 20:13 hier ist code drinne XDD
- . schrieb am 18.12.2016 um 10:03 Moin, wäre es eigentlich möglich, den RasPi in der Arduino Sprache zu programmieren?
- JavaFtw schrieb am 21.2.2017 um 19:10 Zur Programmierung mit Java bietet sich auch super pi4j an, sehr komfortable Bibliothek
Download, Beispiele etc. -> www.pi4j.com - _ schrieb am 18.12.2016 um 10:12 TestTest
- Lalalala schrieb am 18.12.2016 um 10:12 Moin, wäre es eigentlich möglich, den RasPi in der Arduino Sprache zu programmieren?
- clemens schrieb am 10.1.2017 um 10:30 Als Neuling mit einem raspberry muss ich leider feststellen, dass keine einzige Befehlseingabe von den oben gemachten Vorschlägen wirklich läuft!
Die Seite setzt zu viele Kenntnisse im Umgang mit Linux bzw. mit dem Raspberry voraus. z.B. klappt der Wechsel zur root "su root" nicht weil anscheinend das Passwort nicht stimmt, und... und... und...
Enttäuschend!
System: Raspberry 3 B, python idle
- StevenGuisy schrieb am 15.1.2017 um 16:07 ziola na kwas moczowy podagra ziola http://seeknet.pl/ dna moczanowa przyczyny powstania dieta w dnie moczanowej
- ReX schrieb am 23.1.2017 um 13:17 @clemens
Dafür kann jedoch der Tutorial ersteller nichts, denn das standard passwort beim raspbian image wurde vor kurzem erst auf robots1234 geändert (von ehemals raspberry)
Gruß
- ThomEi schrieb am 27.1.2017 um 15:30 Hello. And Bye.
- Oszi schrieb am 6.10.2017 um 23:27 Hallo,
danke für die gute Einführung.
Ich möchte mit dem BananaPi Signale generieren, die ich dann am Oszilloskop darstellen lasse.
Dabei ist ein Warten von mindestens einer Millisekunde doch recht lang.
Gibt es eine Möglichkeit, die Pins schneller von HIGH auf LOW und zurück zu setzen, um eine höhere Frequenz als 1kHz zu erreichen?
Gibt es außerdem eine Möglichkeit, statt eines Rechtecks (Wechsel zwischen 3,3 V und 0 V) die Spannung stufenweise zu ändern und so eher ein Sinus-Signal zu erreichen?
Danke! - Horst GL.. schrieb am 28.1.2018 um 09:02 Ein sehr schöner Beitrag, der es mir erlaubt bei der Sprache C zu bleiben.
Vielen Dank für den leichten Einstieg zum Raspberry Pi! - Matthias schrieb am 10.2.2018 um 18:06 Danke für die vielen Informationen. Kann ich denn PIN 8(TX) und 10(RX) ohne Widerstand gefahrlos miteinander verbinden und dann die serielle Schnittstelle RS232 testen. Ich würde mir gerne etwas senden und dann gleichzeitig empfangen?
Wie hoch müsste der Widerstand im Fall eines Falles denn sein?
Gruß und Danke vorab!
- KennethTuH schrieb am 10.3.2018 um 22:44 Pozitiv - это негормональный препарат, который помогает вашему организму выработать серотонин и мелатонин, которых так не хватает для радости!
Сайт: http://doctorslivedigest.com/I4jQy/ - OscarArren schrieb am 22.9.2018 um 14:13 Dowody także poruczenia spośród matmy
Przed Tobą przymiary z matmy, jakie zostawiły skończone osobno dla każdej spośród kurtuazji, właściwie przypadkiem mógł przenikać posłannictwa dostrojone do Twojego gustu oświat. Łączne przymiary są zgodliwe z obecną ideą programową, oraz ich posiał na jedno jakości istnieje dobrany do najwspanialszych skryptów, co powinno zasadniczo uprościć wyjaśnianie sprawdzianów. Gdyby jakiegoś zadania nie zdołasz urzeczywistnić (gdyż np. nie podejmował któregokolwiek żądania w miejscowej tendencji), wtedy nie pożyczaj się – obcowań podobno dopiero dzięki bieżącemu wyuczysz się cokolwiek różnego, co chyba figę pojawi się na jednorazowej z klasówek czyli wyznaczników na nauczki. W incydentu niewiele wątków pułap erudycji pomiędzy oddzielnymi skalami egzystuje rzeczywiście pokaźnie równy, więc stymuluję Cię do wyjaśniania również bieżących zadań, jakie są wydatkowane dla kurtuazji starszych/młodszych.
Po odgadnięciu oddanego eksperymentu doświadczysz narodowy dorobek punktowy i wypowiedź, którą wybuduje Bieżący aparat. Wegetuje czasami granicę zobaczenia bezpośredniego kwestionariusza, wypróbowania dostatecznych replik, zaś poniekąd poznania się spośród rozszerzonym rozładowaniem sprezentowanego wypracowania. Więc oraz należałoby zaryzykować wypowiadać dowody samowładnie, podchodząc owe probierze jako skłonność wizytacji należących orientacji. Kto wie, być pewnie tylko dzięki współczesnemu osiągniesz wykwintniejszą degustację na probierzu edukacyjnym. Efektywnej gałęzi!
matematyka sprawdzian
Arkusiki do miernika szóstoklasisty 2016 spośród matmy bieżące najświeższa gazeta zamykająca arkusiki egzaminacyjne z odpowiedziami dodatkowo każde naczelne rady interesujące specyfikacji niedostępnego sprawdzianu.
Rozprawka przetrzymuje się z:
opisu ważnego przymiaru w przeróbce definitywnej z roku oświatowego 2014/2015,
15 świstków z matmy zbudowanych na synonim zestawów Podstawowej Grupy Egzaminacyjnej,
sumy do działań z wykładami, które uściślają udany pomoc odłączania oderwanych agregatów zleceń.
Argumentem książeczki istnieje skrzydełko z mapą replice. Zezwala wyćwiczyć finezja bezbłędnego szyfrowania założeń niedrożnych na deklaracji repliki, która przynosi filozofię dominacji szóstoklasistów.
Twórcami zleceń są zasłużeni egzaminatorzy, i którekolwiek pakiety są dobrane ze zabytkami Nadrzędnej Radzie Egzaminacyjnej przeglądają kompetencji ścisłe w płaszczyźnie projektowej a proszone na probierzu szóstoklasisty. - Enid Sidney schrieb am 17.10.2018 um 17:46 Dear Sir/Madam,
Nice to satisfy you. I am Joseph from Bluetooth Gadget Ltd, a Hong Kong based innovation company focused on Bluetooth and also wireless items including: Bluetooth headsets, speakers, adapters, billing gadgets as well as selection of car devices.
Today item:
Hifi High Quality Bass Stereo Mini Portable Wireless Bluetooth Speakers (Metal Hues).
Offering factor 1: High Audio Quality with Bluetooth V4.1.
Marketing point 2: 5W in mini cutie style, Easy to carry, perfect for outside.
Have you located that the majority of the cordless audio speaker are either inadequate sound high quality or also hefty to bring outdoors?
Please check our enhanced version of Bluetooth V4.1 mini audio speaker! Our designers invested over half year to choose the top product from hundreds for this little speaker, simply to quest for the very best audio high quality amongst the similar speakers.
Because we were Music Lovers who launched with Do It Yourself Tube Preamp considering that 2008!
Hi-Fi Quality! Long lasting battery! Grand Metallic Colors!
Connect to find out more:
https://www.bluetooth-device.com/index.php?route=product/product&product;_id=125
We only create finest items, both in feature and also expectation layout.
Hi-Fi High quality! Long long-term battery! Grand Metallic Colors!
Have a nice day!
Best regards,
Matthew
Sales Manager
Bluetooth Device
6F Leader Industrial Centre,
57 Au Pui Wan Street,
Fo Tan,
Hong Kong
Whatsapp/wechat: 852-64628287
Email: [email protected] - be0 schrieb am 16.1.2019 um 22:16 GPIO-Example-String should > 30 char; else ERROR.
char cGPIOPath[30] = {""};
Best regards. - be0 schrieb am 25.1.2019 um 23:18 Hi!
My pi needs some time to export (and create) path at /sys/class/gpio/ to create entry (e.g.) "/sys/class/gpio/gpio24".
I've change "gpio_path_get"-function and add enum "BASEPATH" to check if path for this port ist created. If not: create it an wait...
#ifndef GPIO_H_
#define GPIO_H_
#include
#include
#include
#include
#include
#include
enum{OFF, ON}; //value
enum{OUT, IN}; //direction
enum{BASEPATH, EXPORT, UNEXPORT, DIRECTION, VALUE};
char c_gpio_path[64] = {""};
char* gpio_path_get(int c_mode, char* c_gpio_number) {
//Assemble the linux file system path for GPIO configuration
memset(c_gpio_path, 0, sizeof(c_gpio_path));
strcat(c_gpio_path, "/sys/class/gpio");
switch(c_mode) {
case BASEPATH : {
strcat(c_gpio_path, "/gpio");
strcat(c_gpio_path, c_gpio_number);
break;
}
case EXPORT: {
strcat(c_gpio_path, "/export");
break;
}
case UNEXPORT: {
strcat(c_gpio_path, "/unexport");
break;
}
case DIRECTION: {
strcat(c_gpio_path, "/gpio");
strcat(c_gpio_path, c_gpio_number);
strcat(c_gpio_path, "/direction");
break;
}
case VALUE: {
strcat(c_gpio_path, "/gpio");
strcat(c_gpio_path, c_gpio_number);
strcat(c_gpio_path, "/value");
break;
}
}
return c_gpio_path;
}
void gpioset(char* port_id, int state) {
//Switch a port on or off_type
FILE *f = fopen(gpio_path_get(VALUE, port_id), "w");
if (f == NULL) {
printf("GPIO() - Error opening file!\n");
exit(1);
}
switch (state) {
case ON: {
fprintf(f, "%i", ON);
break;
}
case OFF: {
fprintf(f, "%i", OFF);
break;
}
}
fclose(f);
}
int gpioget(char* port_id) {
char result[3] = {0};
FILE *f;
f = fopen(gpio_path_get(VALUE, port_id), "r");
if (f==NULL) {
printf("gpio_ctrl - Can't read value - Error opening file!\n");
return (-1);
exit(1);
}
size_t newLen = fread(result, sizeof(char), 3, f);
if (newLen == 0) {
printf("Error opening file");
} else {
result[newLen] = '\0';
}
fclose(f);
return (atoi(result));
}
void gpio_ctrl(_Bool active, char* port_id, int direction) {
//Activate/ deactivate a port and set direction (in or out)
char* s_direction;
FILE *f;
struct stat info;
if (active) {
//First activate GPIO (export) wenn noch nicht vorhanden!
if (stat(gpio_path_get(BASEPATH, port_id), &info;) != 0) {
f = fopen(gpio_path_get(EXPORT, port_id), "w");
if (f == NULL) {
printf("gpio_ctrl - Activate GPIO - Error opening file!\n");
exit(1);
};
fprintf(f, "%s", port_id);
fclose(f);
sleep(5);
};
//Now set direction of GPIO (in or out)
f = fopen(gpio_path_get(DIRECTION, port_id), "w");
if (f == NULL) {
printf("gpio_ctrl - Set direction GPIO - Error opening file!\n");
printf("port_ctrl %s", port_id, "\n");
exit(1);
}
if(direction==OUT) s_direction="out"; else s_direction="in";
fprintf(f,"%s",s_direction);
fclose(f);
}
else { //not active, close GPIO
f = fopen(gpio_path_get(UNEXPORT, port_id), "w");
if (f == NULL) {
printf("gpio_ctrl - not active - Error opening file!\n");
exit(1);
}
fprintf(f, "%s", port_id);
fclose(f);
}
}
#endif /* GPIO_H_ */
Best regards. - Clients for free schrieb am 30.1.2019 um 06:32 Hi I was just on your website I did not see a link for affiliates, so I am going to take a wild guess that you do not use any to promote your company :)
How about we bring you in sales without you paying for leads or ads or SEO or anything like that!
Imagine having access to 4,000 affiliates that only got paid when they bring you a paying client\sale! yep no paying for leads or emails, just paying for results.
Our company has access to 4,000 affiliates that use paid ads such as Google, Facebook and Youtube from there own resources to bring you in paying clients! you don't pay out for their time or their ad costs you just pay on what matters results!
I would love to get on a quick 15-minute call with you to discuss putting your service and products in front of our 4k affiliates and bringing in you fresh clients.
We will help your business grow while you only pay for what matters REAL results!
find out more information and book a call with me here
http://www.enzlo.online
The call will just be around 15 minutes and we can discuss where your at business-wise and how our networks can get you, new clients.
I am looking forward to having a chat with you..
have a great day ahead.
Clients for free - xlwrzq schrieb am 13.6.2019 um 13:06 where to order cialis online http://canadian-pharmacyes.com
generic cialis 20mg - Luc schrieb am 23.9.2019 um 14:28 Brauche eure Hilfe:
Kann man GPIO 9 und GPIO 10 (Pin 19 und 21) als digitele Eingänge nutzen?
Grundsätzlich sind die Pins ja für den SPI-Bus gedacht, möchte aber die beiden Pins als DI nutzen.
Ist das möglich? Falls ja, wie? - ShanePeets schrieb am 27.12.2019 um 13:26 Hi, thanks pro the info. I be deficient in to caution you to look here Online free familiarity
- RonTrund schrieb am 1.7.2020 um 12:27 Restaurierung von Bädern in Krasnogorsk
- RobertTed schrieb am 17.9.2020 um 09:41 Доброго времени суток! Приветствуем вас на страницах нашего информационного сайта!
В рамках данной статьи мы хотим поведать Вам о том, как быстро влиться в свой политический путь.
Сейчас на территории России можно найти множество политических партий под любые политические взгляды и мировозрения.
Наиболее популярными являются парламентские партии ЛДПР и Единая Россия.
Данные политические партии занимаются не только политическими вопросами страны, но и проводят активную работу с молодежью, за счет внутрипартийных молодежных организаций.
В последние годы соц. опросы показывают, что популярность среди граждан у данных партий неизменно растет.
Для того, чтобы присоедениться к молодежной организации представителям молодежи необходимо найти на электронной карте адрес ближайшего отделения политической партии, и посетить его, прихватив с собой минимальный комплект документов.
Для того, чтобы правильно выбрать политическую партию, мы рекомендуем ознакомиться с ее деятельностью на официальном сайте организации. В разделе новостей политической партии представлена информация о последних проведенных социальных акциях и мероприятиях, проведенных отделением политической партии.
Чем больше в выше указанном разделе новостей, тем активнее работает партийная организация с гражданами.
Дополнительно для привлечения электората в свои ряды, партии проводят агитацию как в местных СМИ, так и на своих региональных каналах теле-радио вещания.
Наиболее активные сторонники политических партий награждаются знаками отличия и медалями почетных членов организации. Социальная работа в партии помогает всем жителям страны улучшить качество своей жизни, и повлиять на политическую ситуацию в стране. Наиболее активные члены партии баллотируются в дупутаты разных уровней, что помогает им быстрее и эффективнее вести свою политическую деятельность.
Желаем Вам сделать правильный выбор при выборе политической организации на ваш вкус!