Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Sterowanie robotem przez LPT

Snikers 22 Jan 2005 15:09 9068 30
  • #1
    Snikers
    Level 24  
    Witam,
    Dopiero zaczynam zabawę z programowaniem i postanowiłem (właściwie to musze jako część pracy dyplomowej) napisać program, który przy pomocy portu LPT (wybrałem ten ze względu na interfejs równoległy oraz napięcia 0-5Vss) będzie sterował serwomechanizmami modelarskim (dokładnie pięcioma niezależnie). Planuje podpiąć do każdego bitu (d0-d4) sygnał do serwa. Problem polega na tym, że nie za bardzo wiem, jaki język programowania byłby dobry do napisania takie programu. Oraz jak zadać na odpowiedni bit sygnał. Są to serwa HS-322HD. Zrobiłem prosty układ do sterowania katem obrotu przy pomocy potencjometru (na dwóch NE555), bo na tym się jako tako znam jednak założenia były takie, że układ będzie sterowany z komputera. Serwa są częścią wykonawcza ramienia robota. Z góry dziękuje za pomoc.
  • #2
    elektryk
    Level 42  
    Żaden nowoczesny język programowania nie zawiera żadnego specialnego wsparcia dla komunikacji portem szeregowym. Samą komunikacje osiąga się jedynie poprzez biblioteki i dodatkowe moduły.
  • #3
    krzychoo_soft
    Level 17  
    jeśli zdecydujesz się na c++ (na oknach oczywiście) to polecam wykorzystanie biblioteki WinIO... Z tego względu że moim zdaniem jest najpewniejsza, no i oczywiście działa na pochodnych systemu NT bez zbędnych komplikacji i zewnętrznych "modułów" odblokowujących port. Przykład wysyłania i odczytywania z LPT (D0-D7) masz tutaj:

    https://www.elektroda.pl/rtvforum/topic229912.html

    kod jest w C++ dla Borlanda 6.

    jak by co to służe pomocą,
    pozdrawiam
  • #4
    PiRoman2
    Level 20  
    Proponuję, abyś pisał program pod DOS'em. Wysterowanie serw wymaga zmiany długości "impulsu" od 1 do 2 ms (życzę powodzenia przy próbie wysterowania serwa pod Windą) i musisz to zrobic programowo.
  • #5
    BoskiDialer
    Level 34  
    nigdy niesterowałem serwomechanizmów ale z wypowiedzi PiRoman2 powstał dla mnie problem:
    z jednej strony jest to: chcemy sterować długością impulsu z dokładnością zapewne 0,1ms albo i więcej.. a z drugiej strony problemu jest to: system potrafi zabrać czas procesowi na czas nieokreślony (około 50ms) co może zniweczyć wystawianie krótkich sekwencji.... istnieją również brzydkie przerwania sprzętowe..
    istnieją dla mnie 2 rozwiązania: pierwsze rozwiązanie to zewnętrzny układ który będzie odbierał dane metodą synchroniczną i sam będzie generował impulsy o odpowieniej długości..
    druga metoda to program multi-thread.. z czego jened wątek przejmie na siebie generowanie drobnych sekwencji w oparciu o HPT.. wątek ten działał by na priorytecie tpHighest aby procesor więcej czasu procesora poświęcał na ten wątek... oczywiście można ustawić tpTimeCritical i wtedy wątek będzie na równi z kernelem i system cały czas procesora przeznaczy temu wątku.. ale wtedy niemamy możliwości sterowania...
  • #6
    Snikers
    Level 24  
    Tak mi się wydawało, że bez procesora się nie obejdzie. To już zapewne nie ten dział, ale może ktoś mogłyby polecić procesor, który by się do takiego sterowania nadał. W szkole uczę się, 8051 ale wydaje mi się, że szkoda go do sterowania 5 serwami i cyfrowym przełącznikiem sygnałów A/V
  • #7
    softmen
    Level 11  
    Jesli chcesz aby to dobrze wypadlo to lpt powinno sluzyc tylko do przesylania polecen do zewnetrznej elektroniki. Normalnie stosuje sie uC do sterowania bezposredniego serwami. Przykladow w sieci jest duzo. Poszukaj stron o mikro robotach np. mobilnych(hobbystycznych). Wiekszosc z nich uzywa do poruszania sie serwomechanizmow.
    Do najpopularniejszych uC do sterowania nalezy HC11. Na stronie www.handyboard.com znajdziesz wszystko co mozna sobie zamazyc. Od interpretera C do sterowania w asemblerze. Jest rowniez wiele rozwiazan na PIC lub Atmel90. Co prawda wiekszosc z nik komunikuje sie z PC za pomoca rs232 bo wymaga to mniejszej ilosc linek, a poza tym jest wbudowany w kazdy uC.
  • #8
    fantom
    Level 31  
    BoskiDialer wrote:
    nigdy niesterowałem serwomechanizmów ale z wypowiedzi PiRoman2 powstał dla mnie problem:
    z jednej strony jest to: chcemy sterować długością impulsu z dokładnością zapewne 0,1ms albo i więcej.. a z drugiej strony problemu jest to: system potrafi zabrać czas procesowi na czas nieokreślony (około 50ms) co może zniweczyć wystawianie krótkich sekwencji.... istnieją również brzydkie przerwania sprzętowe..
    istnieją dla mnie 2 rozwiązania: pierwsze rozwiązanie to zewnętrzny układ który będzie odbierał dane metodą synchroniczną i sam będzie generował impulsy o odpowieniej długości..
    druga metoda to program multi-thread.. z czego jened wątek przejmie na siebie generowanie drobnych sekwencji w oparciu o HPT.. wątek ten działał by na priorytecie tpHighest aby procesor więcej czasu procesora poświęcał na ten wątek... oczywiście można ustawić tpTimeCritical i wtedy wątek będzie na równi z kernelem i system cały czas procesora przeznaczy temu wątku.. ale wtedy niemamy możliwości sterowania...


    Szczerze watpie aby proces w trybie uzytkownika mogl dostac priorytet na rowni z kernelem (nie w windowsie).Nawet jesli jest gdzies tak napisane to i tak bralbym to z duuuza rezerwa.Najlepiej byloby napisac sterownik do tego sprzetu a jeszcze lepiej uzyc do tego linuksa.
  • #9
    ZeeWolf
    Level 28  
    Nie jestem zby obeznany w temacie (:)), ale do sterowania zewnetrzna elektronika polecalbym asemblera w DOS (baaaaaaardzo stabilny system, a bez multithreada mozna sie obejsc) - ASM jest najblizszy logice elektroniczne, jezeli moge sie tak wyrazic, poza tym, z poziomu ASM mozesz programowac niemal kazdy uklad komputera. Oczywiscie, to tylko moja opinia. Pozdrawiam.
  • #10
    BoskiDialer
    Level 34  
    fantom: kernel to jest właściwie podstawa systemu.. kernel wykorzystuje 100% zasobów procesora.. ale na szczęście nie na swoje potrzeby a na potrzeby programów, sterowników i przerwań... pisząc że na równi z kernelem chciałem powiedzieć że zuzywa 99% (w trybie TimeCritical) zasobów procesora (niestety na swoje potrzeby), blokując działanie wszystkich innych programów.. (99 bo 1% na przerwania których sam nieobsługuje)..

    p.s. przecież niemoże być programu który był by na równi z kernelem w sęsie DPL.. dpl=0 ma tylko kernel.. dpl=3 jest dla programów użytkownika...

    ZeeWolf: oczywiście że asm jest wspaniały i daje ogromne możliwości.. ale czy programista piszący w asm ma takie umiejętności i cierpliwość żeby napisać np cały system tylko w asm? asm dla pojedynczego programu jest dobry.. ale nie zawsze.. większych projektów prawie nigdy niepisze sie 100% w asm..
  • #11
    ZeeWolf
    Level 28  
    BoskiDialer: Nie nie, oczywiscie, ja tez prawie nigdy nie pisze calego programu w ASM, ale wstawki w "czystym" ASM sa bardzo, bardzo pomocne (chocby wlasnie do bezposredniej obslugi portow). Niestety, z moich doswiadczen wynika, ze "czysty" ASM i Windows sie nie znosza (WP mode jest strasznie pogmatwany), dlatego polecam srodowisko DOS. Pozdrawiam.
  • #12
    fantom
    Level 31  
    Umowmy sie : Windows do procesow typu RT (ani nawet pseudo RT) sie nie nadaje w ogole. Dos to totalny przezytek do ktorego nie warto wracac nawet w przyplywie depresji.Linuks co prawda nie jest rowniez systemem czasu rzeczywistego ale ma sie znacznie wieksza kontrole nad procesami i mozna napisac procesy pseudo RT.Dodatkowo sterowniki pisane w linuksie sa faktycznie wkompilowywane w jadro i dzialaja na tym samym poziomie a wiec najszybciej jak sie da, dlatego do tego typu prac zdecydowanie radzilbym linuksa.Dodatkowy atut to mozliwosc zrobienia bootowalnego z plyty linuksa, ktory nie wymagalby instalacji na danym kompie aby mozna bylo programik uruchomic.
  • #13
    BoskiDialer
    Level 34  
    fantom: a może jeśli wszystko ma być najszybsze jak sie da to nielepiej napisać właśny program-system ? bootloader na dyskietke mam swojej produkcji (moge podesłać).. ładuje cały plik, odrazu ładuje GDT, wchodzi w tryb chroniony, odblokowywuje linie A20.. jeden plik kernela.. nietrzeba obsługi przerwań (zablokować wszystko :) ), zero przerw podczas pracy programu, można działać na całej pamięci.. rejestry segmentowe- poco sie przejmować.. stronnicowania niestety niema.., ogólnie żyć nieumierać.. gożej że wtedy niedziałają przerwania biosu więc w trybie 32bitowym dostęp do floppu jest odrazu zablokowany.. trzeba by napisać własny moduł.. itd.. aktualnie mam swój kernel w którym robie experymenty.. transmisja danych przez lpt między 2 kompami (40KB/s ...) kilka opcji jak zdalny dostęp do przestrzeni IO oraz pamięci.. poprostu zabawa..
  • #14
    fantom
    Level 31  
    No coz tylko pogratulowac samozaparcia.Ja szczerze mowiac wole na razie poczytac o tym jak inni to robia (czytaj:kody zrodlowe i wszystko co sie tyczy linuxowego kernela ;-)).Napewno tak ja mowisz jest najszybciej ale ... jesli juz tak robic to chyba lepiej po prostu dodac proca i komunikowac sie z pecetem przy uzyciu jednego z wielu interfejsow (w tym LPT).No coz mozliwosci jest jak widac bardzo wiele ale to chyba dobrze dla autora watku ;-).Ja zycze powodzenia w pracy z wlasnym kernelem i trzymam kciuki.Kto wie moze wkrotce powstanie Dialux :D.Pozdrawiam.

    P.S. Znam osobiscie czlowieka ktory napisal wlasne mikrojadro systemu czasu rzeczywistego na architekture IA-32.Nawet dzialalo ;-).
  • #15
    Snikers
    Level 24  
    Witam, wydaje mi się, że doby do sterowania byłby PIC16F84, co do komunikacji przez port COM to ja już się kompletnie na tym nie znam. Poszukam jeszcze w Internecie.
    ---------
    W EP był kiedyś artykuł o robocie tylko tam całość była zrobiona beż procesora i sterowana z LPT. Musze poszukać tą gazetę
  • #16
    User removed account
    User removed account  
  • #17
    Snikers
    Level 24  
    Niestety nie ma dostępu do tych PDF’ów. Prenumeratorzy EP mogą mieć dostęp do archiwalnych numerów EDW?

    ----------

    Trochę poszukać, trochę popatrzeć i zdobyłem ten plik. Rzeczywiście jest to bardzo fajna rzecz. Robot kroczący. Ważne, że układ steruje serwami i można go zaadaptować do mojej „ręki robota”
  • #18
    Snikers
    Level 24  
    Czy ktoś wie jak połączyć „scrollbar” z „edit”

    Sterowanie robotem przez LPT

    Tak, aby podczas przewijania paska zmieniała się wartość w okienku oraz gdy wpiszemy wartość do okienka i klikniemy obok (wyjdziemy z trybu edycji w okienku) to suwak się przesunie na podaną wartość. Suwak mam ustawiony na 213 kroków, czyli wartością maksymalna jest 213 a minimalną 0. Szukałem jakiś kursów, ale nic nie mogę znaleźć a program pisze w C++Builder 5, mam wersje demo 60dniową.
  • #19
    tojatomek
    Level 14  
    W Object Inspector dla scrolla zmień Max na 213
    Teraz również w Object Inspector przejdź do zakładki Events Zaznacz OnChange i kliknij dwukrotnie w Liste która powinna być pusta, pojawi Ci się okienko w którym piszesz kod, a tam:
    void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
    {
    
    }

    Międze nawiasami { } wstaw
    Edit1->Text = ScrollBar1->Position;
    Oczywiście edit musi się nazywać Edit1, a Pasek ScrollBar1 - czyli domyślnie :)
  • #20
    Snikers
    Level 24  
    Dzięki, działa. Czy jest sposób na uzależnienie paska w drugą stronę? Gdy będziemy wpisywać wartość do okienka a pasek by się przestawiał. Jeszcze chciałbym zapytać o wysyłanie komend na port LPT. W BASIC’u, na którym się znam i mam nawet książkę wygląda to np. OUT &H378, (wartość 0-255). Nie wiem czy mogę, ale spróbuje zamieścić artykuł z EDW 10/98 jest tam opisane sterowanie pod BASIC’iem
    Attachments:
  • #21
    tojatomek
    Level 14  
    Tak, można to zrobić w drugą stronę stronę
    Można(dla Edit1) do Events-> Onchange(jest to nie wygodne, bo po każdej zmianie w edit będzie prubował zmienić suwak, nawet po naciśnięcu backspace i liter), albo do Events->OnDblClick(po dwóch kliknięciach w suwak się przesunie) wstawić poniższy kod
    c = StrToInt(Edit1->Text);
     if (c < 214 && c >= 0)
        ScrollBar1->Position = StrToInt(Edit1->Text);
      else
        ShowMessage("zly parametr (0 ; 213)");

    I jeszcze na początku programu zdefiniować zmienna

    A co do wysyłania bitów na port to polaeca biblioteke WinIO, lub PortNT Obydwie znajdiesz w google razem z helpem gdzie jest napisane co i jak, tak samo prosto, jak w basicu.
  • #22
    Snikers
    Level 24  
    Wpisałem to pod „Events->OnExit” suwak zmienia położenie przy wyjściu z okna edycji. WINio jest pod windowy 95/98 a portNT pod XP. Nie wiem, na jakiej platformie będę działać podczas obrony pracy. Czy jest możliwość, aby program napisany pod WINio działał na XP w trybie zgodności?
  • #23
    tojatomek
    Level 14  
    Snikers wrote:
    WINio jest pod windowy 95/98 a portNT pod XP. Nie wiem, na jakiej platformie będę działać podczas obrony pracy. Czy jest możliwość, aby program napisany pod WINio działał na XP w trybie zgodności?

    Zdaje się że PortNT działa pod wszystkimi windowsami z rodziny NT, czyli NT, XP i 2000. Co Ci szkodzi zrobić 2 wersje programu? Jedną dla NT z PortNT, a drugą dla 98/95 z WinIO, albo kazać programowi sprawdzić jaki masz system i wybrać bibliotekę... A najprościej to spytaj się promotora dokładnie na jakim sprzęcie będziesz działał, albo czy możesz przynieść własny komputer...
  • #24
    User removed account
    User removed account  
  • #25
    krzychoo_soft
    Level 17  
    zgadzam się z tjanusz`em, WinIO działa bez problemu na pochodnych NT... jeszcze mi się nie zdażyło żeby były jakieś większe komplikacje. A co do pracy pod 9x ... to też nie było żadnych niespodzianek. Ogólnie używam WinIO właśnie dlatego że jest w miare uniwersalny jeśli chodzi o mobilność... :)

    pozdrawiam,
  • #26
    mrrudzin
    Level 39  
    Dwa tygodnie temu broniłem pracy:
    Nietypowe zastosowania portu równoległego LPT

    Tym nietypowym zastosowaniem był robot - model suwnicy przenoszący róźne metalowe rzeczy.
    Troche na www.hercules.webpark.pl
    coś na temat programów:
    https://www.elektroda.pl/rtvforum/topic206408.html

    całość oprogramowania pisałem w c++...
  • #27
    fantom
    Level 31  
    mrrudzin wrote:
    Dwa tygodnie temu broniłem pracy:
    Nietypowe zastosowania portu równoległego LPT

    Tym nietypowym zastosowaniem był robot - model suwnicy przenoszący róźne metalowe rzeczy.
    Troche na www.hercules.webpark.pl
    coś na temat programów:
    https://www.elektroda.pl/rtvforum/topic206408.html

    całość oprogramowania pisałem w c++...

    Moze sie troche czepiam ale program nie jest napisany w C++ tylko w czystym C.Niby nie ma to nic do rzeczy odnosnie tematu ale uwazam ze powinno sie rozrozniac te dwa jezyki.Ogolnie ciekawy pomysl i fajne wykonanie (szczegolnie czesc mechaniczna).Pozdrawiam.
  • #28
    Snikers
    Level 24  
    Witam ponownie :) Zrobiłem tego robota a właściwie ramie oraz sterownik. Nadal mam problem z napisaniem programu dla windows 98 bo na takiej platformie ma to pracować. Sterowanie odbywa się przez podanie na port LPT (d0-d7) liczby od 32-255 oraz na przpisaniu tego do rejestru odpowiedniego buforu sterownika (jest ich 6) przez podanie odpowieniej wartosci na (pin17), (pin 16), (pin 1) czyli na 3 bitach 8 stanow. Jeżeli było ciezko to zrozumiec podaje przykład wpisywania wartosci do sterownika który po otrzymaniu komndy utrzymuje serwo w zadanej pozycji

    OUT &H37A, 4 ;ustawia na pinach 17, 16, 1, taki stan że nie jest wybrany żaden z 6 buforów podpiętych do dekodera BCD na 1z10 czyli dane z D0-D7 nie są przepisywane do buforu
    OUT &H378, 93 ;ustawia stan na D0-D7 w tym wypadku 01011101 (domyślny kat obrotu) dla chwytaka
    OUT &H37A, 1 ;ustawia zapis do bufora 1, w tym momencie dane z d0-d1 są przepisywane do buforu.
    OUT &H37A, 4 ;ustawia stan uniemożliwiający zapisanie danych do buforów.
    OUT &H378, 95 ustawia stan na D0-D7 dla obrotu w „nadgarstku”
    OUT &H37A, 8 ;ustawia zapis do bufora 2, w tym momencie dane z d0-d1 są przepisywane do buforu.
    OUT &H37A, 4 ;ustawia stan uniemożliwiający zapisanie danych do buforów.
    OUT &H378, 230 ustawia stan na D0-D7 dla zgięcia ramienia
    OUT &H37A, 9 ;ustawia zapis do bufora 3, w tym momencie dane z d0-d1 są przepisywane do buforu.
    OUT &H37A, 4 ;ustawia stan uniemożliwiający zapisanie danych do buforów.
    OUT &H378, 67 ustawia stan na D0-D7 pochylenia ramienia
    OUT &H37A, 13 ;ustawia zapis do bufora 4, w tym momencie dane z d0-d1 są przepisywane do buforu.
    OUT &H37A, 4 ;ustawia stan uniemożliwiający zapisanie danych do buforów.
    OUT &H378, 141 ustawia stan na D0-D7 dla obrotu podstawy ramienia
    OUT &H37A, 2 ;ustawia zapis do bufora 5, w tym momencie dane z d0-d1 są przepisywane do buforu.
    OUT &H37A, 4 ;ustawia stan uniemożliwiający zapisanie danych do buforów.
    OUT &H378, 0 ustawia stan na D0-D7 dla wyboru kamery
    OUT &H37A, 12 ;ustawia zapis do bufora 6, w tym momencie dane z d0-d1 są przepisywane do buforu.
    OUT &H37A, 4 ;ustawia stan uniemożliwiający zapisanie danych do buforów.

    Przedstawiony listing jest fragmentem programu napisanego przeze mnie (dokładnie jest to podprogram który ustawa serwa w pozycjach domyślnych) pod dos’em jednak obsługa tego jest beznadziejna ponieważ należy wpisywać wartości oraz zmieniać serwa.

    Dlatego proszę o pomoc w napisaniu programu pod windows’a z suwakami i w ogóle :) mam już zrobiony interfejs oraz zkojazone suwaki z polem tekstowym jednak nie potrafi ysterowac portu. Wszelka pomoc w programowaniu mile widziana.

    Ps. Znam się tylko na Qbasicu wiec proszę o cierpliwosc jeżeli czegos nie zrozumiem.
  • #29
    Akane
    Level 27  
    wybazgrałem takie coś
    Const CK_IDLE  = 4
    Const LPT_DATA = 0x378
    Const LPT_CLK  = 0x37A
    
    Const BUFOR_1 = 1
    Const BUFOR_2 = 8
    Const BUFOR_3 = 9
    Const BUFOR_4 = 13
    Const BUFOR_5 = 2
    Const BUFOR_6 = 12
    
    sub zapis_do_bufora(bufor:int, dana:int)
    	_outp(LPT_DATA, dana)  : Sleep(1)
    	_outp(LPT_CLK, bufor) : Sleep(1)
    	_outp(LPT_CLK, CK_IDLE): Sleep(1)
    	return
    endsub


    czyli już jest jakieś ułatwienie wpisu danych do bufora(x).
    Napisz jak to ma wyglądać, co ma robić to się skuszę ponownie :)
  • #30
    Snikers
    Level 24  
    Witam program zacząłem pisać przy użyciu C++ builder 5. Przy pomocy użytkowników forum mam połączone scroll bar’y z oknem edit. jednak nadal nie potrafię uruchomić odpowiedniej biblioteki żeby pod windowsem 98 móc obsługiwać port LPT. Jeżeli udało by się pokonać tą przeszkodę to pozostaje jeszcze skojarzenie scroll bar’ów z wartością podawana na wyjścia d0-d7 oraz zmuszenie programu aby po każdej zmianie scrolla lub edit boxa zmieniał adresowanie buforów sterownika z 4 na dany i z danego na 4 do tego dochodzą jeszcze radio button group który służy do wyboru kamery na chwytaku ale myślę ze gdybym znal komendy do scrolla to z tym bym sobie poradził.

    Postaram się dodać fotki ramienia oraz sterownika w najbliższym czasie.

    Chętnie odpowiem na pytania dotyczące budowy tego ramienia chociaż to pewnie nie ten dział forum;)