logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8] prosty robot

ours86 13 Cze 2008 18:13 6400 17
  • #1 5242772
    ours86
    Poziom 11  
    witam, stawiam pierwsze kroki w świecie elektroniki, postanowiłem zbudować pierwszy układ zaprojektowany przez siebie. Żeby nie rzucać się od razu na głęboką wodę postanowiłem ze zrobię sobie prostego robocika wzorując się na robocie z komputer świata. Złożenie było takie:
    -sterowanie 4 silnikami 12V (zrealizowane w parach po 2 silniki)
    -2 diody led do sygnalizacji jakichś stanów podczas pracy
    -obsługa ultradźwiękowego miernika odległości Sharp
    -możliwość podłączenia z komputerem przez RS232 oraz alternatywnie możliwość połączenia z innym mikrokontrolerem przez RS
    -oddzielne zasilanie części elektronicznej od zasilania silników w celu uniknięcia ewentualnych zakłóceń

    Chciałbym żeby robot toczył się sam w dowolnym kierunku, a po dojechaniu na pewną odległość do przeszkody (np. ściany) zmienił losowo kierunek i jechał aż nie wykryje kolejnej przeszkody, i tak w kółko.

    Poniżej schemat który sobie narysowałem. Od razu uwaga że program w którym to bazgrałem ukrywa piny zasilające atmegi, L928 oraz max232 wiec proszę nie krzyczeć że zapomniałem o zasilaniu tych układów :) Z wykształcenia jestem mechanikiem, tak więc czekam niecierpliwie na wszystkie uwagi, bo pewnie trochę błędów się znajdzie :)
  • #2 5243113
    adamusx
    Poziom 27  
    Witam.
    Schemat wygląda OK. Jeśli do sterowania używasz ATmege8 to możesz usunąć dławik filtrujący zasilanie AVCC, gdyż ten procesor ma błąd wenatrz struktory polegający na wewnętrznym połączeniu nózek VCC i AVCC (możesz sam sprawdzić mierząc rezystancję między tymi nózkami miernikiem)
    Druga sprawa to taka, że ten czujnik Sharpa to nie czujnik ultradzwiękowy, a triangulacyjny (mierzy kąt odbicia światła)
  • #3 5243176
    bogdan_p
    Poziom 39  
    schemat wygląda na poprawny jednak mam pewne uwagi : domyślam się że chcesz każdą oś napędzać osobnym silnikiem będzie Ci trudno utrzymać prostoliniowość , praktycznie nie ma 2 takich samych silników ( obroty ) co dopiero 4 , oczywiście jest to wykonalne ale wymagana będzie kontrola obrotów każdego silnika i regulacja PWM jeden czujnik to trochę za mało do wykrywania przeszkód , proponuje przejdź sobie na forum robotyka amatorska i zapoznaj się z projektami na tym forum na pewno coś wykorzystasz w swojej konstrukcji
  • #4 5243597
    adamusx
    Poziom 27  
    Cytat:
    domyślam się że chcesz każdą oś napędzać osobnym silnikiem będzie Ci trudno utrzymać prostoliniowość , praktycznie nie ma 2 takich samych silników ( obroty ) co dopiero 4


    Wydaje mi się, że w tak prostych konstrukcjach ten problem można zupełnie pominąć. Poza tym nawet jeśli wszystkie silniki będą miały jednakową prędkość nie da się zachować prostego kierunku jazdy, ze wzgędu na różną przyczepność kół do podłoża, nierówności podłoża itp.

    Widze, że podłączyłeś wejścia ENA i ENB do OC1A i OC1B - czyli wiesz o co chodzi ze sterowaniem prędkością za pomocą PWMa :)
  • #5 5247798
    ours86
    Poziom 11  
    Widzę że nie ma większych uwag, więc biorę się za rzeźbienie płytki :) Co do silników prostoliniowość nie jest najważniejszą cechą, jeżeli będzie poruszał się względnie prosto to będzie dobrze. Pozostaje zresztą kwestia dokładności wykonania kół i ramy. Jeden czujnik jak na początek mi wystarczy, ten robocik ma robić za mały poligon. Zamiast kupować zestaw startowy mam zamiar uczyć się programować na nim :) I jeszcze takie pytanie czy ten błąd ze zwartymi nóżkami dotyczy tylko atmegi8 czy inne modele (np. atmega48) też maja taki błąd?
  • #8 5252467
    ours86
    Poziom 11  
    No i wyrzeźbiłem coś takiego, prosiłbym o uwagi, domyślam się że nikomu nie będzie się tego chciało jakoś wnikliwie analizować, ale prosiłbym o rzut oka, niektóre błędy zawodowcom rzucają się od razu. To moja druga płytka drukowana, chciałbym też żeby była pierwszą działającą :) Po zastanowieniu dorzuciłem jeszcze jeden czujnik sharpa, dlatego załączam też ponownie schemat. Oprócz tego jeszcze dwa screeny płytki jeden z podświetlonymi ścieżkami masy, drugi z podświetloną ścieżką 5V Oba w formacie gif żeby latwo było po tym bazgrać w paincie :)

    EDIT:
    przeglądając topic: [AVR] Jeśli nie działa Ci AVR - sprawdź dlaczego! dorzuciłem jeszcze kondensator 100nF pomiędzy nóżki zasilające procesor oraz dodałem rezystor 4,7k do lini łączącej programator z nóżką PC6 (reset) atmegi. Zaktualizowałem obrazki i schemat.

    [atmega8] prosty robot

    [atmega8] prosty robot
  • #10 5253944
    ours86
    Poziom 11  
    Wydawało mi się że jak są podpięte nóżki 7 (VCC) i 8 (GND) to jest dobrze. Przypominam że zasilanie elektroniki (+5V) leci ze złącza J1. Jeżeli nie o to chodziło to proszę o więcej informacji bo nie wiem za bardzo o co chodzi.
  • #12 5254223
    ours86
    Poziom 11  
    aaa pisałem już że program w którym rysuję (ISIS proteus) ukrywa piny zasilania i masy. Jak się przyjrzysz uważniej to zobaczysz że brakuje tej atmedze paru nóżek (max232 też zresztą nie jest kompletny :)) Nie mam pojęcia gdzie się to wyłącza tak żeby wszystko normalnie pokazywał.
  • #14 5495713
    ours86
    Poziom 11  
    Jak widać realizacja tego projektu rozciągła mi się nieco w czasie :) Mam nadzieje ze nikt nie będzie miał mi za złe że pisze w dosyć starym temacie, ale tutaj znajdują się już wszystkie schematy. Mój problem wygląda następująco: podłączyłem sobie czujnik sharp pod PortC.3 i napisałem sobie następujący kod w bascomie

    
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    Config Pinc.0 = Output
    Config Pinc.1 = Output
    
    Led Alias Portc.0
    
    Declare Function Sharp() As Word
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    Led = 0
    Wait 1
    Led = 1
    
    Do
    If Sharp() > 256 Then
       Led = 0
       Else
       Led = 1
       End If
       Waitms 25
    Loop
       Function Sharp_odczyt() As Word
          Sharp_odczyt = Getadc(4)
       End Function
    End 
    


    Gdy zamacham ręką przed czujnikiem to jedna dioda mi mruga, wszystko jest ok. W ramach poszerzania wiedzy postanowiłem napisać mniej więcej to samo w C:

    
    #define F_CPU 16000000L
    #include <avr/io.h>
    #include <util/delay.h>
    
    unsigned int pomiar;        // Zmienna do przechowywania wyniku pomiaru
    
    void delay_ms(uint16_t ms)
    {
            while(ms)
            {
                    _delay_ms(1);
                    ms--;
            }
    }
    
    
    
    void Inicjalizacja(void)
    {
    
    DDRC = 0x03; //00000011
    PORTC= 0x03;
    
    
    
    // Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
    ADMUX |= _BV(ADLAR);
    // Wybór kanału wejścia - PC3 (ADC3)
    ADMUX |= _BV(MUX1)|_BV(MUX0);
    // Zezwolenie na konwersję
    ADCSRA |= _BV(ADEN);
    // Wybranie częstotliwości dla taktowania przetwornika
    ADCSRA |= _BV(ADPS0);
    ADCSRA |= _BV(ADPS1);
    ADCSRA |= _BV(ADPS2);
    }
    
    int main(void)
    {
        Inicjalizacja();
       
        PORTC |= _BV(0); //dioda żółta zgaszona
        PORTC |= _BV(1); //dioda zielona
        delay_ms(1000);
        PORTC &= ~_BV(1); //zaświeć
        PORTC &= ~_BV(0); //zaświeć
        delay_ms(1000);
       
        while(1)
        {
            ADCSRA |= _BV(ADSC);
            while( ADCSRA & _BV(ADSC)) {};
    
    
            pomiar=ADCH;
            if (pomiar > 256)
            {
            PORTC |= _BV(0);
            PORTC &= ~_BV(1);
            } else
            {
            PORTC &= ~_BV(0);
            PORTC |= _BV(1);
            }
            delay_ms(250);
        }
    }
    


    I ten kod już niestety nie działa, nie wiem dlaczego. Na początku diody są zgaszone przez sekundę potem obie się zapalają na 1 sek (zgodnie z programem) i w końcu gaśnie dioda zielona, świeci tylko dioda żółta. pojawienie się obiektu przed czujnikiem nie wywołuje żadnych zmian. Ktoś wie dlaczego tak się dzieje?
  • #16 5496894
    ours86
    Poziom 11  
    Nie potrafię zrozumieć zachowania mojego układu. Gdy zmieniłem warunek

    if (pomiar > 256) na if (pomiar > 128) nadal świeci się tylko dioda żółta
    gdy zaś if (pomiar > 64) świeci się tylko dioda zielona. Pojawienie się przeszkody przed czujnikiem w obu przypadkach niczego nie zmienia.

    Dla if (pomiar > 96) diody mrugają naprzemiennie przez kilka sekund po czym na chwilę zapala się dioda żółta żeby po chwili diody znowu mrugały naprzemiennie. I to wszystko dla czujnika wycelowanego w sufit, nie ma przed nim żadnej przeszkody. Może ktoś jakoś logicznie wytłumaczyć dlaczego tak się dzieje?
  • #17 5498041
    Balu
    Poziom 38  
    Nie chce mi się czytać od początku - nie wiem co za czujnik ale:
    widocznie Twój czujnik ma na wyjściu napięcie w okolicy 96bin i się losuje tam stan;-)

    P.S. zdajesz Sobie sprawę, że w C musisz odczytać zawartość ADCH I ADCL żeby zmienna > 256?:> (oczywiście muszą być odpoiwednio wyjustowane i sklejone;-) ).
  • #18 5500276
    ours86
    Poziom 11  
    Jest to standardowy czujnik Sharpa GP2D12 i nie powinno się tu nic losować, przynajmniej tak na moje oko. W zależności od odległości zmienia się napięcie, a w moim wypadku zmiana odległości między czujnikiem a przeszkodą nic nie daje. Diodki mrugają cały czas tak jak w opisie powyżej.
REKLAMA