flex Grudzień 5, 2011 Udostępnij Grudzień 5, 2011 Dzięki za odpowiedź. [ Dodano: 06-12-2011, 16:41 ] Mógłbym prosić jeszcze o spis kondensatorów? Link do komentarza Share on other sites More sharing options...
Nawyk Grudzień 6, 2011 Autor tematu Udostępnij Grudzień 6, 2011 A nie możesz ich sobie wypisać ze schematu? 100nF jak najbliżej pinów zasilania uC + na zaciskach silnika, 100u i 470u (przykładowo) jeśli chcesz zastosować stabilizator 1 Link do komentarza Share on other sites More sharing options...
shapi Styczeń 1, 2012 Udostępnij Styczeń 1, 2012 w jaki sposób w C odczytywać stan czujników linii, w momencie gdy mam je podłączone tak jak na schemacie (podpiete pod PC3, PC4, PC5)? Na forum widzialem ze ktos probowal to realizować w taki sposób: // wykrywanie linii w czujniku 1 if(!(PINC & 0x01)) PORTD = 0x01; czy to jest poprawny sposób? jak sprawdzić zmiane stanu czujników w moim przypadku? Link do komentarza Share on other sites More sharing options...
MirekCz Styczeń 1, 2012 Udostępnij Styczeń 1, 2012 w jaki sposób w C odczytywać stan czujników linii, w momencie gdy mam je podłączone tak jak na schemacie (podpiete pod PC3, PC4, PC5)? Na forum widzialem ze ktos probowal to realizować w taki sposób: // wykrywanie linii w czujniku 1 if(!(PINC & 0x01)) PORTD = 0x01; czy to jest poprawny sposób? jak sprawdzić zmiane stanu czujników w moim przypadku? Jest to poprawny sposób, zakładając, że czujnik jest w tym przypadku na linii PC0. 0x01 to zapis szaesnastkowy i oznacza bitowy tyle co 0000001 (czyli najniższy z bitów). Znak & to operacja AND. Całość (PINC & 0x01) zwraca liczbę 0x01 jak najmłodszy bit na porcie C jest jeden lub 0 jak nie jest. Używamy PINC zamiast PORTC, bo PINC jest do czytania wejść, a PORTC do zapisywania stanu wyjść. Żeby sprawdzać kolejne bity wystarczy odpowiednio zmienić wartość 0x01 na 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 co odpowiada zapisowi bitowemu 0000001, 0000010, ..., 10000000 - jak nie wierzysz to włącz kalkulator windows w widok programisty i tam możesz przeliczać między trybem binarnym, dziesiętnym a szesnastkowym (BIN, DEC, HEX). czyli dla Ciebie odczytanie PC3 to if (PINC & 0x08) , PC4 to if (PINC & 0x10) i PC5 to if (PINC & 0x20)... Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Grabki Styczeń 1, 2012 Udostępnij Styczeń 1, 2012 Najczytelniej będzie dodać na początku programu: #define cz1 (1<<PC2) #define cz2 (1<<PC3) #define cz3 (1<<PC4) a później można sprawdzać w taki łatwy sposób stan czujników: if(PINC & cz1) { instrukcje... ; } if(PINC & cz2) { instrukcje... ; } if(PINC & cz3) instrukcje... ; Link do komentarza Share on other sites More sharing options...
atmega8 Luty 1, 2012 Udostępnij Luty 1, 2012 Witam. Czy ktoś mógłby mi powiedzieć jak przerobić kod żeby silniki nie były sterowane z pwm? Ogólnie to mam własną pcb ale tam mostek h nie jest podłączony do pinów pwm. Jest podłączony do normalnych portów I/O. Bardzo bym prosił żeby ktoś mi powiedział jak to przerobić🙂 Pozdrawiam:) Link do komentarza Share on other sites More sharing options...
Bobby Luty 1, 2012 Udostępnij Luty 1, 2012 Po prostu na wyjściach, do których masz podpięte enable mostka musisz wystawić logiczne 1 (czyli najpierw ustawiasz odpowiedni pin jako wyjście a potem ustawiasz mu 1). Link do komentarza Share on other sites More sharing options...
atmega8 Luty 2, 2012 Udostępnij Luty 2, 2012 Ale wtedy silnik cały czas będzie dostawał 5V? Jakim cudem będzie wiedził że trzeba np zwolnić bo jest zakręt? Pozdrawiam:) Link do komentarza Share on other sites More sharing options...
klonyyy Luty 2, 2012 Udostępnij Luty 2, 2012 Będzie dostawał 5v gdy napiszesz to w programie... A zakręty będzie wykonywał bo ten Twój linefollower ma chyba czujniki no nie?w programie napiszesz jeśli czujnik widzi czarną linie to silnik np lewy =0 oczywiście pisałem dla przykładu (nie przypisuj tego do programu 😉 ) Link do komentarza Share on other sites More sharing options...
kolplok Luty 10, 2012 Udostępnij Luty 10, 2012 Nawyk, Otworzyłem twój projekt z http://hobbyrobotyka.pl/2009/09/przepis-na-robota-w-pelni-programowalny-line-follower/ zastosowałem tylko inne serwa. A dokładniej mówiąc HXT900 zostały przerobione według https://www.forbot.pl/forum/topics20/jak-przerobic-serwomechanizmy-vt3902.htm wedłuk II.1 jak podłączę 4x 1.5 aklumatorki 2500 mAh. Silniczki zaczynają skokowo pracować oraz dioda miga. Jaka może być przyczyna tego? Link do komentarza Share on other sites More sharing options...
Robomaniak Luty 10, 2012 Udostępnij Luty 10, 2012 Brak kondensatorów na zasilaniu Link do komentarza Share on other sites More sharing options...
press2313 Luty 21, 2012 Udostępnij Luty 21, 2012 Witam Piszę tutaj bo nie chcę zakładać nowego wątku. Zamiast czujników wyżej zastosowałem diodę IR i fototranzystor. Na schemacie jest fototranzystor podciągnięty przez 10k do Vcc. Po dodaniu tego rezystora czujniki cały czas "widzą" stan logiczny 1, nie zależnie od tego czy dioda IR jest włączona czy nie, czy jest białe tło czy czarne. Jeśli odłączę rezystor i poświecę w nie diodą IR, czujniki działają poprawnie. Czy potencjometr z zakresu ok. 10k - 100k podciągnięty do Vcc załatwi sprawę? Link do komentarza Share on other sites More sharing options...
Stunter Kwiecień 23, 2012 Udostępnij Kwiecień 23, 2012 Cześć! Piszę tutaj ponieważ mam problem z tym projektem. Złożyłem LineFollowera z tego tematu krok po kroku, a że procek się resetował (migała dioda) i silniki działały skokowo to dorzuciłem kondensatory na zaciski silników (100nF ceramiczne). Na wgranym programie testowym od Nawyka (po dodaniu kondensatorów) działały skrajne czujniki (o dziwo środkowy nie) i robot jeździł szybko. Zmieniłem więc wszędzie prędkość z 255 na 100, a w elsie gdy traci linię dałem zera. Taki program testowałem z różnymi granicami (od 50 do nawet 1000) i zawsze robot ciągle kręcił oby dwoma silnikami z taką samą prędkością i nie reagował jak go przesuwałem tuż nad linią. Dodam również, że kolega Stonka pomógł mi z przemierzeniem czujników, mostka i procka. Połączenia są dobre, wartości z czujników też się różnią wraz z przesuwaniem robota innym czujnikiem nad linię. Kod programu wgranego obecnie: $regfile = "m8def.dat" $crystal = 1000000 'Konfiguracja przetwornika analog-cyfra (ADC) Config Adc = Single , Prescaler = Auto 'Konfiguracja sterowania sprzętowym PWM Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'Konfiguracja portów Config Portd = Output Config Portb = Output 'Opis portów 'Enable1 - Silnik lewy - Portb.1 (PWM1A) 'Enable2 - Silnik prawy - portb.2 (PWM1B) 'Input1 - Silnik lewy A - Portd.3 'Input2 - Silnik lewy B - Portd.2 'Input4 - Silnik prawy A - Portd.0 'Input3 - Silnik prawy B - Portd.1 'Dioda - Portd.6 'Czujnik lewy - ADC5 'Czujnik środkowy - ADC4 'Czujnik prawy - ADC3 Silnik_lewy_a Alias Portd.3 Silnik_lewy_b Alias Portd.2 Silnik_prawy_b Alias Portd.0 Silnik_prawy_a Alias Portd.1 Dioda Alias Portd.6 'Granica reagowania na linię - należy dobrać doświadczalnie Const Granica = 500 'Deklaracje zmiennych Dim Czujnik_lewy As Single Dim Czujnik_srodkowy As Single Dim Czujnik_prawy As Single Dim W As Word 'Blok instrukcji Set Dioda Set Silnik_lewy_a Reset Silnik_lewy_b Set Silnik_prawy_a Reset Silnik_prawy_b Do Gosub Wczytaj_stany_przetwornikow If Czujnik_srodkowy > Granica Then 'Silnik lewy - maksymalna prędkość Pwm1a = 100 'Silnik prawy - maksymalna prędkość Pwm1b = 100 Elseif Czujnik_lewy > Granica Then Pwm1a = 0 Pwm1b = 100 Elseif Czujnik_prawy > Granica Then Pwm1a = 100 Pwm1b = 0 Else Pwm1a = 0 Pwm1b = 0 End If Loop End Wczytaj_stany_przetwornikow: Start Adc W = Getadc(5) W = Getadc(5) Stop Adc Czujnik_lewy = W Start Adc W = Getadc(4) W = Getadc(4) Stop Adc Czujnik_srodkowy = W Start Adc W = Getadc(3) W = Getadc(3) Stop Adc Czujnik_prawy = W Return Screen z BASCOMa po wgraniu programu: Zdjęcie robota: Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 23, 2012 Udostępnij Kwiecień 23, 2012 Wgraj oryginalny kod, zamieniając wartości PWM 0 na 255 i odwrotnie. Powinno zadziałać - jeśli tak tzn., że PWM uruchomił Ci się w trybie Inverted PWM. Link do komentarza Share on other sites More sharing options...
Stunter Kwiecień 23, 2012 Udostępnij Kwiecień 23, 2012 Wgraj oryginalny kod, zamieniając wartości PWM 0 na 255 i odwrotnie. Powinno zadziałać - jeśli tak tzn., że PWM uruchomił Ci się w trybie Inverted PWM. Wgrałem kod po zmianach tak jak powiedziałeś: $regfile = "m8def.dat" $crystal = 1000000 'Konfiguracja przetwornika analog-cyfra (ADC) Config Adc = Single , Prescaler = Auto 'Konfiguracja sterowania sprzętowym PWM Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'Konfiguracja portów Config Portd = Output Config Portb = Output 'Opis portów 'Enable1 - Silnik lewy - Portb.1 (PWM1A) 'Enable2 - Silnik prawy - portb.2 (PWM1B) 'Input1 - Silnik lewy A - Portd.3 'Input2 - Silnik lewy B - Portd.2 'Input4 - Silnik prawy A - Portd.0 'Input3 - Silnik prawy B - Portd.1 'Dioda - Portd.6 'Czujnik lewy - ADC5 'Czujnik środkowy - ADC4 'Czujnik prawy - ADC3 Silnik_lewy_a Alias Portd.3 Silnik_lewy_b Alias Portd.2 Silnik_prawy_b Alias Portd.0 Silnik_prawy_a Alias Portd.1 Dioda Alias Portd.6 'Granica reagowania na linię - należy dobrać doświadczalnie Const Granica = 500 'Deklaracje zmiennych Dim Czujnik_lewy As Single Dim Czujnik_srodkowy As Single Dim Czujnik_prawy As Single Dim W As Word 'Blok instrukcji Set Dioda Set Silnik_lewy_a Reset Silnik_lewy_b Set Silnik_prawy_a Reset Silnik_prawy_b Do Gosub Wczytaj_stany_przetwornikow If Czujnik_srodkowy > Granica Then 'Silnik lewy - maksymalna prędkość Pwm1a = 0 'Silnik prawy - maksymalna prędkość Pwm1b = 0 Elseif Czujnik_lewy > Granica Then Pwm1a = 255 Pwm1b = 0 Elseif Czujnik_prawy > Granica Then Pwm1a = 0 Pwm1b = 255 Else Pwm1a = 0 Pwm1b = 0 End If Loop End Wczytaj_stany_przetwornikow: Start Adc W = Getadc(5) W = Getadc(5) Stop Adc Czujnik_lewy = W Start Adc W = Getadc(4) W = Getadc(4) Stop Adc Czujnik_srodkowy = W Start Adc W = Getadc(3) W = Getadc(3) Stop Adc Czujnik_prawy = W Return Nadal silniki kręcą się z tymi samymi prędkościami do przodu i brak zmian podczas przesuwania czujników po linii. Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »