https://www.linuxsecrets.com/elinux-wiki/RPi_GPIO_Code_Samples.html
A simple app for controlling GPIO pin 17 with Lazarus
The GPIO pins are accessible from Lazarus without any third-party software. This is performed by means of the BaseUnix unit that is part of every distribution of Lazarus and Free Pascal or by invoking Unix shell commands with fpsystem. The following example uses GPIO pin 17 as output port. It is assumed that you created a form named GPIO17ToggleBox with a TToggleBox and a TMemo named LogMemo (optional, for logging purposes). The program has to be executed with root privileges.
Unit for controlling the GPIO port:
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.
Alternative way to access the GPIO port with Lazarus / Free Pascal is by using Lazarus wrapper unit for Gordon Henderson's wiringPi C library or encapsulated shell calls.
The Lazarus wiki describes a demo program that can read the status of a GPIO pin.
'언어 > Python' 카테고리의 다른 글
stream 및 file에 로그 남기기 (logging) (0) | 2019.11.19 |
---|---|
PC / RPi camera display using PyQt and OpenCV (0) | 2019.11.18 |
PyQt serial terminal (0) | 2019.11.18 |
Windows에서 PyCharm을 사용하여 Python2와 Python3 동시에 사용하기 (0) | 2018.08.29 |
Windows에 Python2, Python3 설치 하는 방법 (0) | 2018.08.29 |