Sterownie USB z poziomu delphi.

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 na razie 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.

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.

0

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

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.

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.

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 po prostu nauzyc obslugiwac urzadzenia pod USB z Delphi.

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 po prostu 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]

0

Szwagier, a kiedy zdarzyles zainstalowac sobie delphi - Adrian.

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 :).

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ą ?

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ć.

0

Ja tam w dalszym ciągu polecam IgorPlug'a :P. Nie każdy potrafi polutować części SMD, a chyba tylko w takiej wersji występują układy FTDI ;). Poza tym, za taką kostką też przydałoby się wrzucić jakiś mikrokontroler, co by realizował funkcje portu IO na przykład, czyż nie? :P

0

poza igor pluginem jest jeszcze to

http://www.obdev.at/products/avrusb/powerswitch.html

bardzo proste - mozna wystartowac w kilka minut a bazuje na sterownikach usblib (w wersji windows winusblib)

do wszystkiego jest kod zrodlowy wiec jak co mozna zwiekszyc funkcjonalnosc tego cuda.

niektore mikroprocesory maja wbudowane juz sterowniki usb oraz sa sterowniki (chyba dla user image atmela juz nawet zarejestrowane, bo tak trzeba sciemniany kod generowac dla urzadzenia podszywajac sie pod jakas firme :) )

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