Software - Lazarus
Lazarus ist eine sogenannte IDE-Entwicklungsoberfläche, speziell Neulinge "erschlägt" sie anfangs mit ihren Möglichkeiten. Ich nutze sie sowohl auf normalen Computern (Windows/Linux) als auch auf dem RaspberryPi.....

Aber mit etwas Einarbeitung kann man schnell optisch ansprechende objektorientierte (eine Schaltfläche löst eine Aktion aus etc.) Programme mit ansprechender Oberfläche im Look des Betriebssystems erstellen.
Die Programmiersprache ist hier Pascal, grundsätzlich funktioniert die Programmierung ähnlich wie beim kommerziellen Borland Delphi. Die Web-Gemeinschaft ist oft etwas speziell - aber es findet sich immer - in irgendeinem Blog - eine Lösung.
Aufgrund der - prinzipiellen "Verwandschaft" zu o.g. Delphi - können auch in auf Delphi spezialisierten Blog's häufig passende Informationen gefunden werden.
Und...
- Lazarus ist kostenlos...
- Lazarus kann sowohl auf Windows als auch auf Linux und anderen Betriebssystemen ausgeführt werden...
- die eigenen Programme können auf jedem Betriebssystem mit wenigen Änderungen kompiliert und genutzt werden...
Einige Anmerkungen....
Während ich auf Windows i.d. Regel normale Standard-Anwendungen programmiere, sind es auf dem RasPi meist Programme mit Hardware-Anbindung (Ansteuerung von Pin's, Zugriff auf Betriebssystem-Routinen und - Funktionen etc.).
ACHTUNG: Unter WIN und LINUX gibt es verschiedene Formatdefinitionen für Daten, z.B. ist das Dezimaltrennzeichen bei Zahlen unter WIN ein "Komma" und unter LINUX ein "Punkt", ähnliche Unterschiede gibt es z.B. auch bei Datumsformaten etc. Dies müsst Ihr beachten, falls Ihr auf einem Betriebssystem programmiert und das Programm auf dem anderen Betriebssystem ausführen wollt. Mehr dazu findet Ihr wie üblich im Web....
Der Zugriff vom Windows-PC auf den RasPi erfolgt dabei mit einem Fernsteuerungsprogramm "VNC-Viewer" über WLAN, das Lazarus ist dann auf dem RasPi installiert....Dateien tausche ich mit "WinSCP" zwischen Windows und Linux aus.
Für spezielle Aufgaben gibt es bei Laszarus i.d. Regel zusätzliche sogenannte Packages, welche in die eigentliche IDE eingebunden werden oder aber zusätzlich im Projekt geladen werden müssen. Dies ist leider nicht immer ganz einfach.
Insbesondere beim Thema Hardware-Zugriff gibt es einige wichtige Werkzeuge für Lazarus unter Linux...
WiringPi...
Um mit Lazarus auf dem RasPi die boardeigenen Pin's anzusteuern, nutze ich ein zusätzliches Modul namens "wiringPi".....das müsst Ihr im Web suchen und installieren (hier verweise ich auf entsprechende Anleitungen im Web...)
Ihr bindet das Modul dann im Projektverwalter und in der uses-Klausel in Euer Programm mit ein...
implementation
{$R *.lfm}
{ TForm1 }
uses h2wiringpi;
und hier eine kleines Beispielprozedur....
procedure TForm1.Button7Click(Sender: TObject);
var
lese_pin, schalt_pin :longint;
begin
label1.caption:= 'Programm läuft';
if wiringpisetup=0 then
begin
// LED-Lesen
schalt_pin:=6; // Kennung fürr GPIO 25
lese_pin:=21; // Kennung für GPIO 5
// modus einstellen und aktivieren
pinmode(lese_pin , INPUT); // pin (0) auf methode INPUT (0) setzen
pinmode(schalt_pin , OUTPUT); // pin (0) auf methode INPUT (0) setzen
//Ausleseschleife
while checkbox1.checked do
begin
if (digitalread(lese_pin) = HIGH) then
begin
digitalwrite(schalt_pin,0);
label1.caption:='LED AN';
end;
if (digitalread(lese_pin) = LOW) then
begin
digitalwrite(schalt_pin,1);
label1.caption:='LED AUS';
end;
delay(100);
application.processmessages;
end; // while
digitalwrite(schalt_pin,0);
label1.caption:= 'Programm aus';
end; // endif
end;
Soweit ich weiss, wird wiringPi allerdings nicht mehr weiterentwickelt und ist auch etwas eingeschränkt in seinen Funktionen, daher müsst / könnt Ihr auch oft nachfolgende Möglichkeiten nutzen...
LazSerial - Komponente
Um mit Lazarus auf dem RasPi auf die seriellen Schnittstellen - hier Bluetooth - zuzugreifen, nutze ich ein zusätzliches Modul namens "LazSerial".....das müsst Ihr ebenfalls im Web suchen und installieren ( auch hier verweise ich auf entsprechende Anleitungen im Web...)
Nach erfolgreicher Installation habt Ihr dann unter den Werzeugen eine Rubrik "LazSerial" mit einer dargestellten Computer - Schnittstelle und könnt die Komponente dann benutzen.
Auf meinem RasPi ist die Konfiguration der Komponente wie folgt...
Baudrate | br1152000 |
DataBits | db8bits |
Device | /dev/rfcomm0 |
FlowControl | fcNone |
Name | LazSerial1 |
Parity | None |
RcvLineCRLF | TRUE |
StopBits | sbOne |
Tag | 0 |
Process und RunCommand...
Ihr könnt mit dem Lazarus-Befehl "process" sowohl einzelne Betriebssystem-Befehle wie auch echte Programme ( z.B. Phyton-Programme - oft für Sensoren etc. vom hersteller zur Verfügung gestellt ) als programmexterne Routinen aufrufen und die Rückgabewerte auswerten..
Desweiteren gibt es auch noch die Möglichkeit "RunCommand" für die Ausführung externer Scripte - z.B. sogenannter Batch-Programme ( WIN .bat / Linux .sh ).
hier als Aufruf eines Betriebssystem-Befehls...und einer externen Script-Datei...
procedure TForm1.FormActivate(Sender: TObject);
var
my_process:TProcess;
my_proclist:TStringList;
s:string;
i:integer;
begin
// {
memo1.lines.clear;
memo1.lines.add('Suche ESP...') ;
application.processmessages;
// nachschauhen, ob esp da ist
my_process:=TProcess.create(nil);
my_proclist:=TStringlist.create;
// scannt nach aktuellen Bluetooth Geräten
my_process.commandline:= ('hcitool scan');
my_process.options:=my_process.options + [ poWaitOnExit, poUsePipes];
my_process.execute;
my_proclist.LoadFromStream(my_process.output);
for i:=0 to my_proclist.count-1 do
begin
s:=my_proclist[i];
if Pos( 'ESP32_Lidar', s) <> 0 then
begin
// bindet automatisch den esp32 ein
if RunCommand('blueschuh_esp32_verbinden.sh',['-c','echo $PATH'],s) then
begin
memo1.lines.add('Warte auf Anbinden des ESP.....');
application.processmessages;
// wenn beim nachfolgenden Befehl der esp nicht da ist, hängt das Programm
try
LazSerial1.active:=true;
except
end;
if LazSerial1.active=true then memo1.lines.add('ESP anbinden erfolgreich');
end else memo1.lines.add('ESP anbinden fehlgeschlagen') ;
end;
end;
my_proclist.free;
my_process.free;
// }
end;
hier als Aufruf eines externen Phyton-Programmes...
procedure TForm1.Button6Click(Sender: TObject);
var
my_process:TProcess;
my_proclist:TStringList;
begin
my_process:=TProcess.create(nil);
my_proclist:=TStringlist.create;
// ruft das python-script auf
my_process.commandline:= ('python /home/pi/daten/i2c_ina219/ina_test2_ferngesteuert.py');
my_process.options:=my_process.options + [ poWaitOnExit, poUsePipes];
// und führt es aus
my_process.execute;
// lädt den Rückgabestream
my_proclist.LoadFromStream(my_process.output);
// stellt ergebniss dar
memo1.lines:= my_proclist;
edit3.text:= my_proclist[0];
// edit2.text:=copy(edit2.text,6,4);
// speicher freigeben
my_proclist.free;
my_process.free;
end;
Kompliziert ??... nun ja, Lazarus ist echt eine vollwertige Programmieroberfläche....