Hlavní stránka‎ > ‎

Kompas CMPS3 (Delphi, I2C)

Jedná se o program (Windows) pro ovládání digitálního kompasu CMPS3 (I2C). Stáhnout zde
 
 
 
 


CMPS03

Adresa I2C: 192 DEC

Registr Význam

0 Verze software

1 Azimut jako byte, 0-255 odpovídá úhlu 0-360°

2,3 Azimut jako word, 0-3599 odpovídá úhlu 0-359.9°

4,5 Internal Test - Sensor1 difference signal - 16 bit signed word

6,7 Internal Test - Sensor2 difference signal - 16 bit signed word

8,9 Internal Test - Calibration value 1 - 16 bit signed word

10,11 Internal Test - Calibration value 2 - 16 bit signed word

12 Unused - Read as Zero

13 Unused - Read as Zero

14 Unused - Read as Undefined

15 Příkaz ke kalibraci – zápisem 255 se zahájí kalibrace (viz níže).


Pro kalibraci modulu cmps03:

Start kalibrace (dále jen Start):
Po I2C pošlem adr. modulu = 192 pro zápis dat, potom adr. zapisovaného registru = 15 a pro začátek kalibrace hodnotu 255.
Stop kalibrace (dále jen Stop):
Po I2C pošlem adr. modulu = 192 pro zápis dat, potom adr. zapisovaného registru = 15 a pro začátek kalibrace hodnotu 0.
Modul KMZ51-jedničkama nasměrujem nejprve na sever a odešlem Start, potom pomalu otáčíme na východ odešlem Start, pak na jih odešlem Start, pak na západ odešlem Start, pootočíme ještě naposled na sever a odešleme Stop.
Podstata úspěšné kalibrace spočívá v pomalém otáčení modulu cmps03 držíc ve vodorovině a po směru hodinových ručiček (360°).
 
 
 
 
Náhled do výpisu programu:
 
unit Unit1;
interface
uses   I2CCOM2,PORTINC,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Gauges;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    CheckBox1: TCheckBox;
    Button2: TButton;
    Memo1: TMemo;
    Gauge1: TGauge;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure  Zapis_comps(ridici_bajt: Byte);
begin
  Start;
  vystup (192);
  vystup (ridici_bajt);
  Stop;
end;
function Cteni_comps: Byte;
begin
  Start;
  vystup (193); 
  RealTime(true);
  Cteni_comps := nacteni;
  RealTime(false);
  NoAcknowledge;
  Stop;
end;
procedure vycitani_comps;
begin
  Zapis_comps(0);
  Form1.Memo1.Lines.Add ( ' 0.   SW verze HW          '+ IntToStr(Cteni_comps));
  Zapis_comps(1);
  Form1.Memo1.Lines.Add ( ' 1.   0-255                ' + IntToStr(Cteni_comps));
  Zapis_comps(1);
  Form1.Gauge1.Progress := (Cteni_comps);
  Form1.Label1.Caption :=  floattostr(Trunc(Form1.Gauge1.Progress * 1.411764705)) + ' °';

  Zapis_comps(2);
  Form1.Memo1.Lines.Add ( ' 2.   0-359,9- 1/2         '+ IntToStr(Cteni_comps));
  Zapis_comps(3);
  Form1.Memo1.Lines.Add ( ' 3.   0-359,9- 2/2         '+ IntToStr(Cteni_comps));
  Zapis_comps(4);
  Form1.Memo1.Lines.Add ( ' 4.   Diference Senz. 1    '+ IntToStr(Cteni_comps));
  Zapis_comps(5);
  Form1.Memo1.Lines.Add ( ' 5.   Diference Senz. 1    '+ IntToStr(Cteni_comps));
  Zapis_comps(6);
  Form1.Memo1.Lines.Add ( ' 6.   Diference Senz. 2    '+ IntToStr(Cteni_comps));
  Zapis_comps(7);
  Form1.Memo1.Lines.Add ( ' 7.   Diference Senz. 2    '+ IntToStr(Cteni_comps));
  Zapis_comps(8);
  Form1.Memo1.Lines.Add ( ' 8.   Calibr. 1            '+ IntToStr(Cteni_comps));
  Zapis_comps(9);
  Form1.Memo1.Lines.Add ( ' 9.   Calibr. 1            '+ IntToStr(Cteni_comps));
  Zapis_comps(10);
  Form1.Memo1.Lines.Add ( '10.  Calibr. 2            '+ IntToStr(Cteni_comps));
  Zapis_comps(11);
  Form1.Memo1.Lines.Add ( '11.  Calibr. 2            '+ IntToStr(Cteni_comps));
  Zapis_comps(12);
  Form1.Memo1.Lines.Add ( '12.  nc                   '+ IntToStr(Cteni_comps));
  Zapis_comps(13);
  Form1.Memo1.Lines.Add ( '13.  nc                   '+ IntToStr(Cteni_comps));
  Zapis_comps(14);
  Form1.Memo1.Lines.Add ( '14.  log 0 = bez kalib.   '+ IntToStr(Cteni_comps));
  Zapis_comps(15);
  Form1.Memo1.Lines.Add ( '15.  255 přík. kalibrace  '+ IntToStr(Cteni_comps));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  I2C_Init;
  Timer1.Interval := 10;
  Timer1.Enabled := true;
  vycitani_comps;
 
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Memo1.Clear;
vycitani_comps;
end;
 
procedure TForm1.CheckBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if CheckBox1.Checked = true then
 begin
    Zapis_comps(1);
    Timer1.Enabled := true;
 end;
 if CheckBox1.Checked = false then Timer1.Enabled := false;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
begin
Start;
  vystup (192);
  vystup (15);
  vystup (255);
  Stop;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Start;
  vystup (192);
  vystup (15);
  vystup (0);
  Stop;
end;
end.