Lazarus on Raspberry Pi
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
中文(中国大陆) (zh_CN) │
The Raspberry Pi is a credit-card-sized single-board computer. It has been developed in the UK by the Raspberry Pi Foundation with the intention of stimulating the teaching of basic computer science in schools. Raspberry Pis are also used for multiple other purposes that are as different as media servers, robotics and control engineering.
The Raspberry Pi Foundation recommends Raspbian Wheezy as standard operating system. Alternative systems running on RPI include RISC OS and various Linux distributions, even Android.
Lazarus runs natively under the Raspbian operating system.
Installing and compiling Lazarus
Simple installation under Raspbian
In the Raspbian OS it is easy to install Lazarus and Free Pascal. In order to do this simply open a terminal window and type:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install fpc
sudo apt-get install lazarus
This installs a precompiled version of Lazarus on the Raspberry Pi. Of course, a network connection is required. Installation may take about 30 minutes, but major portions of this process take place automatically. After installation you may instantly start Lazarus from the "Programming" section of the LXDE start menu.
Compiling from sources
You may want to compile Lazarus from subversion sources. See Michell Computing: Lazarus on the Raspberry Pi for details.
Accessing external hardware
One of the goals in the development of Raspberry Pi was to facilitate effortless access to external devices like sensors and actuators. One way to use this capability is Alex Schaller's wrapper unit for Gordon Henderson Arduino compatible wiringPi library.
wiringPi procedures and functions
Function wiringPiSetup:longint: Initializes wiringPi system using the wiringPi pin numbering scheme.
Procedure wiringPiGpioMode(mode:longint): Initializes wiringPi system with the Broadcom GPIO pin numbering shceme.
Procedure pullUpDnControl(pin:longint; pud:longint): controls the internal pull-up/down resistors on a GPIO pin.
Procedure pinMode(pin:longint; mode:longint): sets the mode of a pin to either INPUT, OUTPUT, or PWM_OUTPUT.
Procedure digitalWrite(pin:longint; value:longint): sets an output bit.
Procedure pwmWrite(pin:longint; value:longint): sets an output PWM value between 0 and 1024.
Function digitalRead(pin:longint):longint: reads the value of a given Pin, returning 1 or 0.
Procedure delay(howLong:dword): waits for at least howLong milliseconds
Procedure delayMicroseconds(howLong:dword): waits for at least howLong microseconds
Function millis:dword: returns the number of milliseconds since the program called one of the wiringPiSetup functions
Hardware access via encapsulated shell calls
Another way to access the hardware that doesn't require additional libraries is by encapsulating terminal commands. This is achieved by using the fpsystem function.
The following example lists a simple program that controls the GPIO pin 17 as output to switch an LED, transistor or relais. This program contains a ToggleBox with name GPIO17ToggleBox and for logging return codes a TMemo called LogMemo.
For the example, the anode of a LED has been connected with Pin 11 on the Pi's connector (corresponding to GPIO pin 17 of the BCM2835 SOC) and the LED's cathode was wired via a 64 Ohm resistor to pin 6 of the connector (GND) as previously described by Upton and Halfacree. Subsequently, the LED may be switched on and off with the application's toggle box.
The code requires to be run as root, i.e. either from a root account (not recommended) or via su.
Controlling unit:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unix; type { TForm1 } TForm1 = class(TForm) LogMemo: TMemo; GPIO17ToggleBox: TToggleBox; procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure GPIO17ToggleBoxChange(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; gReturnCode: longint; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormActivate(Sender: TObject); begin gReturnCode := fpsystem('echo "17" > /sys/class/gpio/export'); LogMemo.Lines.Add(IntToStr(gReturnCode)); gReturnCode := fpsystem('echo "out" > /sys/class/gpio/gpio17/direction'); LogMemo.Lines.Add(IntToStr(gReturnCode)); end; procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin gReturnCode := fpsystem('echo "17" > /sys/class/gpio/unexport'); LogMemo.Lines.Add(IntToStr(gReturnCode)); end; procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject); begin if GPIO17ToggleBox.Checked then begin gReturnCode := fpsystem('echo "1" > /sys/class/gpio/gpio17/value'); LogMemo.Lines.Add(IntToStr(gReturnCode)); end else begin gReturnCode := fpsystem('echo "0" > /sys/class/gpio/gpio17/value'); LogMemo.Lines.Add(IntToStr(gReturnCode)); end; end; end.
Main program:
program io_test; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms, Unit1 { you can add units after this }; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.