Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Program dla robota, wysyłanie sygnału do portu...

badyllek1993 05 Gru 2009 12:34 2985 19
  • #1 05 Gru 2009 12:34
    badyllek1993
    Poziom 12  

    Witam.
    Jestem 1 pierwszej klasie technikum informatycznego, jednak nie potrafię samemu rozwiązać pewnego problemu związanego z programowaniem. Na razie przerabiamy Pascala, ale Pascal chyba się nie nada...

    Planuję zbudować prostego robota (na razie planuję), który będzie sterowany programem przez komputer. Kwestia elektroniczna i mechaniczna to dla mnie mały problem.
    Myślałem robocie na dwóch gąsienicach, z dwoma niezależnymi silniczkami, które będą umożliwiały pełen zakres ruchów pojazdu.
    I teraz meritum: w jakim języku napisać program, który będzie wysyłał dwa niezależne sygnały np. na port USB. Po prostu gdy trzymam np. klawisz "A" wysyłany jest sygnał 1. który uruchamia lewą gąsienicę. "L" - sygnał 2. uruchamiający prawą.

    Z portu USB sygnały wędrują przewodem do radiolinii, ta wysyła sygnały do odbiornika na robocie. Zależy mi także, żeby sygnał był ciągły, nie impulsowy.

    W jakim języku to napisać, poproszę, o jakąś nazwę komendy, itp.
    Jak będzie wyglądał sygnał na porcie? Będzie to jakiś rodzaj napięcia (jakiego?)?

    Pozdrawiam i z góry dziękuję.

    0 19
  • #2 05 Gru 2009 16:59
    ekomont
    Poziom 16  

    To zależy. Jeżeli będzie to wirtualny port COM, to pascal sobie poradzi bez kłopotu...

    0
  • #3 05 Gru 2009 20:46
    wrych
    Poziom 20  

    Łatwiej to będzie zrobić przy pomocy portu LPT... i bez problemu w Pascalu. Jak Twój pojazd będzie działał, to wtedy pomyślisz o zmianie LPT na USB, czy innych komplikacjach. Port USB nie działa tak, jak Ty sobie (chyba) wyobrażasz. Na początek zrób sterowanie przy pomocy kabla, później dodasz radiolinię (ciekaw jestem jaką masz koncepcję w tym zakresie).

    0
  • #4 06 Gru 2009 00:33
    badyllek1993
    Poziom 12  

    Dobrze, myślę, że zaprogramowanie portu LPT, to już coraz mniejszy problem, tym bardziej, że w internecie jest kilka programów, zarządzających LPT.

    "ciekaw jestem jaką masz koncepcję w tym zakresie".

    Cóż. Wszystko zależy od tego jakie jest napięcie wychodzące z pinów LPT. Myślałem o tradycyjnych przekaźnikach. Załóżmy, że wychodzi 5V na pinie nr 1. Wtedy przekaźnik podłączony do tego pinu, załączą obwód nr 1 w radiolini, który przesyła do odbiornika "rozkaz", włączający gąsienicę np. lewą.
    Nie zależy mi na jakim kol wiek wysyłaniu danych (nie ten poziom...), bo nie wiedział bym co z nimi potem zrobić. Po prostu napięciem wychodzącym chcę załatwić ten problem.

    0
  • Pomocny post
    #5 06 Gru 2009 09:12
    wrych
    Poziom 20  

    Zobacz ten link Link.
    Strona po angielsku (tym bawili się w szkołach w Australii), ale warto po niej pobuszować.
    Co do radiolinii, Twój pomysł jest teoretyczny, czy masz już jakieś praktyczne rozwiązania? Ten temat przesyłania informacji by mnie interesował...

    0
  • #6 06 Gru 2009 13:16
    badyllek1993
    Poziom 12  

    Wrych, myślałem np. o radiu, które służy jako pilot do bram garażowych: np. http://allegro.pl/item829573556_sterownik_bramy_radiolinia_zdalne_sterowanie_200m.html

    Nadajnik, czyli pilot, będzie podłączony przekaźnikiem do portu LPT (lub innego). W te dwa kanały w pilocie wlutowany będzie obwód, który będzie działał, tak, jak bym przyciskał na nim przycisk (wlutowanym obwodem zarządzał będzie program).
    Skoro "przycisk" będzie wciśnięty, odbiornik odbiera sygnał i (pewnie przez kolejny przekaźnik) załącza obwód danej gąsienicy. Ot cała filozofia.

    Mam tatę elektryka/elektronika zajmującego się takimi rzeczami, więc z dostępem do części i ew. pomocą nie będzie problemu. Poza tym jakąś swoją wiedzę w dziedzinie elektroniki też chyba mam... :)

    Tylko interesuje mnie jakie napięcie wychodzi z tego portu, czy wystarczy sam przekaźnik, czy jakiś kolejny układ trzeba będzie obmyślać. Czy bezpośrednio podłączając "pin sygnałowy - przekaźnik - masa", nie uszkodzę portu?

    Wrych, za zainteresowanie tematem daję Ci "pomógł", mam nadzieję, że jeszcze coś napiszesz...

    Edit:
    Poza tym teraz radiolinie są takie, że wystarczy wpiąć kable, a po dostarczeniu przez nie prądu wysyła sygnał. Nie trzeba się pierdzielić z lutowaniem, chociaż o tyle z tymi przyciskami jest fajnie, że nie potrzeba komputera, aby bawić się pojazdem.

    0
  • #7 06 Gru 2009 14:01
    wrych
    Poziom 20  

    A ja myślałem o tańszym rozwiązaniu - bezprzewodowy gong kupiony w hipermarkecie na wyprzedaży (zasięg będzie mniejszy ale mi to na początek wystarczy). W linku jaki Ci podałem wcześniej znajdziesz rozwiązanie wykorzystujące układ ULN 2803 do sterowania przekaźnikiem. Bezpośrednio przekaźnika nie podłączaj do portu LPT!

    Powodzenia w konstruowaniu, pokazuj na forum co zrobiłeś i pytaj o to czego nie wiesz... W programowaniu mogę pomóc, a na elektronice też nieco się znam.

    0
  • #8 06 Gru 2009 22:22
    badyllek1993
    Poziom 12  

    Gong też pomysł nie najgorszy, ale u mnie walają się stare układy do sterowania bramą, więc aż proszą się o wykorzystanie... Ale nie wykluczone, że skorzystam z Twojego pomysłu.

    Mówisz, żeby nie podłączać przekaźnika bezpośrednio do pinów, czemu? Przecież cewka w przekaźniku na pewno zmniejsza prąd idący obwodem, co zmniejsza ryzyko uszkodzenia.

    Po co jakiś układ, i kolejne trawienie płytki: http://www.freefm.kni.pl/mike/lpt.html

    Na samym dole pisze:

    "Pokazuję tutaj "dobry przykład złego przykładu". Otóż diody podłączyłem bezpośrednio do wyjść, bez rezystorów ograniczających prąd. Okazuje się jednak, że port ma wewnętrzne zabezpieczenia, najczęściej w postaci szeregowego rezystora, który to ogranicza płynący prąd w przypadku wystąpienia zwarcia na linii. Ja zastosowałem żółte diody, które mają większy spadek napięcia w kierunku przewodzenia niż czerwone. Podłączając diody czerwone należy liczyć się z przepływem większego prądu i większym ryzykiem uszkodzenia linii portu! Dlatego zalecam szeregowo z każdą diodą podłączyć rezystor o wartości około 330Ω.".


    Autor artykułu na w/w stronie podłącza bezpośrednio diody do pinów. Stąd pojawił się pomysł, aby wejście przekaźnika podłączyć równolegle do nóżek diody (która będzie jednocześnie sygnalizowała działanie) z opornikiem xxx (musiał bym wyliczyć jaką wartość trzeba będzie zastosować).

    Mam jeszcze jedno teoretyczne pytanie: czy podłączając + z pinu, który wysyła sygnał, masę musimy podłączyć do konkretnego wejścia, czy obojętnie, byle był by to - ?


    Skoro jest to temat w dziale "Programowanie", to żeby nikt nie zarzucił OT:

    Załóżmy, że napiszę program, o którym mowa i będzie działał on doskonale na moim komputerze, sygnały na LPT będą wysyłane. Czy jeżeli program uruchomię i wtykę podłączę na innym kompie, będzie działało? Wiem, że inny komputer może równać się inny adres LPT. Co jeżeli program będzie pisany pod XP, a będzie uruchamiany na innym systemie...?

    Dziękuję wrych i proszę o odpowiedzi innych użytkowników.



    Edit:

    Dodatkowo dadaję szkic tego jak chciałbym, żeby program działał. Dodałem tylko podstawy, czyli to co umiem. Nie wprowadzałem żadnych adresów LPT, ani zmiennych dla tego portu. Myślę, że ktoś uzupełni braki... :=)
    Program ma stale zapętlać. Potem dodam jakieś teksty, graficzne przedstawienie kierunków jazdy itp...

    Code:

    {szkic sterujący LPT}

    Uses crt;

       var
       a:char;

       LABEL miejsce1;

    BEGIN
    clrscr;

    a:=readkey;

    miejsce1:
    clrscr;

    IF (a='l') OR (a='L') Then {załącz obwód nr 1, odpalający gąsienicę lewą};
    IF (a='p') OR (a='P') Then {załącz obwód nr 2, sterujący gąsienicą prawą};
    IF (a='o') OR (a='O') Then {załącz obwód nr 1 i 2, sterujący gąsienicą lewą i prawą};

    {chciałem jeszcze dać takie polecenie, że gdy wciśnięte bądą 'L' i 'P' lub 'l' i 'p' załączone będą
     dwa obwody, ale nie wiem jak to wyjdzie, może można na dwóch zmiennych i "readkey" ?}

    ELSE goto miejsce1;

    goto miejsce1;

    END.


    Dziękuję i pozdrawiam.

    0
  • #9 07 Gru 2009 09:39
    wrych
    Poziom 20  

    Nie znam danych katalogowych współczesnie występujących diod LED, ale do zaświecenia diody wystarczy prąd o natężeniu kilku mA, a do przekażnika ok. 100 mA, a to stanowczo za duże obciążenie dla portu... (polecam ULN2803 lub podobny układ - poczytaj o tym).

    Co do programu, to tak to nie zadziała... Wieczorem przekażę Ci więcej informacji.

    0
  • #10 07 Gru 2009 22:05
    badyllek1993
    Poziom 12  

    Wrych, czekam z niecierpliwością...

    Koledzy, możecie mi jeszcze tylko powiedzieć jakie jest bezpieczne, a jakie maxymalne obciążenie prądowe portu LPT?

    Znalazłem taki post na konkurencyjnym forum:

    "(...)
    Hmm, z tego co ja wiem to maksymalna obciazalnosc portu LPT wynosi (...) 50mA... i w sumie to diody koniecznie przez rezystorki, bo nie jest przyjemnoscią wymieniać cala MoBo z powodu niedbalstwa czy zaskapienia 1zł na rezystory 470Ohm icon_razz.gif
    (...)"

    źródło: http://forum.purepc.pl/lofiversion/index.php?t189489.html

    Pytałem ojca... Mówi, że przekaźnik załączający się od 10, max 20mA, to nie problem. Więc nie wiem czy potrzebny jest jaki kol wiek dodatkowy układ. Poza tym nie wyobrażam sobie, żeby port sam w sobie nie mam jakiegoś zabezpieczenia.

    0
  • #11 08 Gru 2009 20:25
    wrych
    Poziom 20  

    Nie chcę Ci podawać informacji (na 100%), których nie jestem pewien... Gdzieś czytałem o ograniczeniu rzędu 5 mA (nie pamiętam dokładnie gdzie, płyta CD z zebranymi materiałami padła). Natomiast jeśli zastosujesz układ z tranzystorem, i np. prąd bazy będzie 1mA, współczynnik wzmocnienia tranzystora β=150, to w obwodzie CE masz prąd 150 mA (sądzę że o tym Tato Ci opowie)... Układ zadziała i komputer będzie bezpieczny. W uproszczeniu, piny LPT sterują drukarkę poziomem napięcia (stan niski/stan wysoki - TTL).
    Co do programu to wyślę nieco później. Teraz wklejam przykładowy kod programu, jaki używałem do testowania silnika krokowego podłączonego do LPT za pośrednictwem układu ULN2803.

    Code:
    program silnik;
    
    uses crt;
    var stan: byte; p: char;
    begin
      ClrScr;
      writeln('Sterowanie silnika krokowego przez LPT - bity D3, D4, D5 i D6');
      writeln(' s - start');
      writeln(' z - stop ');
      writeln(' p - obrót, krok w prawo');
      writeln(' l - obrót, krok w lewo');
      writeln(' q - koniec pracy');

      stan:=0;
      port[888]:=stan;
      GoToXY(3,10);write('Port[888]:=',stan:5, '  Polecenie:?');
      repeat
        p:=readkey; write(p);
        if p='s' then stan:=8; {start}
        if p='z' then stan:=0; {stop}
        if p='l' then {obrót w lewo}
          begin
            stan:=stan*2;
            if stan=128 then stan:=8;
          end;
        if p='p' then {obrót w prawo}
          begin
            stan:=stan div 2;
            if stan=4 then stan:=64;
          end;
        port[888]:=stan;
        GoToXY(3,10);write('Port[888]:=',stan:5, '  Polecenie:  ');
        until p='q';
        port[888]:=0
    end.

    Do odblokowania portów w XP używam UserPort (szukaj w sieci), a dodatkowo stan LPT podglądam przy pomocy programu parmon (Link. Chwilowo tyle na ten temat.

    0
  • #12 10 Gru 2009 15:58
    badyllek1993
    Poziom 12  

    Przepraszam, że wcześniej nie odpowiedziałem.

    Sprawa wygląda następująco. Max. obciążalność portu LPT wynosi 2,6mA. Stąd też chyba układem sterował będzie tranzystor.

    Więc temat elektroniki prawie rozwiązany.

    Propo programu, to czy nie działa on na takiej zasadzie, że jak klikam 's', czyli start, program puszcza na port sygnał do tech chwili aż do nie zatrzymam przyciskiem 'z' (stop)?

    Bawiłem się instrukcją 'readkey' z tekstem, którego czas wyświetlania mogę ustawić (delay). Jak jest z sygnałem?
    Skąd program ma dane dotyczące 'stan'? Czy stan wyświetla liczbę przekazywanych bitów, a tym samym czynność danego portu? Mogę puszczać sygnał na dwa piny na raz?

    0
  • #13 10 Gru 2009 21:01
    wrych
    Poziom 20  

    To był taki program eksperymentalny. Do LPT miałem podłączony układ ULN2803, piny D0, D1, D2 sterowały diodami (co jest zupełnie w tym momencie bez znaczenia), a do kolejnych D3, D4, D5 i D6 podłączałem silniki krokowe (oczywiście przez układ ULN...).

    Program działa tak:
    stan := 0;

    Naciśnięcie klawisza "S" zmienia stan na 8 - do portu wysyłane jest 00001000 = 8,
    każde naciśnięcie klawisza "L" powoduje wykonanie operacji stan := stan * 2 i wysłanie do portu wartości stan.
    W kolejnych krokach mamy
    00010000 = 16,
    00100000 = 32,
    01000000 = 64,
    po osiąnięciu 10000000 = 128 następuje zamiana na 00001000 = 8 i cykl powtarza się.
    Jedno naciśnięcie klawisza "L", to jeden krok silnika krokowego.
    Podobnie działa to w drugą stronę - klawisz "P".
    "Z" - wyłącza zasilanie od silnika, "q" - przerywa pętlę. To wszystko z programem podanym jako przykład.

    Zanim cokolwiek podłączysz możesz stan portu obserwować przy pomocy programu parmon, jednak musisz odblokować porty w XP za pomocą UserPort, bo inaczej ten mój programik nie będzie "docierał" do portu...

    0
  • #14 10 Gru 2009 23:40
    badyllek1993
    Poziom 12  

    Dobrze, w takim razie jak sterować silnikiem DC, a konkretnie przekaźnikiem podłączonym za tranzystorem?

    Brakuje mi takiej komendy, która wysyła sygnał wtedy, kiedy wciśnięty jest przycisk i przestaje, kiedy jest zwolniony.
    "Readkey" tak nie działa.

    Czy silnik nadąża za program? Przecież zmiana "stan'u" to setne sekundy...

    0
  • #15 11 Gru 2009 21:50
    wrych
    Poziom 20  

    To chyba nie ma sensu angażować komputer po to by trzymając przycisk (klawisz) urządzenie było włączone, po zwolnieniu wyłączone. Wystarczy zwykły włącznik zamykający obwód zasilania.
    Ale można napisać program w ten sposób, że naciśnięcie jednego klawisza włacza silnik, a innego wyłącza lub ten sam klawisz działana zasadzie włącz/wyłącz.
    Program przykładowy masz poniżej:

    Code:
    program on_off;
    
    uses crt;
    var stan: byte; p: char;
    begin
      repeat
        p:=readkey; write(p);
        if p='1' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan or 8; {8 = 00001000}
                     {ustawienie "1" na D3, pozostaˆe bity bez zmian}
                   end;
        if p='0' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan and 247; {247 = 11110111}
                     {ustawienie "O" na D3, pozostałe bity bez zmian}
                   end;


        if p='x' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan xor 8;
                     {zmiana "O/1" na D3, pozostałe bity bez zmian}
                   end;

        if p='y' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan xor 4;
                     {zmiana "O/1" na D2, pozostałe bity bez zmian}
                   end;
        until p='q';
       port[888]:=0
    end.

    0
  • #16 11 Gru 2009 22:23
    alien1983
    Poziom 13  

    Witam
    Jesli masz kase i chcesz potem jeszcze mieć pożytek z części użytych do budowy robota to proponuje płytke arduino + Arduino Ethernet Shield
    + AP. Wtedy możesz sobie sterować z palmtopa komórki z win ce z wifi laptopa lub czegokolwiek chcesz. Ja jestem narazie na etapie pisania programu komunikujacego się z arduino przez (palmtop = > AP (acess point) za pomocą protokołu http) Zalety takiego rozwiązania zestaw praktycznie nadaje się do wszystkiego i niczego zależy od umiejętności i chęci. Dodatkowo poza komunikacja - LAN (po kablu) WIFI (bezprzewodowo), USB , RS 232, lub możesz napisać własny protokół komunikacji :)

    0
  • #17 12 Gru 2009 12:17
    badyllek1993
    Poziom 12  

    Chyba nie rozumiecie mojej idei. Chciałbym sterować pojazdem przez komputer tylko dla zabawy, ewentualnie mógłbym pochwalić się nauczycielowi od programowania, że potrafiłem napisać program sterujący LPT (oczywiście z małą pomocą user'ów elektroda.pl :) ). Więc chyba nie ma potrzeby inwestowania w jakiekolwiek inne układy, choć nie mówię - bajer by był.

    Wrych. Może ty masz rację.



    Co myślicie o takim programie:

    Code:

    program on_off;
    uses crt;
    var stan: byte; p: char;
    begin
      repeat
        p:=readkey; write(p);
        if p='w' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan or 12; {8 = 00001100}
                     {ustawienie "1" na D3i D2, oby dwie gąsienice}
                   end;
        if p='d' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan or 8; {8 = 00001000}
                     {ustawienie "1" na D3, gąsienica lewa, pojazd obraca się w prawo}
                   end;


        if p='l' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan or 4; {4 = 00000100}
                     {ustawienie "1" na D2, gąsienica prawa, pojazd obraca się w lewo}
                   end;

        if p='s' then
                   begin
                     stan := port[888]; {odczyt portu}
                     port[888] := stan or 0;
                     {piny odłączone, pojazd stoi}
                   end;
        until p='q';
       port[888]:=0
    end.

    0
  • Pomocny post
    #18 12 Gru 2009 16:24
    wrych
    Poziom 20  

    Program już masz. Teraz zrealizuj interfejs i model - połącz to przewodem... Przesyłanie impulsów przez radio to będzie nastęny etap. I na koniec pochwal się co stworzyłeś.

    Kolejny etap mógłby być taki:
    - zapisujesz w pliku tekstowym ciąg poleceń,, np:

    Code:
    prosto 15
    
    w prawo 5
    prosto 25
    w lewo 3
    stop 30
    ...

    - piszesz program, który czyta ten plik i realizuje wpisane komendy (liczby oznaczałyby czas realizacji polecenia).

    Albo jeszcze inaczej: sterujesz pojazdem ręcznie, a komputer zapisuje polecenia do pliku. Nastęnie je odtwarzasz.

    0
  • #19 13 Gru 2009 11:18
    badyllek1993
    Poziom 12  

    wrych napisał:
    Kolejny etap mógłby być taki:
    - zapisujesz w pliku tekstowym ciąg poleceń,, np:
    Code:
    prosto 15
    
    w prawo 5
    prosto 25
    w lewo 3
    stop 30
    ...

    - piszesz program, który czyta ten plik i realizuje wpisane komendy (liczby oznaczałyby czas realizacji polecenia).


    Do końca nie wiem do czego było by mi to potrzebne. Chodzi ci o to, że ten plik tekstowy zawierał by polecenia, które czytał by program i dostosował się do nich? Jak wykonać coś takiego? W pliku tekstowym pisać w Pascalu? Nie zabardzo to pojmuję.

    Nie wiem czy radiolinii nie dodać już na początku projektu. Dlaczego miałbym najpierw podłączać przez kabel?

    Kolejne "pomógł" dla Ciebie! :D

    0
  • #20 13 Gru 2009 12:37
    wrych
    Poziom 20  

    Zrób model na podstawie tego co już masz. Jak Ci to wszystko zadziała powrócimy do tworzenia lepszych wersji programu, w Pascalu lub innym języku programowania. Czytanie z pliku tekstowego wczale nie jest trudne. Teraz czekam na zdjęcia modelu...

    0