Hallo
wer wie ich auf einem 386er unter DOS das programmieren mit QBasic für sich entdeckt hat, wird mir warscheinlich zustimmen wenn ich behaupte das Basic an und für sich eigentlich keine schlechte Programmiersprache war/ist, insbesondere wenn es um die RaspberryPI Entwicklung geht. Viele kleinere Projekte könnten warscheinlich mühelos in Basic umgesetzt werden. Nun gibt es ein kleines Entwicklerteam welches es sich zur aufgabe gemacht hat, FreeeBasic auf ARM6/7 zu porten. Die aktuellste version funktioniert soweit ich bisher getestet habe sehr gut. Wie aber nun greife ich z.B. auf die GPIO's zu? Ganz einfach! Dazu verwendet man einfach wiringPi welches, dank der Art und Weise wie FBC funktioniert und arbeitet, sich reibungslos einbinden lässt!
Aber nun genug der warmen Worte. Ich gehe in diesem Tutorial von einem Rev. 2 RPi aus der Raspbian installiert hat, da das wohl die gängiste "Anfänger" kombination ist.
Zu allererst sollten wir uns eine Kopie des FBC für ARM6 besorgen. Zu finden in diesem Post:
http://www.freebasic.net/forum/viewtopic.php?f=17&t=21312&start=60#p189339
Loggen wir uns also in unseren Pi ein (per SSH) und laden die datei via
herunter und entpacken sie über folgendes Kommando
danach wechseln wir in das FBC verzeichnis:
und installieren es
Nun sollte FBC installiert sein. Testen kann man dies indem man einfach "fbc" eintippt und schaut ob was passiert
Um wiringPi zu Installieren folgt ihr einfach der Anleitung auf folgender Seite (Englisch)
http://wiringpi.com/download-and-install/
Wenn ihr das geschafft habt steht eigentlich auch schon das Grundsystem um den Pi und die GPIOs mit Basic zu nutzen.
Hallo Welt
Natürlich möchten wir auch Testen ob alles funktioniert!
Wir erstellen uns also unsere "Blink.bas" (am besten in einem sepraten Verzeichnis)
#include once "wiringPi.bi"
'WiringPi initialisieren (oder eben auch nicht)
if wiringPiSetup = -1 then
END
end if
'GPIO 17 (für wPi 0) auf Ausgang stellen
pinMode(0, MODE_OUTPUT)
'LED Blinken lassen
do until inkey = chr(27)
digitalWrite(0, 1)
sleep(500)
digitalWrite(0, 0)
sleep(500)
loop
Alles anzeigen
Wenn wir nun versuchen unser kleines Programm mit
zu kompilieren erhalten wir erstmal einen Fehler, wiringPi.bi wird vermisst.
entweder man nutzt nun "Swig" um sich den C Header für FreeBasic nutzbar zu machen oder man erstellt einfach die Datei "wiringPi.bi" und fügt folgenden Inhalt ein.
''
''
'' wiringPi -- header translated with help of SWIG FB wrapper
''
'' NOTICE: This file is part of the FreeBASIC Compiler package and can't
'' be included in other distributions without authorization.
''
''
#ifndef __wiringPi_bi__
#define __wiringPi_bi__
#define NUM_PINS 17
#define WPI_MODE_PINS 0
#define WPI_MODE_GPIO 1
#define WPI_MODE_GPIO_SYS 2
#define WPI_MODE_PHYS 3
#define WPI_MODE_PIFACE 4
#define WPI_MODE_UNINITIALISED -1
#define MODE_INPUT 0
#define MODE_OUTPUT 1
#define PWM_OUTPUT 2
#define GPIO_CLOCK 3
#define LOW 0
#define HIGH 1
#define PUD_OFF 0
#define PUD_DOWN 1
#define PUD_UP 2
#define PWM_MODE_MS 0
#define PWM_MODE_BAL 1
#define INT_EDGE_SETUP 0
#define INT_EDGE_FALLING 1
#define INT_EDGE_RISING 2
#define INT_EDGE_BOTH 3
type wiringPiNodeStruct
pinBase as integer
pinMax as integer
fd as integer
data0 as uinteger
data1 as uinteger
data2 as uinteger
data3 as uinteger
pinMode as sub cdecl(byval as wiringPiNodeStruct ptr, byval as integer, byval as integer)
pullUpDnControl as sub cdecl(byval as wiringPiNodeStruct ptr, byval as integer, byval as integer)
digitalRead as function cdecl(byval as wiringPiNodeStruct ptr, byval as integer) as integer
digitalWrite as sub cdecl(byval as wiringPiNodeStruct ptr, byval as integer, byval as integer)
pwmWrite as sub cdecl(byval as wiringPiNodeStruct ptr, byval as integer, byval as integer)
analogRead as function cdecl(byval as wiringPiNodeStruct ptr, byval as integer) as integer
analogWrite as sub cdecl(byval as wiringPiNodeStruct ptr, byval as integer, byval as integer)
next as wiringPiNodeStruct ptr
end type
extern wiringPiNodes alias "wiringPiNodes" as wiringPiNodeStruct ptr
declare function wiringPiFailure cdecl alias "wiringPiFailure" (byval fatal as integer, byval message as zstring ptr, ...) as integer
declare function wiringPiFindNode cdecl alias "wiringPiFindNode" (byval pin as integer) as wiringPiNodeStruct ptr
declare function wiringPiNewNode cdecl alias "wiringPiNewNode" (byval pinBase as integer, byval numPins as integer) as wiringPiNodeStruct ptr
declare function wiringPiSetup cdecl alias "wiringPiSetup" () as integer
declare function wiringPiSetupSys cdecl alias "wiringPiSetupSys" () as integer
declare function wiringPiSetupGpio cdecl alias "wiringPiSetupGpio" () as integer
declare function wiringPiSetupPhys cdecl alias "wiringPiSetupPhys" () as integer
declare sub pinModeAlt cdecl alias "pinModeAlt" (byval pin as integer, byval mode as integer)
declare sub pinMode cdecl alias "pinMode" (byval pin as integer, byval mode as integer)
declare sub pullUpDnControl cdecl alias "pullUpDnControl" (byval pin as integer, byval pud as integer)
declare function digitalRead cdecl alias "digitalRead" (byval pin as integer) as integer
declare sub digitalWrite cdecl alias "digitalWrite" (byval pin as integer, byval value as integer)
declare sub pwmWrite cdecl alias "pwmWrite" (byval pin as integer, byval value as integer)
declare function analogRead cdecl alias "analogRead" (byval pin as integer) as integer
declare sub analogWrite cdecl alias "analogWrite" (byval pin as integer, byval value as integer)
declare function wiringPiSetupPiFace cdecl alias "wiringPiSetupPiFace" () as integer
declare function wiringPiSetupPiFaceForGpioProg cdecl alias "wiringPiSetupPiFaceForGpioProg" () as integer
declare function piBoardRev cdecl alias "piBoardRev" () as integer
declare function wpiPinToGpio cdecl alias "wpiPinToGpio" (byval wpiPin as integer) as integer
declare function physPinToGpio cdecl alias "physPinToGpio" (byval physPin as integer) as integer
declare sub setPadDrive cdecl alias "setPadDrive" (byval group as integer, byval value as integer)
declare function getAlt cdecl alias "getAlt" (byval pin as integer) as integer
declare sub digitalWriteByte cdecl alias "digitalWriteByte" (byval value as integer)
declare sub pwmSetMode cdecl alias "pwmSetMode" (byval mode as integer)
declare sub pwmSetRange cdecl alias "pwmSetRange" (byval range as uinteger)
declare sub pwmSetClock cdecl alias "pwmSetClock" (byval divisor as integer)
declare sub gpioClockSet cdecl alias "gpioClockSet" (byval pin as integer, byval freq as integer)
declare function waitForInterrupt cdecl alias "waitForInterrupt" (byval pin as integer, byval mS as integer) as integer
declare function wiringPiISR cdecl alias "wiringPiISR" (byval pin as integer, byval mode as integer, byval function as sub cdecl()) as integer
declare function piThreadCreate cdecl alias "piThreadCreate" (byval fn as sub cdecl(byval as any ptr)) as integer
declare sub piLock cdecl alias "piLock" (byval key as integer)
declare sub piUnlock cdecl alias "piUnlock" (byval key as integer)
declare function piHiPri cdecl alias "piHiPri" (byval pri as integer) as integer
declare sub delay cdecl alias "delay" (byval howLong as uinteger)
declare sub delayMicroseconds cdecl alias "delayMicroseconds" (byval howLong as uinteger)
declare function millis cdecl alias "millis" () as uinteger
declare function micros cdecl alias "micros" () as uinteger
#endif
Alles anzeigen
MODE_INPUT bzw MODE_OUTPUT heissen im Ursprung nur INPUT bzw OUTPUT da das nun aber reservierte schlüsselwörter für FBC sind hab ich das abgeändert.
Nun haben wir unseren Header aber es fehlen noch unsere Objekt Dateien (*.o) diese finden wir im verzeichnis "wiringPi/wiringPi/".
nun haben wir 2 Möglichkeiten. Entweder wir kopieren die "wiringPi.o" und "piHiPri.o" in unser Testverzeichnis und nutzen folgenes Kommand zum kompilieren
oder wir erstellen uns ein MAKEFILE indem wir alles regeln können. Da ich aber nunmal aus der VisualBasic und CO Ecke komme.... Bin ich kein Makefiler
Wenn alles ordnungsmässig kompiliert wurde können wir nun eine LED am GPIO 17 zum blinken bringen.
Beenden könnt ihr das ganze per ESC oder Strg+C
Für Fragen und Anregungen stehe ich gerne zu verfügung. Dieses Tutorial gilt noch als "WIP" also bitte nicht auf jedem Fehler herumreiten
Ansonten viel Spass beim basteln
Platzhalter