Difference between revisions of "Lazarus on Raspberry Pi"

From Lazarus wiki
Jump to navigationJump to search
(Example for native hardware access added.)
Line 33: Line 33:
 
[[File:rpi pinout all 50.png|thumb|300px|right|alt=Raspberry Pi pinout|Raspberry Pi pinout of external connectors]]
 
[[File:rpi pinout all 50.png|thumb|300px|right|alt=Raspberry Pi pinout|Raspberry Pi pinout of external connectors]]
  
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.
+
One of the goals in the development of Raspberry Pi was to facilitate effortless access to external devices like sensors and actuators. There are three ways to access the IO facilities from Lazarus and Free Pascal:
  
===wiringPi procedures and functions===
+
* Direct access using the [http://www.freepascal.org/docs-html/rtl/baseunix/index.html BaseUnix] unit
 
+
* Access through encapsulated shell calls
'''Function wiringPiSetup:longint:''' Initializes wiringPi system using the wiringPi pin numbering scheme.
+
* Access through the wiringPi library.
 
 
'''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===
+
===Native hardware access===
 
[[File:testprogram for GPIO on RPI annotated.png|Simple test program for acessing the GPIO port on Raspberry Pi|thumb|300px|right]]
 
[[File:testprogram for GPIO on RPI annotated.png|Simple test program for acessing the GPIO port on Raspberry Pi|thumb|300px|right]]
 
[[File:rpi testcircuit 1d.png|Test circuit for GPIO access with the described program|thumb|300px|right]]
 
[[File:rpi testcircuit 1d.png|Test circuit for GPIO access with the described program|thumb|300px|right]]
 
[[File:rpi testcircuit 1p annotaded.png|Simple demo implementation of the circuit from above on a breadboard|thumb|300px|right]]
 
[[File:rpi testcircuit 1p annotaded.png|Simple demo implementation of the circuit from above on a breadboard|thumb|300px|right]]
Another way to access the hardware that doesn't require additional libraries is by encapsulating terminal commands. This is achieved by using the [[Executing External Programs#Unix fpsystem, fpexecve and shell|fpsystem]] function.
+
This method provides access to external hardware that doesn't require additional libraries. The only requirement is the BaseUnix library that is part of Free Pascal's RTL.
  
 
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 [http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/ttogglebox.html ToggleBox] with name ''GPIO17ToggleBox'' and for logging return codes a [http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tmemo.html TMemo] called ''LogMemo''.
 
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 [http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/ttogglebox.html ToggleBox] with name ''GPIO17ToggleBox'' and for logging return codes a [http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tmemo.html TMemo] called ''LogMemo''.
Line 82: Line 64:
  
 
uses
 
uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unix;
+
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
 +
  Unix, BaseUnix;
  
 
type
 
type
Line 99: Line 82:
 
     { public declarations }
 
     { public declarations }
 
   end;
 
   end;
 +
 +
const
 +
  PIN_17: PChar = '17';
 +
  PIN_ON: PChar = '1';
 +
  PIN_OFF: PChar = '0';
 +
  OUT_DIRECTION: PChar = 'out';
  
 
var
 
var
Line 111: Line 100:
  
 
procedure TForm1.FormActivate(Sender: TObject);
 
procedure TForm1.FormActivate(Sender: TObject);
 +
var
 +
  fileDesc: integer;
 
begin
 
begin
 
   { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
 
   { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
   gReturnCode := fpsystem('echo "17" > /sys/class/gpio/export');
+
   try
   LogMemo.Lines.Add(IntToStr(gReturnCode));
+
    fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
 +
    gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
   finally
 +
    gReturnCode := fpclose(fileDesc);
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
  end;
 
   { Set SoC pin 17 as output: }
 
   { Set SoC pin 17 as output: }
   gReturnCode := fpsystem('echo "out" > /sys/class/gpio/gpio17/direction');
+
   try
   LogMemo.Lines.Add(IntToStr(gReturnCode));
+
    fileDesc := fpopen('/sys/class/gpio/gpio17/direction', O_WrOnly);
 +
    gReturnCode := fpwrite(fileDesc, OUT_DIRECTION[0], 3);
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
   finally
 +
    gReturnCode := fpclose(fileDesc);
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
  end;
 
end;
 
end;
  
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
 +
var
 +
  fileDesc: integer;
 
begin
 
begin
 
   { Free SoC pin 17: }
 
   { Free SoC pin 17: }
   gReturnCode := fpsystem('echo "17" > /sys/class/gpio/unexport');
+
   try
   LogMemo.Lines.Add(IntToStr(gReturnCode));
+
    fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
 +
    gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
   finally
 +
    gReturnCode := fpclose(fileDesc);
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
  end;
 
end;
 
end;
  
 
procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
 
procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
 +
var
 +
  fileDesc: integer;
 
begin
 
begin
 
   if GPIO17ToggleBox.Checked then
 
   if GPIO17ToggleBox.Checked then
 
   begin
 
   begin
 
     { Swith SoC pin 17 on: }
 
     { Swith SoC pin 17 on: }
     gReturnCode := fpsystem('echo "1" > /sys/class/gpio/gpio17/value');
+
     try
     LogMemo.Lines.Add(IntToStr(gReturnCode));
+
      fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
 +
      gReturnCode := fpwrite(fileDesc, PIN_ON[0], 1);
 +
      LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
     finally
 +
      gReturnCode := fpclose(fileDesc);
 +
      LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
    end;
 
   end
 
   end
 
   else
 
   else
 
   begin
 
   begin
 
     { Switch SoC pin 17 off: }
 
     { Switch SoC pin 17 off: }
     gReturnCode := fpsystem('echo "0" > /sys/class/gpio/gpio17/value');
+
     try
     LogMemo.Lines.Add(IntToStr(gReturnCode));
+
      fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
 +
      gReturnCode := fpwrite(fileDesc, PIN_OFF[0], 1);
 +
      LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
     finally
 +
      gReturnCode := fpclose(fileDesc);
 +
      LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
    end;
 
   end;
 
   end;
 
end;
 
end;
Line 168: Line 193:
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
===Hardware access via encapsulated shell calls===
 +
Another way to access the hardware is by encapsulating terminal commands. This is achieved by using the [[Executing External Programs#Unix fpsystem, fpexecve and shell|fpsystem]] function. This method gives access to functions that are not supported by the BaseUnix unit.
 +
 +
''Controlling unit:''
 +
<syntaxhighlight>
 +
unit Unit1;
 +
 +
{Demo application for GPIO on Raspberry Pi}
 +
{Inspired by the Python input/output demo application by Gareth Halfacree}
 +
{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
 +
 +
{$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; {stores the result of the IO operation}
 +
 +
implementation
 +
 +
{$R *.lfm}
 +
 +
{ TForm1 }
 +
 +
procedure TForm1.FormActivate(Sender: TObject);
 +
begin
 +
  { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
 +
  gReturnCode := fpsystem('echo "17" > /sys/class/gpio/export');
 +
  LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
  { Set SoC pin 17 as output: }
 +
  gReturnCode := fpsystem('echo "out" > /sys/class/gpio/gpio17/direction');
 +
  LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
end;
 +
 +
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
 +
begin
 +
  { Free SoC pin 17: }
 +
  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
 +
    { Swith SoC pin 17 on: }
 +
    gReturnCode := fpsystem('echo "1" > /sys/class/gpio/gpio17/value');
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
  end
 +
  else
 +
  begin
 +
    { Switch SoC pin 17 off: }
 +
    gReturnCode := fpsystem('echo "0" > /sys/class/gpio/gpio17/value');
 +
    LogMemo.Lines.Add(IntToStr(gReturnCode));
 +
  end;
 +
end;
 +
 +
end.
 +
</syntaxhighlight>
 +
 +
The main program is identical to that of the example above. This program has to be executed with root privileges, too.
 +
 +
===wiringPi procedures and functions===
 +
 +
Alex Schaller's wrapper unit for Gordon Henderson Arduino compatible wiringPi library provides a numbering scheme that resembles that of Arduino boards.
 +
 +
'''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
  
 
== References ==
 
== References ==

Revision as of 20:23, 10 March 2013

Deutsch (de) English (en) español (es) suomi (fi) 中文(中国大陆)‎ (zh_CN)

Lazarus on Raspbian Wheezy.
Lazarus on Raspbian Wheezy

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

Raspberry Pi pinout
Raspberry Pi pinout of external connectors

One of the goals in the development of Raspberry Pi was to facilitate effortless access to external devices like sensors and actuators. There are three ways to access the IO facilities from Lazarus and Free Pascal:

  • Direct access using the BaseUnix unit
  • Access through encapsulated shell calls
  • Access through the wiringPi library.

Native hardware access

Simple test program for acessing the GPIO port on Raspberry Pi
Test circuit for GPIO access with the described program
Simple demo implementation of the circuit from above on a breadboard

This method provides access to external hardware that doesn't require additional libraries. The only requirement is the BaseUnix library that is part of Free Pascal's RTL.

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 68 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;

{Demo application for GPIO on Raspberry Pi}
{Inspired by the Python input/output demo application by Gareth Halfacree}
{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Unix, BaseUnix;

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;

const
  PIN_17: PChar = '17';
  PIN_ON: PChar = '1';
  PIN_OFF: PChar = '0';
  OUT_DIRECTION: PChar = 'out';

var
  Form1: TForm1;
  gReturnCode: longint; {stores the result of the IO operation}

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormActivate(Sender: TObject);
var
  fileDesc: integer;
begin
  { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
  try
    fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
    gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  finally
    gReturnCode := fpclose(fileDesc);
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  end;
  { Set SoC pin 17 as output: }
  try
    fileDesc := fpopen('/sys/class/gpio/gpio17/direction', O_WrOnly);
    gReturnCode := fpwrite(fileDesc, OUT_DIRECTION[0], 3);
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  finally
    gReturnCode := fpclose(fileDesc);
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  fileDesc: integer;
begin
  { Free SoC pin 17: }
  try
    fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
    gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  finally
    gReturnCode := fpclose(fileDesc);
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  end;
end;

procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
var
  fileDesc: integer;
begin
  if GPIO17ToggleBox.Checked then
  begin
    { Swith SoC pin 17 on: }
    try
      fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
      gReturnCode := fpwrite(fileDesc, PIN_ON[0], 1);
      LogMemo.Lines.Add(IntToStr(gReturnCode));
    finally
      gReturnCode := fpclose(fileDesc);
      LogMemo.Lines.Add(IntToStr(gReturnCode));
    end;
  end
  else
  begin
    { Switch SoC pin 17 off: }
    try
      fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
      gReturnCode := fpwrite(fileDesc, PIN_OFF[0], 1);
      LogMemo.Lines.Add(IntToStr(gReturnCode));
    finally
      gReturnCode := fpclose(fileDesc);
      LogMemo.Lines.Add(IntToStr(gReturnCode));
    end;
  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.

Hardware access via encapsulated shell calls

Another way to access the hardware is by encapsulating terminal commands. This is achieved by using the fpsystem function. This method gives access to functions that are not supported by the BaseUnix unit.

Controlling unit:

unit Unit1;

{Demo application for GPIO on Raspberry Pi}
{Inspired by the Python input/output demo application by Gareth Halfacree}
{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}

{$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; {stores the result of the IO operation}

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormActivate(Sender: TObject);
begin
  { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
  gReturnCode := fpsystem('echo "17" > /sys/class/gpio/export');
  LogMemo.Lines.Add(IntToStr(gReturnCode));
  { Set SoC pin 17 as output: }
  gReturnCode := fpsystem('echo "out" > /sys/class/gpio/gpio17/direction');
  LogMemo.Lines.Add(IntToStr(gReturnCode));
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  { Free SoC pin 17: }
  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
    { Swith SoC pin 17 on: }
    gReturnCode := fpsystem('echo "1" > /sys/class/gpio/gpio17/value');
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  end
  else
  begin
    { Switch SoC pin 17 off: }
    gReturnCode := fpsystem('echo "0" > /sys/class/gpio/gpio17/value');
    LogMemo.Lines.Add(IntToStr(gReturnCode));
  end;
end;

end.

The main program is identical to that of the example above. This program has to be executed with root privileges, too.

wiringPi procedures and functions

Alex Schaller's wrapper unit for Gordon Henderson Arduino compatible wiringPi library provides a numbering scheme that resembles that of Arduino boards.

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

References

  • Eben Upton and Gareth Halfacree. Raspberry Pi User Guide. John Wiley and Sons, Chichester 2012, ISBN 111846446X

External Links