Skocz do zawartości

aixI

Użytkownicy
  • Zawartość

    782
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    13

Posty napisane przez aixI


  1. W sumie jakby się tak dobrze zastanowić, to jeżeli mają to być jakieś dobre, pomocne funkcje, które mają nauczać początkujących i wpajać im od samego początku dobre nawyki, to jest to prawdą, że jednak nie powinno się stosować "delay'a" w przerwaniu - sam wiem, że się go tam nie powinno stosować, ale niestety nie usprawiedliwia mnie to. Poprawiłem i ustawiłem autodel.

    Pozdrawiam,


  2. Chciałbym Wam przedstawić funkcję do obsługi przycisku (ang. switch) w przerwaniu INT0 na pinie PD2 portu D mikrokontrolera AVR firmy ATMEL ATmega8. Kod źródłowy napisany jest w języku C dla 8-bitowych mikrokontrolerów AVR. Podstawowe informacje o tym mikrokontrolerze można znaleźć w jego nocie katalogowej (ang. datasheet) wpisując w przeglądarkę internetową frazę "ATmega8 datasheet".

     

    Takie rozwiązanie pozwala na użycie tegoż przycisku jako przycisk ON/OFF naszego robota lub innego urządzenia 🙂

     

    Przedstawię teraz konfigurację przycisku i zmiennej globalnej do obsługi przerwania:

    // Definiujemy przycisk, który znajduje się na pinie 2 portu D, czyli PD2.
    #define Przycisk_PIN (1<<PD2)
    #define Przycisk (PIND & Przycisk_PIN)
    
    volatile int jazda = 0;
    

     

    Teraz przechodzimy do "Głównej funkcji programu" i ustawiamy pin PD2 jako wejście, ponieważ będzie on odbierał sygnały, które "wygeneruje" przycisk (stan bliski VCC (+5V), czyli logiczna jedynka (1) lub stany bliskie GND, czyli logiczne zero (0)). Musimy też pamiętać, że aby korzystać z przerwań musimy włączyć globalne przerwania --> sei();

    //--- Główna funkcja programu ---
    int main(void) {
    DDRD &= ~Przycisk_PIN;		// Wejcie - Przycisk
    PORTD |= Przycisk_PIN;		// Pull-Up wewnętrzny (rezystor podciągający do VCC, dlatego nie trzeba stosować fizycznego rezystora podciągającego)
    
    sei();						// Włączenie globalnych przerwań
    }
    

     

    Przejdźmy teraz do obsługi przerwania INT0 na pinie PD2:

    //--- Obsługa przerwania z INT0 ---
    ISR(INT0_vect) {
    
    GICR &= ~(1<<INT0);	// Wyłączamy obsługę przerwania na PD2 - drgania styków spowodowałyby wielokrotne jego wywołanie
    
    jazda ^= 1;			// Zmieniamy stan flagi
    
    GICR |= (1<<INT0);	// Włączamy z powrotem obsługę przerwania
    }
    

     

    Jeszcze napiszemy uproszczony kod źródłowy do obsługi tego przerwania:

    // --- Pętla nieskończona programu ---
    while(1) {
    
    		if(jazda) {     	// Sprawdzamy czy "jazda" jest 1-ką lub 0-em
    		_delay_ms(50);		// Eliminacja drgania styków
    		if(jazda) {
    			LED1_ON;     	// Dioda LED świeci
    		}else{
    			LED1_OFF;     	// Dioda LED nie świeci
    		}
    		}
    }
    

     

    Drgań styków możemy się jeszcze pozbyć sprzętowo, przez realizację podłączenia przycisku do mikrokontrolera. Mianowicie przez użycie odpowiednich rezystorów jak i kondensatorów - na Forum było to omawiane wiele razy (a nawet w #3 odsłonie tego konkursu).

     

    Mam nadzieję, że ta prosta funkcja do obsługi przycisku w przerwaniu jako przycisk ON/OFF pozwoli wielu początkującym okiełznanie swojego robota 🙂

     

    Pozdrawiam, Adam (aixI).


  3. Nie, to nie błąd w programie, tylko możliwe jest to, że masz gdzieś zimny lut. Posprawdzaj połączenia i luty między płytką z czujnikami, a płytką z uC.

    Możesz też zmierzyć napięcia na tym "wadliwym" czujniku. Podepnij się sondą pomiarową do wyjścia czujnika (kolektor), a drugą sondę podłącz do masy układu (GND). Następnie przesuwaj tym czujnikiem nad białą i czarną powierzchnią - wyniki zapisz i pochwal się nimi. (Pamiętaj aby zasilać układ w czasie pomiarów, silniki mogą być odłączone).


  4. Przeczytaj proszę ten wątek. Jak to nie pomoże, to obejrzyj sobie

    film, albo może
    tych filmów.

    Mam nadzieje, że to pomoże. Po co dublować podobne tematy - tam jest wszystko ładnie powiedziane i opisane.

    PS. Nie polecam wgrywać programów przez Bascom AVR, bo przy moich próbach kończyło się to niepowodzeniem i musiałem używać zewnętrznych programów typu Khazama Programmer lub MkAVRCalc...

    Pozdrawiam.


  5. U mnie jak korzystałem z Bascom AVR, to nie mogłem bezpośrednio wrzucić programu na uC - musiałem zewnętrznym programem, np. Khazama Programmer, lub MkAVRCalculator, oba bezpłatne i łatwe w obsłudze. Wystarczy wybrać ścieżkę do pliku .hex (czyli naszego skompilowanego programu) i wgrać.

    W przypadku MkAVRCalculator należy "zakropkować" funkcję "ZAPIS"wybrać "FLASH" i wybrać plik .hex i kliknąć "WYKONAJ".

    Mam nadzieję, że pomogłem 🙂


  6. 4 paluszki AA 1,5V dają tylko 6V (bez obciążenia), więc możesz dać znacznie więcej tych "paluszków" i złączyć szeregowo, np. w pojemniku na 6szt. baterii AA daje Ci 9V, może będzie lepiej.

    Ale lepiej zainwestować w jakiś mały akumulatorek Li-Pol 7,4V i tanią ładowarkę z balancerem i wtedy nie powinno być problemów 🙂 Pomyśl o tym - to tylko jednorazowy wydatek.

    Co do filtracji zasilania, to możesz dać parę kondensatorów, ceramiczny 100nF i jakiś elektrolit 100uF do linii zasilania i jeszcze równolegle do silnika (czy przy mostku H - jak Ci wygodniej) ceramik 100nF.

    Mówisz, że umiesz C ale nie chcesz sam napisać programu, bo liczysz, że ktoś go już "przepisał" na C. Po co jeżeli umiesz C? Trochę mnie to zastanawia.


  7. Witaj na Forum 🙂

    Napisz nam czym zasilasz robota. To podstawa.

    Możesz zawsze jeszcze odfiltrować napięcie dla mikrokontrolera jak i mostka H, aby nie występowały niespodziewane resety tegoż mikrokontrolera.

    Na obecną chwilę napisz nam te rzeczy, a co do programu robota, to najpierw niech Ci się uda uruchomić go na domyślnym programie napisanym w Bascom'ie. Później podczas nauki na działającym robicie spróbuj napisać sam bliźniaczy kod w C 🙂 (Jest wiele poradników w Internecie na temat AVR i języka C).

    Powodzenia!


  8. Moją propozycją jest układ czujnika odbiciowego (do robota typu Line Follower) KTIR0711S z komparatorem LM339. Widziałem, że na Forum było trochę opisywanych problemów z tym układem, dlatego nakłoniło mnie to do przetestowania układu i zrealizowania pomocnego artykułu na tymże układzie 🙂

    Taki układ należy wykonać w konfiguracji jak na schemacie, aby działał poprawnie, ponieważ jak byśmy podłączyli wyjście czujnika (kolektor) do wejścia nieodwracającego (+) (z angielskiego "non-inverting input"), do wejścia odwracającego (-) (z angielskiego "inverting input") podłączyli środkową nużkę potencjometru 10k i zasilanie +5V i GND (masę układu) do komparatora, to taka konfiguracja nie daje 100'u%'owego działania takiego układu. Dlatego proponuje stosować taki układ - zaczerpnięty z DataSheet'u LM339.

     

    Potencjometrem ustalamy próg "reagowania" czujnika na czarną linie, która jest na białym tle.

    Etykieta "OUT" jest wyjściem naszego układu z jednym czujnikiem, wyjście to możemy bez problemu podłączyć do pinu I/O mikrokontrolera i bez problemu możemy takie stany (bliskie 5V i bliskie GND), czyli zero / jedynkowe odczytywać. Oczywiście są to stany cyfrowe.

     

    Jeżeli chcielibyśmy zastosować więcej czujników w naszym robocie należy powielić schemat z uwzględnieniem tego, że układ LM339 ma 4 komparatory w jednej obudowie i inne komparatory są podpisane innymi numerami pinów. W tym celu należy zajrzeć do danych katalogowych komparatora LM339.

     

    Dodaję też schemat wyciągnięty z DetaSheet'u układu LM339, gdzie zastosowano LM339 jako nieodwracający komparator z histerezą (z angielskiego "Noninverting Comparator with Hysteresis"). Na schemacie z DS'a, jako napięcie odniesienia, zastosowano dzielnik napięcia składający się z rezystorów Rref i R1. W naszym przypadku takie rozwiązanie zamieniliśmy na potencjometr o wartości 10k, aby móc swobodnie regulować nasz próg reagowania czujnika na linię 🙂

    Etykieta Vin z DS'a to wejście - w naszym przypadku, czujnik. Vo - napięcie wyjściowe - u nas etykieta "OUT".

     

     

    Dodaję ulepszoną wersję konfiguracji czujnika odbiciowego z komparatorem LM339, która znajduje się na schemacie o nazwie "Schemat:". Zmiany polegają na tym, że w nowej wersji czujnik będzie działał w całym zakresie oświetlenia przenoszonego przez fototranzystor aż do wejścia w jego nasycenie. W poprzedniej wersji wycięty był cały zakres dość "ciemnej" pracy (od 5V do 3,5V). Teraz można spokojnie ustawić próg na 50 czy 200mV (licząc od zera czyli od kompletnej ciemności) i komparator będzie pracować prawidłowo.

     

    Wadą takiego rozwiązania jest to, że aby zmienić ogólną czułość (czyli zakres "pełnej skali") trzeba zmieniać oba oporniki w emiterze zachowując ich stosunek. Z drugiej strony można je dobrać dla danego typu fototranzystora tak, by liniowo (czyli bez nasycania tranzystora) "obsługiwały" sensownie dużą jasność (np. dioda IR odbita od bardzo białej powierzchni z odległości 5mm) i wtedy kłopot z głowy.

     

    Rezystory R9 = 10k i R8 = 4k3 są dobrą konfiguracją na start, jednak Ci którzy będą chcieli zwiększyć czułość - gdyby okazało się, że ich diody IR w czujnikach świecą naprawdę słabo lub w jakiejś w ogóle innej aplikacji - zawsze mogą zwiększyć wartości tych rezystorów w tym samym stosunku.

     

    Dodane zostały też:

    * kondensator C1 o wartości 100nF do filtrowania napięcia dla komparatora,

    * kondensator C2 o wartości 1uF do źródła odniesienia,

    * rezystor R7 o wartości 4k3 wpięty w szereg między potencjometrem, a linią zasilania VCC +5V, aby nie można było wyjechać poza 3.5V.

    i została zmieniona konfiguracja czujnika odbiciowego, co opisałem wyżej.

     

     

    Pragnę zaznaczyć tutaj, że w poprzednim schemacie komparator dostawał do swojego wejścia napięcie, które przewyższało jego nominalną wartość napięcia wejściowego (kiedy czujnik był na czarnym tle), więc aby tego uniknąć powstała nowa wersja czujnika z układem LM339.

     

    Myślę, że pomoże to wielu początkującym w realizowaniu swoich robotów, jak i prostych układów niekoniecznie związanymi z robotami 🙂

    Schemat:

    Wyprowadzenia pinów układu LM339:

    Nieodwracający komparator z histerezą:

    Pozdrawiam, Adam (aixI).

    LM339_forbot.sch


  9. Powiem szczerze, że fajny robocik Ci wyszedł - gratulacje!

    Jak na płytę PCB wykonaną termotransferem i to jeszcze dwustronną i w pełni działającą - też gratulacje!

    Czy akumulator nie wydaje Ci się zbyt duży do małego LF'a? - przez to waży więcej.

    Czemu nie zastosowałeś oryginalnych mocowań Pololu? Czy to miało znaczenie, że wcześniej Ci pękały?

    Czy linia po której porusza się robot, to taśma izolacyjna 19mm, czy 15mm?

    W moim odczuciu przydałoby się więcej zdjęć robota, m.in. płyty głównej od góry i jeżeli schemat i program nie jest ściśle chroniony 😋, to też mógłbyś wrzucić.


  10. Ja to robię tak:

    Wybieram narzędzie do robienia dziurek "Via", wybieram okrągłą przelotkę, ustawiam odpowiednią wielkość, tj. średnica i drill, potem ustawiam tą przelotkę w odpowiednim miejscu na PCB i po tej czynności wybieram narzędzie "Name" i nazywam przelotkę "GND" i łącze z szyną masy - gotowe 🙂

    Mam nadzieję, że pomogłem 🙂

    • Lubię! 1

  11. Marku, zrobiłem mały test z tymi połączeniami w Eaglu w wersji 6.5.0 i mam następujące wnioski:

    * Mam szynę masy (GND), przy pewnym elemencie i etykietę o nazwie "GND" na innym - są one połączone razem.

    * Jak mam etykietę o nazwie "VCC" i szynę +5V na innym, to te elementy nie są ze sobą połączone. Ale jak zmienię nazwę etykiety z "VCC" na "+5V", to te elementy są ze sobą połączone.

    Tak więc, kolega od MM może tylko zmienić nazwę etykiety z "VCC" na "+5V" i będzie elegancko.

    Myślę, że rozwiałem wątpliwości 🙂


  12. Witamy na Forum 🙂

    Fajnie, że zabierasz się zza budowę pierwszego robota jako LF - są one dosyć fajne ; )

    Do pierwszej swojej konstrukcji możesz dodać sporo rzeczy, na których będziesz uczył się programowania, bo lepiej zrobić robota na uC niż bez niego 🙂 Jako wyświetlacz możesz użyć jakiś alfanumeryczny 16x2 (będzie w sam raz), czujniki - najlepiej 7 lub 8 (nie opłaca się mieć dwóch czujników jak robić lf'a na uC), silniki (pisałeś coś, że z napędu CD), ogólnie ja ich bym nie polecał, lepiej kupić jakieś podróbki Pololu 🙂 Zawsze też możesz dodać jakieś bajery typu podświetlenie spodu robota(?) Poszukaj tutaj na Forum w zakładce ROBOTY - Line Followery i tam możesz znaleźć coś ciekawego. Polecam też ten artykuł:

    https://forbot.pl/blog/artykuly/podstawy/algorytm-linefollowera-c-poczatkujacych-id2722

    Powodzenia przy budowie 🙂


  13. klonyyy i Hudyvolt dzięki za informacje, zawsze się przydadzą.

    klonyyy, wyszło Cię to dosyć tanio. Osobiście od razu nie drukowałbym nie wiadomo czego, najpierw jakieś projekty itp. Przy okazji czekam na opis Twojej drukarki, ciekaw jestem wyglądu i ewentualnie filmiku z pracy i oczywiście jakości wydruków.

    A wie ktoś z Was, gdzie mogę, np. pobrać pdf'y do drukarki Mendel90, aby sobie móc wyciąć w płycie MDF, czy ze sklejki? Jakby ktoś miał nawet te pdf'y prosiłbym o udostępnienie. Sam znalazłem tylko plik y_heatshield.pdf.


  14. Przeczytałem podlinkowaną stronę, gdzie wyczytałem, że jak już mamy plik .stl (czyli jakiś projekt 3D), wrzucamy go do odpowiedniego programu, np. Kisslicer i generujemy G-code, który wędruje do drukarki.

    Ale załóżmy, że mam kupione Arduino Mega2560+inne niezbędne rzeczy (i jest niezaprogramowane), to skąd pobrać odpowiedni wsad, który umożliwiłby drukarce odczyt G-code'ów i zamieniłby te dane na odpowiednie sterowanie silnikami i extruderem? (To są pytania jakbym chciał składać drukarkę sam, tzn. kupić co trzeba i złożyć - tak jak pisałem w pierwszym poście).


  15. Tu możesz o tym przeczytać, choć ja robię to trochę inaczej.

    Ewentualnie tutaj.

    Edit: Ale z tego co widzę na filmikach, to musisz dodać takie coś, że jeżeli ostatnio linia widziana po lewej stornie robota i robot przestrzeli zakręt, to musi skręcać w lewo (jak nie ma linii pod czujnikami i zakręt widziany ostatnio po lewej) i analogicznie dla prawej strony. Jak ostatnio widziana po prawej i przestrzeli, to musi skręcać w prawo, dopóki dopóty nie znajdzie się środkowymi czujnikami na linii. Ten zabieg powinien dosyć dobrze pomóc, ponieważ teraz robot jak przestrzeli (nie ma pod sobą linii), to jedzie sobie prosto. Spróbuj wyobrazić sobie to co napisałem wyżej i przeanalizuj. Powodzenia!

×
×
  • Utwórz nowe...