Raspberrypi3 model b+にて
Lazarus(1.6.2) FPC(3.0.0) を使用して、
GPIOの制御をしたいのですが、
https://wiki.freepascal.org/Lazarus_on_Raspberry_Pi/es 左記ページの
pigpio.pasをダウンロードし、
実行ファイルの入ったフォルダにpigpio.pasを入れ、
下記のソースでコンパイルしているのですが、
エラーが出ます。
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, lNetComponents, lNet, lhttp, IniFiles ,Unix, BaseUnix, pigpio;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Memo1: TMemo;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
const
PIN18 = 18;
var
Form1: TForm1;
GPIO_Driver : TIoDriver;
Gpf : TIoPort;
{stores the result of the IO operation}
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
if not GPIO_Driver.MapIo then
begin
Memo1.Lines.Add('Error Mappig GPIO Registry');
end;
if GPIO_Driver.MapIo then
begin
Gpf := GpIo_Driver.CreatePort(GPIO_BASE,CLOCK_BASE,GPIO_PWM);
Gpf.SetPinMode(18,INPUT);
end;
Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
try
if Gpf.GetBit(18) = true then
begin
Memo1.Lines.Add('1');
end;
if Gpf.GetBit(18) = false then
begin
Memo1.Lines.Add('0');
end;
finally
//Gpf.SetPinMode(18,INPUT);
//Gpf.ClearBit(18);
//GpIo_Driver.UnmapIoRegisrty(Gpf);
end;
Timer1.Enabled := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
end;
end.
どうも、FormCreateの「if not GPIO_Driver.MapIo then」を通ってしまっている様で、
その後のTimer1イベントで、
プロジェクト project1 は、例外クラス'External SIGSEGV'を発生させました。
該当ファイル 'unit1.pas' 該当行72
if Gpf.GetBit(18) = true then
上記のエラーが出てしまいます。
gpio.pasの使い方が間違っているのでしょうか?
それとも、Raspberrypi側で先にやっておかなくてはならない事があるのでしょうか?
どなたかご教授の程、宜しくお願い致します。
1)
GPIO_Driver : TIoDriver;
Gpf : TIoPort;
いずれもクラスなので、Createして、使い終わったらFreeが必要です。
例)
GPIO_Driver :=TIoDriver.Create;
GPIO_Driver.SetPinMode(999,999);
GPIO_Driver.Free;
2)
この宣言がグローバル変数なので、誰も初期化してくれない。
Createしていないけれど、なんらかのアドレスを持っているので、
存在している(Create済み)と判断されているが、正しいものではないので、
本来利用できる関数が、利用できない(エラーが発生する)
対処1)
フォームでしか使わないのであれば、宣言を移動する
private
//2つの宣言をここに移動
public
対処2)
FormCreateで、それぞれをCreate
FormDestory で、それぞれをFreeする。
使っておられるのが、Lazarusですが、Delphiも同じようなものなので、
以下をお勉強されることをおすすめします。
旧 Delphi 入門
http://kakinotane.s7.xrea.com/delphi/d2/toc.html
クラスとオブジェクトの初歩
・コンストラクタとデストラクタ
ツイート | ![]() |