Com- port(rs232), pic -parancsok, delphi7/win7

Com- port(rs232), pic -parancsok, delphi7/win7
2011-09-10T19:09:56+02:00
2011-10-19T17:05:51+02:00
2022-11-23T10:00:40+01:00
mzozo95
Sziasztok!

Szeretném ezt <link> a vezérlőt saját, delphi-s programmal vezérelni, de eddig com-portot még sosem kezeltem(csak lpt-t).
Igazából nem is nagyon értem(nem a lefordításával van a gond) hogy hogyan működik a pc oldali dolog...

- Gondolom a külön hex és dec számok azért vannak ott, mert mindegy melyiket használom(pl $10 vagy 16), kinek mi a kényelmesebb, de lehet hogy tévedek.

-A következő sorban ott van, hogy a szervó pozíciója 0 és 255 közötti értékeket vehet fel. Ezt az értéket hogyan adhatom meg?

- Következő oszlopban ismét ír a hex dec-ről, utána pedig hogy a szervót ki lehet választani kiküldött 0-255 értékkel... De csak 8 servót tud vezérelni a hardware, tehát 0-7 a kiválasztandó szervó száma?

- De pl a "Enable Servo Output"-nál nincs is meg a harmadik szám...

Gondolom a comport nem irányítható úgy, mint a 'sima' lpt, mert ott nincs a harmadik számérték megadási helye(pl pozíció megadása)...
azaz így:
... procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll'; function PortIn(Port:Word):Byte; stdcall; external 'io.dll'; ... portout($378,1); ...

Tehát mivel lehetne működésre bírni a comport-ot?

Tudna valaki segíteni?
Előre is köszönöm!

Üdv.: Zoltán
Mutasd a teljes hozzászólást!


  • Innen letöltheted a szükséges komponenseket.

    Mutasd a teljes hozzászólást!
  • Szia!
    Ezeket a komponenseket hogyan kell használni?
    Pl hogyan állíthatom be a szervón h az 1es szervó a 156os értékre pozicionáljon?

    Tudnál valami forráskód részlettel segíteni?

    (Egyébként CportLib komponensem már van fenn)

    Üdv.: Zoltán
    Mutasd a teljes hozzászólást!
  • Form1.ComPort1.WriteStr();
    Mutasd a teljes hozzászólást!
  • Szia!

    "kicsit" szűk szavú vagy...
    Tehát így adhatom meg az 1es szervónak hogy a 156-os pozícióba álljon:
    Form1.ComPort1.WriteStr($20,0); Form1.ComPort1.WriteStr($10,156);
    A vessző helyére "+"-t kellene írni vagy a vessző megfelelő?
    egyébként a comport1.write() is érvényes? Vagy mindenképpen string et kell kiküldeni?

    Üdv
    Mutasd a teljes hozzászólást!

  • Járjuk körbe a témát kicsit bővebben. Mire szeretnéd használni az eszközt? Mit tudsz róla eddig?

    Mutasd a teljes hozzászólást!
  • Szia!

    Egy robotkart szeretnék vele irányítani...
    Minden amit tudok az eszközről itt van, mivel ez egy "homemade" cucc: http://www.digitalnemesis.com/info/projects/picservo/

    Újra áttanulmányoztam a leírást, találtam példaparancsokat:
    Example Commands

    Enable Servo 0: 48 + 0 = 48 (ASCII '0')
    Enable Servo 2: 48 + 2 = 50 (ASCII '2')
    Disable Servo 0: 64 + 0 = 64 (ASCII '@')
    Disable Servo 2: 64 + 2 = 66 (ASCII 'B')
    Set Servo 1 Position to 180: 16 + 1 = 17 then 180


    Még mindig van kérdésem:
    (Az utolsó sorban) Az 1es szervó pozícióját úgy állítom be, hogy először kiküldöm neki a 17et és UTÁNA a 180at?


    Delphisítve a példák:
    Form1.ComPort1.WriteStr(48); ...... Form1.ComPort1.WriteStr(50); ..... Form1.ComPort1.WriteStr(64); ..... Form1.ComPort1.WriteStr(66); ..... Form1.ComPort1.WriteStr(17); Form1.ComPort1.WriteStr(180);
    Ezekkel a parancsokkal működőképes a szervó, kell idézőjel vagy akármi más?

    Tehát a második bitet egyszerűen úgy adom meg hogy az első után kiküldöm?

    (itt ír a külön 2 bit ről)
    The first byte always contains the command and the channel to which the command applies. We will call this the 'Command' byte. The second byte (when needed) will contain data for the command; we will call this the 'Data' byte and is used when we need to set the servo offset or position for example


    Mi az a servo offsett?
    Set the servo output 'Offset' value for the servo specified in the channel nibble. The data byte contains the new offset value between 0 and 255.


    Üdv
    Mutasd a teljes hozzászólást!
  • Ez így világosnak tűnik.
    Beállítod a TComPort objektum tulajdonságait:

    BaudRate: br9600
    DataBits: dbEight
    Port: 'COM1' (amire az eszköz került)
    Connected: True

    Ezek után küldheted is a parancsokat...

    Pld.:
    Form1.ComPort1.WriteStr( chr( 48 + 2 ) ); // Enable Servo...
    Mutasd a teljes hozzászólást!
  • és az 1es szervó pozíciója legyen 180 akkor ezt kell megadnom:

    Form1.ComPort1.WriteStr( chr( 16 + 1 ) ); Form1.ComPort1.WriteStr( chr( 180 ) );
    ?
    Mutasd a teljes hozzászólást!

  • Szerintem:

    Form1.ComPort1.WriteStr( chr( 16 + pozíció száma ) );

    Próbáld ki mit lép rá.

    Mutasd a teljes hozzászólást!
  • Szia!
    Nem nagyon akar működni, legalább is a komponensem, ezzel dob ki állandóan...
    http://kepfeltoltes.hu/110912/757122909wtf_www.kepfeltoltes.hu_.jpg
    Mi lehet a gond?

    A komponensedet pedig nem sikerült feltennem, állandóan hibásnak talál valamilyen sort...
    Ahogy telepítettem:
    1. close all(bezártam minden unit-ot)
    2. Component ->install component
    3. Unit file name:->CPortSetup.pas
    4. Package file name:> CPortLib7.dpk
    5. ok

    utána a kis ablakban nem enged az install gombra kattintani, és a compile nél jelez hibát(ha lenyomtam)...
    (de ahogy néztem a komponenseink azonosak...)
    Mit lehet ezzel tenni?

    Üdv.:Zoltán
    Mutasd a teljes hozzászólást!

  • Próbáld meg így:

    File->Open->CPortLib7->Compile->Install
    File->Open->DsgnCport7->Compile->Install

    Mutasd a teljes hozzászólást!
  • most rákattintok a compile-ra és ugyanaz, semmi, nem engedélyezi az install gombot...
    Bemásoltam a lib-mappába mindent a komponenstől de így sem akar működni...

    A hibaüzenetre amit belinkeltem mi lehet az orvosság?
    http://kepfeltoltes.hu/110912/757122909wtf_www.kepfeltoltes.hu_.jpg
    project raised exception class ereaderror with message 'property StoredProps does not exist'. Processed stoppes use step or run to continue
    Mutasd a teljes hozzászólást!
  • Szia.

    Nekem olyan problémám volt régen, hogy CD-ről másoltam fel az installálandó csomagokat, és ez miatt írásvédett volt. Így pedig nem akarta felinstallálni a Delphi.

    A PIC mintaprogram-ban egész jól kiolvashatók a szükséges infók:


    ; To control the servos and outputs we need to send commands to the PIC.
    ; These commands will come from the serial port of a host computer running
    ; at 2400 baud, Hardware flow control (using CTS/RTS) with eight data bits,
    ; one stop bit and no parity. (2400 8-N-1).
    ;
    ; The commands take the format of one or two bytes sent sequentially
    ; the first being the command to execute the second containing the data
    ; for the command if needed.
    ;
    ; The command byte is split into two "nibbles". The upper 4 bits are used to
    ; determine the command, the lower 4 bits are used to select the output channel
    ;
    ; +-----+-----+-----+-----+-----+-----+-----+-----+
    ; MSB |..7..|..6..|..5..|..4..|..3..|..2..|..1..|..0..| LSB
    ; |.128.|..64.|..32.|..16.|..8..|..4..|..2..|..1..| Decimal Value
    ; +-----+-----+-----+-----+-----+-----+-----+-----+
    ; |.......Command.........|.....Channel Select....|
    ; +-----+-----+-----+-----+-----+-----+-----+-----+
    ;


    Ami érdekes lehet, az a soros port beállítás:
    at 2400 baud, Hardware flow control (using CTS/RTS) with eight data bits,
    ; one stop bit and no parity. (2400 8-N-1).

    A továbbiakból kiderül, hogy az alapvető parancsokat 1 byte tartalmazza, annak is a felső 4 bit-je. Az alsó 4 bit határozza meg, hogy melyik csatornára vonatkozik a parancs.

    Szerintem van olyan parancs, ami 2 byte hosszú. Az első byte az előzőekben leírt, és ezt követi még egy byte ami az adatot állítja be. Ilyenek lehetnek a pozíció és offset beállítások.
    (Hex10, dec16, Set the servo output 'Position' )és
    (Hex20, dec32, Set the servo output 'Offset')

    Ha már működik a Com portod a programból, akkor a parancsokat akár így is kiküldheted:

    var myCom : byte; myDat : byte; begin // x->parancs száma, y->csatorna száma myCom:= x+y; // z->adat (pozíció, vagy offset) myDat:= z; if ((myCom and 240)=16)or((myCom and 240)=32)then begin // 2 Két byte-os parancs Form1.ComPort1.WriteStr(char(myCom)+char(myDat)); end else begin // 1 byte-os parancs Form1.ComPort1.WriteStr(char(myCom)); end;
    Mutasd a teljes hozzászólást!
  • Szia!

    Sikerült megoldanom, a tcomport működik( javítottam a delphit)

    Kipróbáltam a vezérlőt, a saját programjával működik(igaz ott is furcsán, mert ugrál a szervó és nem szépen mozog)

    Delphivel beállítottam a tcom tulajdonságait(2400-8-1-flow:hardvare-party: none)

    Kipróbáltam a forráskódoddal, azzal sem megy, megpróbáltam reset-elni is, de semmi
    (a resetet így is:
    Form1.ComPort1.WriteStr(char(00)); --------- Form1.ComPort1.WriteStr(char(0)) --------- Form1.ComPort1.WriteStr(chr(0)) ---------- Form1.ComPort1.WriteStr(chr(00))
    de meg sem moccan...

    őrjítő lassan ez a vacak...
    Mutasd a teljes hozzászólást!
  • Ez már egész komoly előrelépés.

    Érdekelne, hogy melyik programot sikerült elindítani, mert ami
    "http://www.digitalnemesis.com/info/projects/picservo/contrib/servo.zip" itt található, az nálam nem indul.

    Esetleg a programod dfm és pas állományát ha láthatnám az is sokat segíteni, akár privátban is küldheted.

    Ami még eszembe jutott:
    Lehet, hogy először be kell állítani a rendszert.
    Pl. ilyen sorrendbe:
    - Reset
    - Offset beállítás
    - Enable csatorna
    - Position beállítás

    A minta program alapján valószínű az offset dec 128.

    Megtaláltam a program forráskódját, valószínűleg visual basic-ben íródott. Nem ismerem a VB-t, de szerintem azzal kezd, hogy 3 resetet küld ki a servo elektronikának.

    Private Sub Form_Load() Let cnt = 0 comSerialOut.CommPort = 1 comSerialOut.Settings = "2400,N,8,1" comSerialOut.PortOpen = True comSerialOut.Handshaking = 2 Do Let cnt = cnt + 1 comSerialOut.Output = Chr$(0) Loop Until cnt = 3 Let cfgfile = "default.ser" End Sub

    Itt találod:Servo Project Files (zip)
    Mutasd a teljes hozzászólást!
  • Szia!

    Nekem működött az a program, amit linkeltél(igaz nem valami jól)... Fel kellett tennem az MSCOMM32.ocx-et hozzá...

    Remek ötletet adtál! Már mozognak a szervók(igaz nem úgy ahogyna kellene)!
    Kicsit 'hamisak' az adatok amik vb-ben , legalábbis a delphis programmal nem működik, csak ha a flow controll=none, ha a stop bit-et 2re állítpom nem rezeg a szervó...
    Ha a servo offset-nek 128as értéket adok, akkor nem középre áll be hanem 60% os balra, ha 255 az értlkre középre áll, de oldalra csak 50-50% ban tér ki...


    Lehet hogy én rontottam le valamit, ha valaki hibát vesz észre, az nyugodtan segítsen!
    Arra sem sikerült rájönnöm, hogy miért tette be a szerző a servo offset-et, talán valami középreállító dolgot akart vele csinálni...

    Csak az első 4ch-t sikerült életrekelteni, a többi 4-et(amik a "digital" ok) nem sikerült életre kelteni...

    Valaki, ötlet?

    A hardware csak akkor fogadja el a parancsokat, ha megadom a 'parancsot', majd az értéket és végül engedélyezem a vezérlést(...=true).

    beillesztem, amire eddig jutottam:

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CPort, ComCtrls, ExtCtrls; type TForm1 = class(TForm) ComPort1: TComPort; Button1: TButton; TrackBar1: TTrackBar; //min:0, max:255 Button2: TButton; Button3: TButton; TrackBar2: TTrackBar; //min:0, max:255 Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure TrackBar2Change(Sender: TObject); procedure TrackBar1Change(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a:integer=1; //csatornaválasztás implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Form1.ComPort1.WriteStr(chr(00)); Form1.ComPort1.WriteStr(chr(0)); Form1.ComPort1.WriteStr(chr(0)); Form1.ComPort1.WriteStr(chr(0));//reset helyes alkalmazása Form1.ComPort1.WriteStr(chr(64)); //servo out tilt Form1.ComPort1.WriteStr(chr(32+a));//offset megnyitása Form1.ComPort1.WriteStr(chr(255)); //érték megadása Form1.ComPort1.WriteStr(chr(48+a)); //servo engedélyez end; procedure TForm1.Button2Click(Sender: TObject); begin Form1.ComPort1.WriteStr(chr(16+a)); // parancs + csaorna Form1.ComPort1.WriteStr(chr(trackbar1.position)); //pozíció Form1.ComPort1.WriteStr(chr(48+a)); //out on end; procedure TForm1.Button3Click(Sender: TObject); begin Form1.ComPort1.WriteStr(chr(32+a)); //offset Form1.ComPort1.WriteStr(chr(trackbar2.position)); //pozíció end; procedure TForm1.FormActivate(Sender: TObject); begin button1.Click; end; procedure TForm1.TrackBar2Change(Sender: TObject); begin label2.caption:=inttostr(trackbar2.position); end; procedure TForm1.TrackBar1Change(Sender: TObject); begin label1.caption:=inttostr(trackbar1.position); end; end.

    Üdv.: Zoltán
    Mutasd a teljes hozzászólást!
  • Szerintem a programodban nincs különösebb hiba, bár nincs túl paraméterezve.

    Az elektronikád programja itt található, szerintem ebben lesz meg a kérdéseidre a válasz: PIC program

    A PIC16F84 egy egyszerű kontroller, nincs benne hardver soros port, így azt a benne lévő program szimulálja, és egész egyszerűen. Amíg soros kommunikáció van, addig nem tud mást csinálni ( szervót állítani, stb. ), ezért a kommunikációt a lehető legminimálisabban kell használnod. Egyébként valószínűleg ez okozza azt, hogy a 2 stop bittel jobban működik, mert így a két küldött bájt között van ideje a dolgait (interrupt, stb.) elvégezni. A baj csak akkor lesz, ha fogadni is akarsz, mert hogy az elektronika is küld választ. Inkább küldd két részletbe a parancsot (már ha 2 byte-os) mondjuk egy timerrel.

    pl.:
    A SendTXT egy globális string változó, amibe belerakod a küldendő adatokat.

    ...Timer1... begin if length(SendTXT)>0 then begin Form1.ComPort1.WriteStr(SendTXT[1]); SendTXT:=copy(SendTXT,2,Length(SendTXT)-1); end; end;

    A parancsokra és eseményekre az eszköz is ad szöveges választ a soros porton, ezért azt érdemes lenne egy Memo-ba kiíratni.

    A kódból egyébként az is kiderül, hogy a Reset parancs 2 byte, és gyanítom biztos ami biztos alapon megismétli a VB programban aki azt írta.

    A csatornák 0-7 közt változtathatók.

    Ha jól értelmeztem a kódot, akkor a rendszer semmi mást nem csinál, csak a szervó megcímzett csatornáját egy offset-nyi és egy pozicio-nyi időre működteti. Ez alapján úgy gondolom, hogy a szervó motor valahogy úgy működhet, hogy egyik csatornával jobbra, másik csatornával balra forgathatod.
    Azért ha küldenél valami infót a motorról az is segíthetne.

    Elvileg használ FlowControl-t a rendszer, de számomra elég zavaros. Esetleg ha sikerül beüzemelned a flowcontrolt, akkor lehet, hogy nem szükséges a timer-es adat küldés. Ehhez flowcontrol-hoz ha minden igaz, akkor ezt a kábelt kell használnod: Null modem with full handshaking
    Mutasd a teljes hozzászólást!
  • Szia!

    A szervó motorok működése: <link>

    egy kép róluk: <link>

    Délutánra utánanézek a dolgoknak, majd írom a fejleményeket!
    Mutasd a teljes hozzászólást!
  • Szia!

    ''Kicsit'' összetettem a pic programja mint gondoltam...:)
    Tényleg fontos a flow controll, akkor nem fog zavaros adatokat kiküldeni ha üzemelne. A visszaérkező adatok is fontosak, látni lehet ha valami hibát észlelt a program...

    Holnap megépítek egy hozzá való, "Null modem with full handshaking" csatlakozót...

    Üdv
    Mutasd a teljes hozzászólást!
  • Szia!

    Sajnos a kábel nem jött be, meg sem moccan és nem villog a kijelző led sem...

    Átolvasom még1x az asm-filet...

    Üdv.: Zoltán
    Mutasd a teljes hozzászólást!
  • Inkább a kapcsolási rajzot kell átnézni, hogy milyen legyen a kábel.

    Shematic

    Hát ja.....

    Egy egyszerű hosszabbító kábel kell, semmi fordítás. Ha megnézed az RX vezetéket a MAX232 kimenetére van kötve, tehát a PC RX vezetékéről beszél, nem a saját RX vezetékéről. Ugyan ez a helyzet a többinél is.

    A programodba pedig ezeket állítsd be:
    CtsFlow := True
    DsrFlow := True
    Dtr := Enable
    Rts := Enable

    A szintaktika nem helyes, de a jelölések egyértelműek.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Ez a hardware sajnos nem megbízható, pontosan úgy csináltam mindent, ahogy írta a leírás, de így is eszméletlenül pontatlan( zizengek a szervók, nem oda állnak be ahova kellene)...

    Belefogok egy saját eszköz készítésébe és programozásába, egy msp430 segítségével.

    A C nyelvet sajnos még nem ismerem( ez a mikrokontroller prog.nyelve)... Ismer valaki egy jó olvasmányt ami témába vág?

    Zoltán
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd