Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi I²C Ansteuerung über USB Schnittstelle (https://www.delphipraxis.net/150650-i%B2c-ansteuerung-ueber-usb-schnittstelle.html)

Tom K. 22. Apr 2010 20:26


I²C Ansteuerung über USB Schnittstelle
 
Hallo Leute

Im Rahmen meiner Staatsexamensarbeit plane ich den Nachbau dieser Low-Cost-Wärmebildkamera: Klick
Dabei sind zwei Thermosensoren TPA81 (I²C-Anbindung) über einen USB-I²C-Adapter mit dem Rechner verbunden. Der Adapter besitzt einen FTDI-Chip.
So ein Programm, das die Herren im o.g. Artikel in C++ geschrieben haben, möchte ich für meinen Nachbau in Delphi schreiben, da ich vor einigen Jahren in der Schule bereits reichlich mit Delphi zu tun hatte. Leider wurde damals keine Schnittstellenprogrammierung behandelt...

Mir ist zwar an Hand der Quellen klar, welche Zeichenketten ich den Sensoren schicken muss, damit die z.B. die Servos steuern, bzw. wie ich die Temperaturen aus einer ausgelesenen Zeichenkette extrahiere. Was mir aber völlig unklar ist: Wohin muss ich die Zeichenkette schicken bzw. woher kann ich eine empfangen? Ich brauch sicher irgendein Handle zu irgendeinem Bus, aber da hängt's bei mir grad total :(

Hat zufällig schon jemand mit diesem USB-I²C-Adapter oder generell mit FTDI-Chips gearbeitet? Kann mir jemand nen Tipp geben, wo ich genaue Infos herkriege, wie ich die Schnittstelle anspreche (die "Hinweise" von FTDI sind mir irgendwie ein totales Rätsel)? Oder könnte jemand der sich auskennt vielleicht sogar kurz etwas Zeit opfern, mir es hier zu erklären (wenn es nicht zu umfangreich wird)?
Ihr würdet mir echt verdammt weiterhelfen :)

Grüße
Tom



PS: Falls wichtig: Ich arbeite mit Borland Delphi 6 Personal und Win7 64bit.

himitsu 22. Apr 2010 20:45

Re: I²C Ansteuerung über USB Schnittstelle
 
Da dieses ein I²C-zu-COMPort-Adapter ist, ist es recht einfach.
Du brauchst einfach nur den entsprechenden COM-Port ansprechen.
Hier wird ja eine USB-zu-COMPort-Umleitung (via Treiber) eingerichtet, so daß du den USB-Port nicht selber ansteuern mußt.

z.B. Hier im Forum suchenTComPort, Hier im Forum suchenAsyncPro oder direkt das Device "COMx" wie eine Datei öffnen (x = eine Nummer von 0 bis 9 für den entsprechenden Port).

Tom K. 22. Apr 2010 20:58

Re: I²C Ansteuerung über USB Schnittstelle
 
Danke für die schnelle Antwort. Dass es "recht einfach" ist, beruhigt schonmal :)
Hab mal nach diesem TComPort und AsyncPro Ausschau gehalten. Leider lassen sich diese neuen Versionen in meinem Uralt-Delphi-6 irgendwie nicht installieren :roll: Gibts von TComPort noch irgendwo paar alte Versionen? Ich mein, für meine einfachen Aufgaben (paar Strings senden und empfangen) brauch ich vielleicht nicht das aller aktuellste, oder? Neue Delphi-Versionen sind mir zu teuer, und mit 30Tage Trial komm ich auch nicht weit...

himitsu 22. Apr 2010 21:06

Re: I²C Ansteuerung über USB Schnittstelle
 
Kenn mich mit diesen Komponenten nicht aus.

Aber notfalls kannst du sowas nehmen.
(Solange dir die Standardeinstellungen des Systems/Windows ausreichen ... also Baudrate, Stoppbits usw. )

Delphi-Quellcode:
var T: TextFile;

AssignFile(T, 'COM2');
Rewrite(T);
Write(T, 'dein string');
Flush(T); // da TextFile gepuffert ist
...
Ein TFileStream ließe sich ebenso verwenden.

Tom K. 22. Apr 2010 21:36

Re: I²C Ansteuerung über USB Schnittstelle
 
@himitsu: Dein Vorschlag sieht schön einfach aus. Würd ich gern so machen... aber: Wird der Code ausgeführt, stürzt das Programm ab und Windows gibt ne schöne Fehlermeldung *grins*

Ich hab TComPort in Version 3.0 im Netz gefunden und erfolgreich installieren können! :)
Mal schauen wie weit ich komme. Trotzdem erstmal: Danke! :)

Alloc 22. Apr 2010 22:00

Re: I²C Ansteuerung über USB Schnittstelle
 
Hi Tom,

eine weitere Möglichkeit mit FTDI-Chips zu sprechen ist deren eigene API FTD2XX. Hat zB. den Vorteil, dass man nicht wissen muss, welche COM-Port-Nummer Windows dem Gerät beim Anstöpseln gegeben hat. Außerdem ist bei höheren Datenraten die Systemlast deutlich geringer und die Bytes werden nicht einzeln rausgeschickt ;)

Eine kleine Klasse von mir, die die API kapselt, findest du unter http://svn.chrilly.net/delphi/FTDI_D2XX/. Keine Garantie auf Vollständigkeit, sollte aber für diese Aufgabe völlig ausreichend sein ;)

Grüße,
Chris

R2009 23. Apr 2010 05:04

Re: I²C Ansteuerung über USB Schnittstelle
 
Hi,

asynchpro gibts bei sourceforge. Das Installationspackage enthält die Versionen ab Delphi2.
Bei FTDI gibts einen Wrapper (Delphi) mit Beispielen.

Mit beiden arbeite ich! Asynchpro ist sehr einfach. Nur bei der Installation muss man halt
die Anleitung durchlesen.
Die FTDI Geschichte ist etwas anspruchsvoller aber auch da gilt lesen und ausprobieren.

Grüsse
Rainer

Tom K. 24. Apr 2010 10:36

Re: I²C Ansteuerung über USB Schnittstelle
 
Bei sourceforge find ich leider nur die aktuelle Version 5.00 von Async Pro: http://sourceforge.net/projects/tpapro/
Die Anleitung beschreibt die Installation ab Delphi 7. Ich hab 6. Und eine naive Installation schlug leider fehl.
Der Vorteil für mich von Async Pro wäre, dass eine Befehlsreferenz als PDF beiliegt. Zu meiner TComPort 3.0 Version gibts zwar ne Hilfe, aber die kann ich nicht öffnen/installieren :(

@Alloc: Das Ansprechen mit der FTDI-eigenen API kam mir auch schon in den Sinn. Aber bevor ich die DLL einbinde und mich da reinarbeite, dacht ich, gibt's bestimmt einfachere Varianten. Es ist ja letztlich auch nur ein relativ simples Problem, das ich habe (siehe Beispiel unten). Deine Dateien hab ich erfolgreich installieren können - zumindest hat das kleine Delphi-Fensterchen mir das gesagt :D Hab das FTDI_D2XX auch immerhin schon unter dem Register "Samples" gefunden *stolz* Aber dann? Hab leider irgendwie den roten Faden verloren... wie sprech ich damit jetzt mein Gerät an?

Zurück zu TComPro:
Meine Sensoren steuern die Servomotoren selbst an, wenn ich ihnen den Befehl dazu gebe. Um z.B. einen Servo auf Position 0 zu drehen, muss ich an den Sensor folgenden Hex-Code schicken:
0x55 0xD0 0x1 0x1 0x0
(heißt: Schreibkommando - Adresse des Sensors - Register im Sensor - Anzahl der zu übermittelnden Bytes - Servoposition)
Da mir schleierhaft ist, was das ominöse "0x" jedes mal davor soll und auch nicht wüsste, welcher Variablentyp das mitmacht, hab ich einfach mal angenommen, dass ich folgendes schicken muss:
55 D0 1 1 0
Mein USB-I²C Adapter liegt am COM2 an.
Was ist im folgenden Code falsch?

Delphi-Quellcode:
procedure TForm1.SendTestClick(Sender: TObject);
begin
ComPort1.Open;

ComPort1.WriteStr(Chr($55)+Chr($D0)+Chr($1)+Chr($1)+Chr($0));

Comport1.Close;
end;
Funktioniert leider nicht. Normalerweise müsste am Adapter auch eine kleine grüne LED blinken, wenn da irgendwas ankommt. Tut sie aber nicht. Der Servomotor macht natürlich auch keine Bewegungen...
Edit: ComPort1.Port ist natürlich auf COM2 gestellt.

himitsu 24. Apr 2010 11:17

Re: I²C Ansteuerung über USB Schnittstelle
 
Versuch mal dieses:
Delphi-Quellcode:
var
  H: THandle;
  L: LongWord;

begin
  H := CreateFile('COM2', GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
  if H = INVALID_HANDLE_VALUE then
    ShowMessage(SysErrorMessage(GetLastError));
  if not WriteFile(H, #85#208#1#1#0, 5, L, nil) then
    ShowMessage(SysErrorMessage(GetLastError));
  CloseHandle(H);
0x ist in C/C++ die Kennung für einen hexadezimalen Wert,
also das was das $ in Delphi ist.

Tom K. 24. Apr 2010 13:31

Re: I²C Ansteuerung über USB Schnittstelle
 
Zitat:

Zitat von himitsu
0x ist in C/C++ die Kennung für einen hexadezimalen Wert,
also das was das $ in Delphi ist.

Danke, wieder was gelernt :)

Dein Code funktioniert leider auch nicht :( Es kommt aber keine Fehlermeldung, es passiert einfach gar nix. Nur wenn der USB-Stecker gezogen ist, kommt eine Meldung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz