Raspberry Pi (ラズベリー・パイ) で Lazarus (FreePascal)ほぼ Delphi ですね。
インストールは、コマンドラインに、次のコマンドを入力するだけでいけました。(結構時間がかかります。)
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install fpc
sudo apt-get install lazarus
sudo apt-get install libfbclient2
プログラム(例えば、projetc1)の起動は、
sudo ./project1
なんですね。
■ rpi_hal ユニットで、i2c を使う
ADS1015(12ビット4チャンネルAD変換)を使ってみました。
rpi_hal.pas ユニットを使っています。
そのままでは、ランタイムエラーで起動できないので、
メニュー-プロジェクト-プロジェクトオプション-コンパイラオプション-その他 のカスタムオプションに、-dUseCThreads を追加します。
終了時にエラー(例外クラス)が出る場合は、Uses 節の cmem をコメントアウトします。
unit ads1015Unit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, // 追加ユニット rpi_hal, cthreads, Unix; type { TForm1 } TForm1 = class (TForm) Edit1: TEdit; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { private declarations } public { public declarations } end ; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1 . Timer1Timer(Sender: TObject); var s : string ; ret : integer ; v : double ; begin // $48 : ADS1015_I2C_ADDRESS // $01 : ADS1015_REG_POINTER_CONFIG // $00 : ADS1015_REG_POINTER_CONVERT // $F183 : 3CHを±6.144V (Gain 2/3) で変換 (0CH = $C183, 1CH = $D183, 2CH = $E183) // ±4.096V (Gain 1) の時は、 $F183 or $0200 // 実際には、最大 VDD + 0.3V までしか測定できない i2c_string_write( $48 , $01 , # $F1 + # $83 , NO_TEST); sleep( 1 ); // 変換待ち s := i2c_string_read( $48 , $00 , 2 , NO_TEST); if Length(s) >= 2 then begin ret := StrToInt( '$' + IntToHex(Ord(s[ 1 ]), 2 ) + IntToHex(Ord(s[ 2 ]), 2 )); // 下位 4 ビットは無関係 ret := ret shr 4 ; v := ret * (( 6.144 * 2 ) / 4096 ); Edit1 . Text := Format( '%.3f' , [v]); end ; end ; end . |
■ PiGpio ユニットを使ってステッピングモーターを制御
ステッピングモーター: ST-42BYG0506H (1回転ステップ数:200 基本ステップ角:1.8度)
ドライバIC: TB6674PG
※TB6674PG(TA7774P互換)と、TA7774PGの違い
TB6674PG : モータ電源 Vs1A、Vs1B > 6.5V (標準12V)必要
TA7774PG : モータ電源 Vs1A、Vs1B >= Vcc でOK
unit Unit4; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, // 追加ユニット PiGpio; type { TForm1 } TForm1 = class (TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); private { private declarations } public { public declarations } end ; var Form1: TForm1; GPIO_Driver : TIoDriver; Gpf : TIoPort; implementation {$R *.lfm} { TForm1 } procedure TForm1 . FormActivate(Sender: TObject); begin if GPIO_Driver . MapIo then begin Gpf := GpIo_Driver . CreatePort(GPIO_BASE, CLOCK_BASE, GPIO_PWM); // GPIO20, 21, 16 を OUTPUT に // ICの 3 番ピンに接続(A) Gpf . SetPinMode( 20 , OUTPUT); // ICの 6 番ピンに接続(B) Gpf . SetPinMode( 21 , OUTPUT); // ICの 8 番ピンに接続(L:スタンバイ/ H:オペレーション) Gpf . SetPinMode( 16 , OUTPUT); end ; end ; procedure TForm1 . Button1Click(Sender: TObject); var i: integer ; msec : integer ; begin if Gpf <> nil then begin msec := 10 ; Gpf . SetBit( 16 ); // オペレーション // 200 ステップのモーターで、1回転 for i := 0 to 49 do begin Gpf . ClearBit( 20 ); Gpf . ClearBit( 21 ); sleep(msec); Gpf . SetBit( 20 ); Gpf . ClearBit( 21 ); sleep(msec); Gpf . SetBit( 20 ); Gpf . SetBit( 21 ); sleep(msec); Gpf . ClearBit( 20 ); Gpf . SetBit( 21 ); sleep(msec); end ; Gpf . ClearBit( 20 ); Gpf . ClearBit( 21 ); Gpf . ClearBit( 16 ); // スタンバイ end ; end ; procedure TForm1 . Button2Click(Sender: TObject); var i: integer ; msec : integer ; begin if Gpf <> nil then begin msec := 10 ; Gpf . SetBit( 16 ); // オペレーション // 200 ステップのモーターで、1回転 for i := 0 to 49 do begin Gpf . ClearBit( 20 ); Gpf . ClearBit( 21 ); sleep(msec); Gpf . ClearBit( 20 ); Gpf . SetBit( 21 ); sleep(msec); Gpf . SetBit( 20 ); Gpf . SetBit( 21 ); sleep(msec); Gpf . SetBit( 20 ); Gpf . ClearBit( 21 ); sleep(msec); end ; Gpf . ClearBit( 20 ); Gpf . ClearBit( 21 ); Gpf . ClearBit( 16 ); // スタンバイ end ; end ; procedure TForm1 . FormClose(Sender: TObject; var CloseAction: TCloseAction); begin if Gpf <> nil then begin Gpf . ClearBit( 20 ); Gpf . ClearBit( 21 ); Gpf . ClearBit( 16 ); GpIo_Driver . UnmapIoRegisrty(Gpf); end ; end ; end . |
0 件のコメント:
コメントを投稿