Motor servo berputar ke posisi sudut tertentu berdasarkan lebar pulsa yang diberikan padanya. Pada umumnya lebar pulsa yang dibutuhkan adalah 1ms – 2ms, dengan perida 20ms seperti diagram berikut :
Membangkitkan sinyal pulsa ini menjadi masalah tersendiri jika menggunakan pc melalui port paralel, karena disisi komputer cara ini (akses langsung ke perangkat) dianggap tidak aman.
Beberapa metode/trik bisa dilakukan untuk menggerakkan motor servo melalui lpt port seperti kode berikut :
for i:=1 to 10 do
begin
Out32($378, $01);
delay(1);
Out32($378, $00);
delay(19);
end;
cara ini menjadi tidak efektif karena fungsi ‘delay()’ tidak bisa menjamin timingnya. contohnya jika delay(1) tidak ada garansi akan tepat 1ms. Maka yang terjadi adalah servo agak bergerak tidak beraturan.
jadi kunci memitar motor servo tepat pada posisinya adalah timing yang pas dan tepat. untuk itu digunakan fungsi ‘QueryPerformanceCounter(lastTick);’ yang lebih presisi pewaktuannya.
skema simulasi gerak servo untuk membuka pintu menggunakan port parallel:
program delphi penggerak motor servo, simulasi buka tutup:
unit servo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ButtonBuka: TButton; ButtonTutup: TButton; Label1: TLabel; Label2: TLabel; procedure ButtonBukaClick(Sender: TObject); procedure ButtonTutupClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; nilaiPort : byte; const //cek alamat resource lpt port melalui device manager baseRegister = $DC00; dataRegister = baseRegister + 0; statusRegister = baseRegister + 1; controlRegister = baseRegister + 2; sudutBuka = 180; sudutTutup = 0; maskPinServo = $01; implementation {$R *.dfm} function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll'; function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll'; procedure gerakServo(maskPort : byte; sudut : byte); var lastTick, tick : Int64; lastTick20 : Int64; mikroDetik : integer; Frequency : Int64; i : integer; begin QueryPerformanceFrequency(Frequency); mikroDetik := 500 + (Round(sudut/180) * 2000); for i := 1 to 20 do begin nilaiPort := nilaiPort or maskPort; Out32(dataRegister, nilaiPort); QueryPerformanceCounter(lastTick); lastTick20 := lastTick + round((20000 / 1000000) * Frequency); lastTick := lastTick + round((mikroDetik / 1000000) * Frequency); while true do begin QueryPerformanceCounter(tick); if tick > lastTick then break; end; nilaiPort := nilaiPort and (not maskPort); Out32(dataRegister, nilaiPort); while true do begin QueryPerformanceCounter(tick); if tick > lastTick20 then break; end; end; end; procedure TForm1.ButtonBukaClick(Sender: TObject); begin gerakServo(maskPinServo, sudutBuka); end; procedure TForm1.ButtonTutupClick(Sender: TObject); begin gerakServo(maskPinServo, sudutTutup); end; end.