2017年2月2日木曜日

Raspberry Pi GUI で Lチカ

1.はじめに
 Raspbian JESSIE は GUI ( Graphical User Interface の略 ) で動作します。HDMI ケーブルで LCD を接続し、マウス、キーボードを接続すれば Windows に比べても遜色のない画面で楽しめます。折角のマウスやキーボードをつないだので、GUI で動作するアプリケーションを作って見ましょう さらに、GUI から GPIO 経由で接続した LED をON/OFF してみます。


 Windows では有名な Visual Basic がありました、実は Delphi もあったんですが Visual Basic 程普及はしませんでした。Basic ( インタープリター )に比べ Delphi ( Pascal のコンパイラー ) は実行速度では有利だったんですけど?Delphi の親戚と言うか従妹みたいなものに Lazarus と言うPascal を利用した 開発環境があります。Windows , Linux , Mac用がそれぞれ無償でリリースされています。

2.Raspbian のインストール
 本ブログでも何回かとりあげていますが、簡単に手順を紹介します。( Raspbian インストールを参照 )

 Raspberry Pi 3 に Raspbian にアクセスし、DOWNLOADS ページよりRASPBIAN JESSIE WITH PIXEL をダウンロードします。

 DD for Windows を使用してSDカードに書き込みます。

3.Lazarus ( Free Pascal IDE ) のインストール

$ sudo apt-get update
$ sudo apt-get install lazarus

以上でインストールされます。
(時間がかかるので余裕のある時に実行してください。)

4.Lazarus の起動
 注意点、Lazarus でプログラムをテストする場合、画面の制御は問題なくできるのですが GPIO ファイル経由で直接に入出力を行う場合、開発環境も root で起動しないと制御できないです。(詳細はチェック中)
メニューより Lazarus を起動するのではなく、一旦 Terminal より

$ sudo lazarus-ide として起動します。

5.プログラム作成

 uses 節にGPIOへのアクセスの為、 Unix, BaseUnix を追加しておく。

5-1.Sharpeの追加

Form に Sharpe (緑の〇)そのままでは四角なので丸に変更します。Shape1 のプロパティ Shape が stRectangle (四角) となっているのを stEllipse (楕円) に変更します。楕円は縦横の比率を同じにすれば円となります。

5-2.Button の追加


 LED ON/OFF 用のボタンを追加します。

5-3.Button1イベント:(OnClick)の追加

 gpio ファイルへは FpOpen, FpClose を使ってアクセスします。

Button1のイベントに OnClik 欄がありイベントが未登録なので右の空欄をダブルクリックすればイベントが追加されます。
Button1Click が追加されます。中身は空なので Pascal で動作を記述していきます。
LED が OFF(0) ならば
  GPIO に '1' を書き込んで点灯させます。
  画面上の〇は緑色に設定する。
  点灯させたので Led 変数は 1 として記憶し次回に備える。
LED が OFF(0) でないならば
  GPIO に '0' を書き込んで消灯させます。
  画面上の〇は白色に設定する。
  消灯させたので Led 変数は 0 として記憶し次回に備える。

5-4.Formイベント:(OnActive)の追加

 フォームのイベントには、フォームが画面に表示された時(FormActivate:イベント)には初期設定の処理を登録しておきます。
Led 変数を 0 ( LED Off )とします。

5-5.Formイベント:(OnClose)の追加

 終了時(FormClose:イベント)には gpio の終了宣言を行います。(後始末)


イベントは発生するごとに上記の登録されたいずかの処理が行われます。
今回の例では
1.procedure TForm1.FormActivate(Sender: TObject);
  ( 初期設定でプログラム開始時に 1 回実行される。 )
2.procedure TForm1.Button1Click(Sender: TObject); 複数回実行される。
  ( LED の ON / OFF ボタンをクリックした回数回実行される。)
3.procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  ( フォームの終了(プログラムの終了時)に 1 回実行される。)
の順に実行されます。

プログラム
01: unit Unit1;
02: 
03: {$mode objfpc}{$H+}
04: 
05: interface
06: 
07: uses
08:   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
09:   ExtCtrls ,
10:   Unix, BaseUnix ;
11: 
12: type
13: 
14:   { TForm1 }
15: 
16:   TForm1 = class(TForm)
17:     Button1: TButton;
18:     Shape1: TShape;
19:     procedure Button1Click(Sender: TObject);
20:     procedure FormActivate(Sender: TObject);
21:     procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
22:   private
23:     { private declarations }
24:   public
25:     { public declarations }
26:   end;
27: 
28: var
29:   Form1: TForm1;
30:   Led:   Integer ;
31:   gReturnCode: longint;
32: 
33: implementation
34: 
35: {$R *.lfm}
36: 
37: const
38:   PIN_17: PChar = '17';
39:   PIN_ON: PChar = '1';
40:   PIN_OFF: PChar = '0';
41:   OUT_DIRECTION: PChar = 'out';
42: 
43: { TForm1 }
44: 
45: procedure TForm1.Button1Click(Sender: TObject);
46: var
47:   fileDesc: integer;
48: begin
49:    if Led = 0 then
50:    begin
51:      fileDesc := FpOpen('/sys/class/gpio/gpio17/value', O_WrOnly);
52:      gReturnCode := FpWrite(fileDesc, PIN_ON[0], 1);
53:      Shape1.Brush.Color := clLime ;
54:      Led := 1 ;
55:    end
56:    else
57:    begin
58:      fileDesc := FpOpen('/sys/class/gpio/gpio17/value', O_WrOnly);
59:      gReturnCode := FpWrite(fileDesc, PIN_OFF[0], 1);
60:      Shape1.Brush.Color := clWhite ;
61:      Led := 0 ;
62:    end ;
63: end;
64: 
65: procedure TForm1.FormActivate(Sender: TObject);
66: var
67:   fileDesc: integer;
68: begin
69:    Led := 0 ;
70:    fileDesc := FpOpen('/sys/class/gpio/export', O_WrOnly);
71:    gReturnCode := FpWrite(fileDesc, PIN_17[0], 2);
72: 
73:    fileDesc := FpOpen('/sys/class/gpio/gpio17/direction', O_WrOnly);
74:    gReturnCode := FpWrite(fileDesc, OUT_DIRECTION[0], 3);
75: end;
76: 
77: procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
78: var
79:   fileDesc: integer;
80: begin
81:   fileDesc := FpOpen('/sys/class/gpio/unexport', O_WrOnly);
82:   gReturnCode := FpWrite(fileDesc, PIN_17[0], 2);
83: end;
84: 
85: end.


保存

保存はプロジェクトより名前を付けてプロジェクト保存を実行してください。
今回は led プロジェクトとして保存しました。



実行

/usr/local/bin/ にコピーし、実行権( sudo chmod +x led とすると) 与えておくとどこからでも以下で実行できる

$ sudo ./led として実行して下さい。



0 件のコメント:

コメントを投稿