Skocz do zawartości

[Dla początkujących] Przepis na robota - w pełni programowalny Line Follower


Nawyk

Pomocna odpowiedź

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

  • Lubię! 1
Link do komentarza
Share on other sites

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

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

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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

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

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

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

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

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

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

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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.