Sterownie USB z poziomu delphi.

Odpowiedz Nowy wątek
2006-09-14 20:21
Endi
0

Witam. Potrzebowal bym informacji na temat sterowania USB z poziomu delphi. Czy jest to w ogole mozliwe? Chodzilo by mianowicie mniejwiecej o architekture USB oraz sposoby jej wysterowania. Jestem w tym temacie nowy ;) Jak narazie z poziomu delphi sterowalem tylko LPT. Czy jest miedzy sterowaniem LPT a USB wielka roznica? Z poczatku myslalem o sterowaniu diodami, w celu opanowania. Pozniej chcialbym bezprzewdowo sterowac silniki krokowe. Z gory dziekuje.

Pozostało 580 znaków

2006-09-14 21:35
0

Różnica nie jest wielka, o ile sterowałeś LPT jako plikiem (CreateFile/ReadFile/WriteFile/CloseHandle), a nie przez jakieś komponenty lub sposobem a'la Windows 9x. Było na forum wielokrotnie.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2006-09-14 22:18
0

miedzy sterowaniem moze i nie.... ale od strony podlaczania do
niego diod, czy tam czego chcesz - gigantyczna.

Pozostało 580 znaków

2006-09-14 22:50
0

Jeśli kupisz do tego dedykowany scalak (najtańsze one nie są), to będziesz miał całą robotę z głowy. Ale zapomnij, że będziesz samodzielnie umiał zaprogramować mikrokomputer ogólnego przeznaczenia (np.: rodziny 8051) do tego zadania. To jest dosyć trudne jak dla początkującego elektronika zadanie.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2006-09-15 08:52
0

Witam, może to się komuś przyda, dla potomnych ;)

unit U_Usb;

interface

uses
Windows, Messages, SysUtils, Classes, Forms;

type

PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = packed record
  dbch_size: DWORD;
  dbch_devicetype: DWORD;
  dbch_reserved: DWORD;
end;

PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
DEV_BROADCAST_DEVICEINTERFACE = record
  dbcc_size: DWORD;
  dbcc_devicetype: DWORD;
  dbcc_reserved: DWORD;
  dbcc_classguid: TGUID;
  dbcc_name: short;
end;

const
GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class

type

TComponentUSB = class(TComponent)
private
FWindowHandle: HWND;
FOnUSBArrival: TNotifyEvent;
FOnUSBRemove: TNotifyEvent;
procedure WndProc(var Msg: TMessage);
function USBRegister: Boolean;
protected
procedure WMDeviceChange(var Msg : TMessage); dynamic;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
end;

implementation

constructor TComponentUSB.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
USBRegister;
end;

destructor TComponentUSB.Destroy;
begin
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;

procedure TComponentUSB.WndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_DEVICECHANGE) then begin
try
WMDeviceChange( Msg );
except
Application.HandleException(Self);
end;
end
else
Msg.Result := DefWindowProc( FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

procedure TComponentUSB.WMDeviceChange(var Msg : TMessage);
var
devType: Integer;
Datos: PDevBroadcastHdr;
begin
if (msg.WParam=DBT_DEVICEARRIVAL) or (msg.WParam=DBT_DEVICEREMOVECOMPLETE) then begin
Datos := PDevBroadcastHdr(msg.LParam);
devType := Datos^.dbch_devicetype;
if devType=DBT_DEVTYP_DEVICEINTERFACE then begin // USB Device
if msg.WParam=DBT_DEVICEARRIVAL then begin
if Assigned( FOnUSBArrival ) then
FOnUSBArrival( Self );
end else begin
if Assigned( FOnUSBRemove ) then
FOnUSBRemove( Self );
end;
end;
end;
end;

function TComponentUSB.USBRegister: Boolean;
var
dbi: DEV_BROADCAST_DEVICEINTERFACE;
size: Integer;
r: Pointer;
begin
Result := False;
size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
ZeroMemory( @dbi, size );
dbi.dbcc_size := size;
dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
dbi.dbcc_reserved := 0;
dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
dbi.dbcc_name := 0;

 r := RegisterDeviceNotification( FWindowHandle,
                                  @dbi,
                                  DEVICE_NOTIFY_WINDOW_HANDLE
                                 );
 if Assigned( r ) then Result := True;

end;

end.

Pozostało 580 znaków

2006-09-15 15:59
Endi
0

Dzieki za dotychczasowe odpowiedzi. Ale czy byla by mozliwosc dania jakiegos konkretnego przykladu np. sterowanie czterema diodami. Jak mialo by to byc rozwiazane? W internecie raczej nic nie moglem znalezc na ten temat.

Nie rozumiem za bardzo tego kodu, ktory przytoczyles. Moglbys go jakos objasnic , albo ew. dac link gdzie to jest opisane? (moze byc po Angielsku, z tym nie mam problemow ;) )

PS. Nie chce isc na "latwizne". Chce sie poprostu nauzyc obslugiwac urzadzenia pod USB z Delphi.

Pozostało 580 znaków

2006-09-15 18:10
0
Endi napisał(a)

Dzieki za dotychczasowe odpowiedzi. Ale czy byla by mozliwosc dania jakiegos konkretnego przykladu np. sterowanie czterema diodami. Jak mialo by to byc rozwiazane? W internecie raczej nic nie moglem znalezc na ten temat.

Nie rozumiem za bardzo tego kodu, ktory przytoczyles. Moglbys go jakos objasnic , albo ew. dac link gdzie to jest opisane? (moze byc po Angielsku, z tym nie mam problemow ;) )

PS. Nie chce isc na "latwizne". Chce sie poprostu nauzyc obslugiwac urzadzenia pod USB z Delphi.

zajlatwiej cos podlaczyc cos do usb uzywajac odpowiednich ukladow...
najczesciej robia Ci one z portu usb port szeregowy lub rownolegly.
a pod takie porty juz bardzo latwo cos podlaczyc, w necie znajdziesz o tym bardzo duzo informacji.
jesli chodzi o te tajemnicze uklady...:
http://www.soyter.com/index.php?pid=66&prid=51
pozdro [browar]

Pozostało 580 znaków

2006-09-15 19:01
0

Szwagier, a kiedy zdarzyles zainstalowac sobie delphi - Adrian.

Pozostało 580 znaków

2006-09-15 23:46
0

Jak się chce to mieć najprościej i najtaniej, to chyba najlepiej sobie zbudować IgorPlug USB (http://cesko.host.sk). Łatwe w wykonaniu, a dostajesz odbiornik podczerwieni oraz 8-bitowy port (pod warunkiem, że zrobisz tą większą wersję, na AT90S2313) sterowany przez USB za pomocą odpowiedniej biblioteki DLL :).

Pozostało 580 znaków

2006-09-17 22:10
Endi
0

Czy istnieje jakiś banalny przykład obrazujący zasadę działania, podłączenia diody do USB i zasadę programowania USB w najprostrzym wydaniu ? np. choć by jednej diody zapalanie i gaszenie ?
Jakie są różnice w podłączeniu do USB ? Czy trzeba stosować elektronikę pomiędzy USB a diodą ?

Pozostało 580 znaków

2006-09-18 08:58
0

Witam, bezpośrednio nie ma możliwości podłączenia i sterowania diodami poprzez port usb, chodzi mi oczywiście o takie podłączenie jak z com-em (rs232) do pinów, no chyba że do masy i +5 ale to mija się z celem :P
Da sie jednak zastosować układy konwertujące. w linku który podał Pan cimak są owe układy.
Firma FTDI opracowała układ FT232BM na nim działa cała masa nonwerterów usb -> com, do samego układu firma FTDI udostępnia dwa rodzaje sterowników:
VCP (Virtual COM Port) Sterowniki wirtualnego portu COM i
D2XX ( Sterowniki bezpośrednie USB).
Pierwsze z nich po wykryciu i instalacji emulują dodatkowe złącze COM a te drugie dają ci bezpośrednie sterowanie portem usb (ciekawsze i ambitniejsze rozwiązanie).
No dobra ale do rzeczy ;)
Aby sterować diodami poprzez usb bedzię potrzebny konwerter usb->com
(np taki:http://www.soyter.com.pl/index.php?pid=128)
oraz układy wykonawczy (schemat+art pod adrestem http://www.chip.pl/arts/archiwum/n/articlear_18145.html)
Teraz wystarczy połączyć te dwa układy ze sobą i już mamy hardwerową część załatwioną, teraz zostaje do napisania soft :D
Po komponent do komunikacji z układami Ft8u232/245 BM
przy użyciu interfejsu FT_WIN32_API zgłoś się na PW.
Pozdrawiam.
PS. temat ciekawy proponuje go w przyszłości rozwijać.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0