PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Raspberry Pi GPIO



Kampi
03.10.2012, 23:11
Hallo Forum,

auf Grund einer Nachfrage von meiner Webseite habe ich mal ein kleines C-Programm entwickelt um die GPIOs per Konsolenaufruf zu schalten.
Ich wollte dann noch zusätzlich eine PWM mit ins das Programm reinbasteln nur da bin ich nicht sicher ob das mit der Methode die ich aktuell verwende überhaupt machbar ist. Vielleicht kann mir ja jemand eine Antwort darauf geben :)

Hier ist schon mal das Programm für alle die die es gerne mal ausprobieren wollen



// Compile with: gcc /var/Programme/UART.c -o /var/Programme/UART

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>


int fd;


char GPIO[3][30] = {"/sys/class/gpio/gpio0/value", // Array für die GPIOs
"/sys/class/gpio/gpio1/value",
"/sys/class/gpio/gpio4/value"};


int main(int argc, char** argv) // Programmstart
{
int res;
int i;


printf("Anzahl Argumente: %d \n", argc); // Ausgabe der Anzahl der übergebenen Argumente

for(i = 0; i < argc; i++) // Argumente ausgeben
{
printf("argv[%d] = %s\n", i, argv[i]);
}

if (argc >= 1) // Sind Argumente übergeben worden?
{
for(i = 1; i < argc; i++)
{
fd = open(GPIO[i-1], O_WRONLY | O_NOCTTY); // Datei mit der Indexnummer "i-1" öffnen und Name unter "fd" speichern
res = write(fd, argv[i], 1); // Argument mit der Nummer "i" in die geöffnete Datei schreiben
close (fd); // Datei schließen
}
}
return 0;
}


Der Aufruf in der Konsole erfolgt dann so:

./Programmname Bit1 Bit2 Bit3

Sprich bei mir sieht es im Moment so aus:

./GPIO 1 0 1

Sinn und Zweck ist die Ansteuerung einer RGB LED.
Deswegen auch die PWM :)

Klebwax
04.10.2012, 07:50
Ich habe keinen Pi, kann also nur spekulieren.

Es könnte eine PWM im Kernel geben. Der Devicetreiber würde dann über das Filesystem angesprochen werden. Dazu müßte es aber eine Doku geben.

Ansonsten muß man eine Software-PWM implementieren, die aus dem User-Mode ein (oder auch drei) Portbit mit dem passenden Muster ansteuert.

Eine weitere Möglichkeit ist, selbst ein PWM Device als Kernel-Mode Treiber zu schreiben. Das kann (wird) aber ziemlich komplex werde. Kernel-Module sind ein Kapitel für sich.

MfG Klebwax

Kampi
03.11.2012, 15:53
Kurzer Nachtrag....
Ich wollte gerade die GPIOs auslesen. Aber statt 0 und 1 bekomme ich als Wert 48 und 49 raus (und das bei allen drei GPIOs wo ich es getestet habe). Was sind das für zwei andere Bits die permanent gesetzt sind?
Kann mir das jemand sagen?

DanielSan
04.11.2012, 23:24
Kann es sein das du den Datentypen falsch hast? Guck mal in die Ascii Tabelle 48 = 0 und 49 = 1.

Gruß Daniel

Kampi
04.11.2012, 23:45
Stimmt.....der Wert steht da als ASCII in der Datei drin und ich lese auch einen ASCII aus.
Danke für den Hinweis. Dann ist es ja kein Problem, sondern nur ein anderer Datentyp.