Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

linefollower by WADer_669

wader_669 25 Feb 2008 21:27 6591 12
  • #1
    wader_669
    Level 28  
    Moj linefollower nie odroznia sie niczym od innych, procz tym ze posiada opuszczane ramie ktore ma przymocowany wklad od dlugopisu, pozwala to pokazac droge robota.
    Ogolnie nigdy nie mailem zamiaru budowac linefollowera, ale byl to projekt na studia.
    Wydaje mi sie ze go jeszcze rozwine cos podobnego do elebota.
    Pierwsze co zrobie to dodam jeszcze dodatkowy czujnik w sumie wtedy beda 4, zrobie to po to by jeszcze szybciej jezdzil za linia.

    linefollower by WADer_669

    linefollower by WADer_669

    linefollower by WADer_669

    ROBOT „ZDZICHU” (linefollower – śledzący linie)

    1. Anatomia robota
    · Układ zasilania „serce”. Źródłem prądu jest bateria Ni-Cd (5xAA) 6.0V 700mAh.
    Układ lm2940-5.0 stabilizuje napięcie na 5V, potrzebne do zasilania procesora (przy większym napięciu układ by się spalił) podobnie z komparatorem.

    linefollower by WADer_669


    · Procesor attiny2313 firmy Atmel. On jest „mózgiem” bada stany na wejściu I lub 0 i według tego wykonuje odpowiednią czynność (która wcześniej mu zaprogramujemy) i wystawia I lub 0 na wyjściu. Mikrokontroler działa na oscylatorze 8mHz

    linefollower by WADer_669

    · Czujniki CNY70. Jest to dioda nadawcza podczerwieni i fototranzystor reagujący na światło podczerwone

    linefollower by WADer_669

    · Komparator LM324. Sprawdza na którym z 2 wejść bramki jest wyższe napięcie i wtedy wystawia I lub 0 na wyjściu bramki. W moim robocie nie możemy podpiąć czujników prosto do procesora, ponieważ mikrokontroler rozpoznaje tylko stan logiczna 1 to jest ok.5V i 0 ok.0V. Moje czujniki maja na wyjściu od 0v do 5v, dlatego zastosowałem komparator.
    LM324 składa się z 4 bramek ja użyłem tylko 3 (3 czujniki). Na 1 wejściu bramek dołączony jest czujnik, na 2 potencjometr (którym możemy sterować czułość). Komparator sprawdza gdzie jest wyższe napięcie i daje odpowiedz wystawiając 1 lub 0 na wyjście bramki które idzie do procesora

    linefollower by WADer_669

    · Mostek-h (h-bridge) L293D „mięśnie”. Nie możemy podłączyć silniczków prosto do procesora, nie jest on wstanie uciągnąć tak dużego poboru natężenia, dlatego użyłem L293D. Można do niego podłączyć max. 4 silniczki tylko wtedy będziemy nimi mogli sterować tylko w jednym kierunku. Gdy chcemy obsługę w 2 strony możemy max. podłączyć 2 silniczki.

    linefollower by WADer_669

    Kompletny schemat:
    (jak widać na schemacie dodałem jeszcze przycisk resetu, działanie podobne jak w komputerze czyli powoduje reset procesora i rozpoczęcie od nowa programu. Można to samo osiągnąć włączając i wyłączając zasilanie)

    linefollower by WADer_669

    · Dodatki:
    Dodałem jeszcze 2 diody, 2 włączniki i odbiornik TSOP1736 za pomocą tego czujnika odbieramy fale podczerwoną 36hz (na takie działają piloty)

    2. Zasada działania.
    Dioda podczerwona emituje światło podczerwone które odbija się od jasnych powierzchni i wpada do fototranzystora(działa podobnie jak fotorezystor) który odpowiednio się zamyka lub otwiera. Jest on podłączony do masy i jak się otwiera powoduje to mniejsze napięcie które idzie do komparatora.
    Komparator porównuje napięcie na czujniki i na potencjometrze. Później wystawia 1 lub 0
    Procesor sprawdza stany które przesyła mu komparator i daje odpowiedz wystawiając 1 lub 0 na wyjściach do mostka h.


    linefollower by WADer_669

    oto kod
    Code:

    $crystal = 8000000

    Config Portd.0 = Output                                     'lewy do przodu
    Config Portd.1 = Output                                     'lewy do tylu

    Config Portd.2 = Output                                     'prawy do tylu
    Config Portd.3 = Output                                     'prawy do przodu


    Config Rc5 = Pind.6                                         'pinb.5 odbiornik rc5

    Config Pinb.0 = Input                                       'fototranzystor lewy
    Config Pinb.1 = Input                                       'fototranzystor srodkowy
    Config Pinb.2 = Input                                       'fototranzystor prawy

    Config Pinb.3 = Input

    Set Pinb.3

    Do

    If Pinb.2 = 1 And Pinb.1 = 0 And Pinb.0 = 1 Then
    Do
    Portd.0 = 1
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 1
    Loop Until Pinb.2 = 0 Or Pinb.0 = 0
    End If

    If Pinb.2 = 0 And Pinb.1 = 1 And Pinb.0 = 1 Then
    Do
    Portd.0 = 0
    Portd.1 = 1
    Portd.2 = 0
    Portd.3 = 1
    Loop Until Pinb.1 = 0
    End If

    If Pinb.2 = 0 And Pinb.1 = 0 And Pinb.1 = 1 Then
    Do
    Portd.0 = 0
    Portd.1 = 1
    Portd.2 = 0
    Portd.3 = 1
    Loop Until Pinb.1 = 0 Or Pinb.2 = 1
    End If

    If Pinb.2 = 1 And Pinb.1 = 1 And Pinb.0 = 0 Then
    Do
    Portd.0 = 1
    Portd.1 = 0
    Portd.2 = 1
    Portd.3 = 0
    Loop Until Pinb.1 = 0
    End If

    If Pinb.2 = 1 And Pinb.1 = 0 And Pinb.0 = 0 Then
    Do
    Portd.0 = 1
    Portd.1 = 0
    Portd.2 = 1
    Portd.3 = 0
    Loop Until Pinb.1 = 0 Or Pinb.0 = 1
    End If

    If Pinb.2 = 0 And Pinb.1 = 0 And Pinb.0 = 0 Then
    Do
    Portd.0 = 1
    Portd.1 = 1
    Portd.2 = 1
    Portd.3 = 1
    Loop Until Pinb.2 = 1 And Pinb.1 = 1 And Pinb.0 = 1 Or Pinb.3 = 0
    End If

    If Pinb.2 = 1 And Pinb.1 = 1 And Pinb.0 = 1 Then
    Do
    Portd.0 = 1
    Portd.1 = 1
    Portd.2 = 1
    Portd.3 = 1
    Loop Until Pinb.2 = 1 Or Pinb.1 = 1 Or Pinb.0 = 1 Or Pinb.3 = 0
    End If

    Loop
    End


    kod do ramienia
    Code:


    $regfile = "attiny2313.dat"

    Config Portd.0 = Output                                     'jak 0 do gory
    Config Portd.1 = Output                                     'jak 0 na dol

    Config Pind.2 = Input                                       'czunjik gorny
    Config Pind.3 = Input                                       'czujnik dolny

    Config Pind.4 = Input


    Set Pind.2
    Set Pind.3
    Set Pind.4

    Do

    Portd.0 = 0
    Portd.1 = 0

    If Pind.4 = 0 Then
    Do
    Portd.0 = 1
    Portd.1 = 0
    Loop Until Pind.4 = 1 Or Pind.2 = 0
    End If

    If Pind.4 = 1 Then
    Do
    Portd.0 = 0
    Portd.1 = 1
    Loop Until Pind.4 = 0 Or Pind.3 = 0
    End If

    If Pind.4 = 1 And Pind.3 = 0 Then
    Do
    Portd.0 = 0
    Portd.1 = 0
    Loop Until Pind.4 = 0 Or Pind.3 = 1
    End If

    If Pind.4 = 0 And Pind.2 = 0 Then
    Do
    Portd.0 = 0
    Portd.1 = 0
    Loop Until Pind.4 = 1 Or Pind.2 = 1
    End If


    Loop
    End


    Gdyby cos sie nie zgadzalo prosze pisac.
    Kod tez musi byc zoptymalizowany :D
  • Helpful post
    #2
    Ikar_91
    Level 13  
    Nawet fajnie ci to wyszło.
    Zaskoczył mnie ten wkład od długopisu. Wyjaśnij na jakiej zasadzie on ma zaznaczać trasę robota skoro on jeździ po linii :?:
    Nadajesz pilotem uniwersalnym czy zbudowałeś swój :?:
    pozdrawiam
  • #3
    wader_669
    Level 28  
    pilota mam od jakiegos starego tv czy satelity.
    Co do wkladu zaznacza ta linie ale jest ona tak cienka albo nie jest wystarczajaco ciemna (nie testowalem tego) i nie wykrywa jej.
    Teraz kartka jest dosyc pokreslona i w niczym to nie przeszkadza.
    Kiedys chcialem uzyc zielonego markera zeby zaznaczal linie i z przodu czujnik koloru. Jak by widzial znowu zielona linie to by sie zatrzymal. Jednak musialem dotrzymac deadlinie i z tego zrezygnowalem. Tesotowalem czy od zielonego odbija sie podczerwien i odbija sie wiec nie zakluca niczego.
  • #4
    krzych_u
    Level 11  
    Ciekawa konstrukcja, gratuluję.
    Czy mógłbyś napisać w jaki sposób przymocowałeś silniczki do kół LEGO? Ewentualnie dodać jakieś dokładniejsze zdjęcie?
  • #5
    wader_669
    Level 28  
    nie polecam ci mojej metody bo jedno kolo chodzi w miare ok a 2 robi 8'emke. Ja zrobilem cos typu adapter, lego posiada takie szare plaskie talerze z 6 dziurami i w srodku gwiazdka ta gwiazdke wywiercilem nastepnie wlozylem ten talerz na bolec od silnika (jest on ksztaltu porstokata) i zalalem zywica epoksydowa. Chyba ciezko bedzie zrozumiec to co napisalem, postaram sie jeszcze pozniej zalaczyc fotki.
    Tak jak mowilem nie polecam tej metody, jednak dziala super robot nie skreca no moze troche :D
  • #6
    krzych_u
    Level 11  
    Chyba rozumiem o co chodzi. Dzięki za wskazówki.
    Sam kilka razy próbowałem zamontować koło LEGO na wale silnika, ale moje metody były niedoskonałe. Wypróbuje Twój pomysł.
    Co prawda posiadam silniczki LEGO, ale fakt, że są 9V, trochę komplikuje zasilanie robota.
  • #7
    misiek1994
    Level 17  
    Wpisz do programu rozwidlenie dróg, bo inaczej jeżeli ktoś wpadnie na pomysł żeby dać linię w dwie różne strony to ci procek zwarjuje.
  • #8
    eternal656
    Level 12  
    mam pytanie czy ten kod
    Kod:

    $crystal = 8000000

    Config Portd.0 = Output 'lewy do przodu
    Config Portd.1 = Output 'lewy do tylu

    Config Portd.2 = Output 'prawy do tylu
    Config Portd.3 = Output 'prawy do przodu


    Config Rc5 = Pind.6 'pinb.5 odbiornik rc5

    Config Pinb.0 = Input 'fototranzystor lewy
    Config Pinb.1 = Input 'fototranzystor srodkowy
    Config Pinb.2 = Input 'fototranzystor prawy

    Config Pinb.3 = Input

    Set Pinb.3

    Do

    If Pinb.2 = 1 And Pinb.1 = 0 And Pinb.0 = 1 Then
    Do
    Portd.0 = 1
    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 1
    Loop Until Pinb.2 = 0 Or Pinb.0 = 0
    End If

    If Pinb.2 = 0 And Pinb.1 = 1 And Pinb.0 = 1 Then
    Do
    Portd.0 = 0
    Portd.1 = 1
    Portd.2 = 0
    Portd.3 = 1
    Loop Until Pinb.1 = 0
    End If

    If Pinb.2 = 0 And Pinb.1 = 0 And Pinb.1 = 1 Then
    Do
    Portd.0 = 0
    Portd.1 = 1
    Portd.2 = 0
    Portd.3 = 1
    Loop Until Pinb.1 = 0 Or Pinb.2 = 1
    End If

    If Pinb.2 = 1 And Pinb.1 = 1 And Pinb.0 = 0 Then
    Do
    Portd.0 = 1
    Portd.1 = 0
    Portd.2 = 1
    Portd.3 = 0
    Loop Until Pinb.1 = 0
    End If

    If Pinb.2 = 1 And Pinb.1 = 0 And Pinb.0 = 0 Then
    Do
    Portd.0 = 1
    Portd.1 = 0
    Portd.2 = 1
    Portd.3 = 0
    Loop Until Pinb.1 = 0 Or Pinb.0 = 1
    End If

    If Pinb.2 = 0 And Pinb.1 = 0 And Pinb.0 = 0 Then
    Do
    Portd.0 = 1
    Portd.1 = 1
    Portd.2 = 1
    Portd.3 = 1
    Loop Until Pinb.2 = 1 And Pinb.1 = 1 And Pinb.0 = 1 Or Pinb.3 = 0
    End If

    If Pinb.2 = 1 And Pinb.1 = 1 And Pinb.0 = 1 Then
    Do
    Portd.0 = 1
    Portd.1 = 1
    Portd.2 = 1
    Portd.3 = 1
    Loop Until Pinb.2 = 1 Or Pinb.1 = 1 Or Pinb.0 = 1 Or Pinb.3 = 0
    End If

    Loop
    End
    jest do zaprogramowania attiny2313
    i czy trzeba programować LM324 i L293 ????
  • #9
    wader_669
    Level 28  
    kurde zauwazylem blad :/
    Code:

    Config Pinb.0 = Input 'fototranzystor lewy
    Config Pinb.1 = Input 'fototranzystor srodkowy
    Config Pinb.2 = Input 'fototranzystor prawy

    set pinb.0
    set pinb.1
    set pinb.2


    i kod jest napisany dla attiny2313 mozesz tez wgrac go w kazdy inny procek tylko zmien regfile i piny moga sie nie zgadzac.
    Radze jeszcze dodac
    Code:

    $regfile="attiny2313def.dat"


    eternal656 wrote:

    i czy trzeba programować LM324 i L293 ????


    hehhe poczytaj tematy na elektrodzie, przyda ci sie.
  • #11
    eternal656
    Level 12  
    he dzieki za porade

    Dodano po 6 [minuty]:

    a to


    Config Pinb.0 = Input 'fototranzystor lewy
    Config Pinb.1 = Input 'fototranzystor srodkowy
    Config Pinb.2 = Input 'fototranzystor prawy

    set pinb.0
    set pinb.1
    set pinb.2

    to mam dać w zamian tego

    Config Pinb.0 = Input 'fototranzystor lewy
    Config Pinb.1 = Input 'fototranzystor srodkowy
    Config Pinb.2 = Input 'fototranzystor prawy

    Config Pinb.3 = Input

    ????????

    Dodano po 1 [minuty]:

    i mam jeszce pod koniec napisać

    $regfile="attiny2313def.dat"

    ???
  • #12
    wader_669
    Level 28  
    masz racje, juz poprawilem.

    Do eternal656 masz tu prawie gotowca wiec zadaj sobie troche turudu i sam poszukaj