Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

Jakie czujniki do linefollowera? Pomoc w wyborze

Autor Wiadomość
kamdz 



Posty: 39
Wysłany: 14-09-2017, 18:19   

Próbowałem zmieniać prędkość 1200 też nie działa...
mam parity none
8 data bits
1 stop bit
hardware flow control none

Popularny artykuł » Kurs budowy robotów - #4 - pierwsze programowanie


Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4102
Pomógł: 442 razy
Otrzymał 585 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 14-09-2017, 18:46   

A z innymi prędkościami próbowałeś? W szerokim zakresie? Jak zweryfikowałeś F_CPU? To jeszcze proponuję zmienić fusebity z powrotem na wewnętrzny generator np. 1MHz i jeszcze raz skompilować program pod nowe F_CPU. Tę częstotliwość przynajmniej gwarantuje producent. Nie jest to może jakiś superwzorzec, ale UART zwykle z tym kłopotów nie ma.

Być może problem jest w obliczeniach wartości UBRR?
Spróbuj zrobić tak:
Kod programu: Zaznacz cały
#define USART_BAUD 9600UL
#define USART_UBBR_VALUE ((8000000UL/(USART_BAUD<<4))-1)
i napisz jak poszło.

Postaw piwo autorowi tego posta
 
 
kamdz 



Posty: 39
Wysłany: 14-09-2017, 18:51   

Działa poprawnie :) Brawo Ty ;) W stosunku do poprzedniego kodu to tylko dodane zostało to UL przy prędkości uarta i taktowania tak? na czym to polega? no bo chciałbym też zrozumieć co robiłem źle...

[ Dodano: 14-09-2017, 19:11 ]
Aha, tylko gdy próbuję odebrać coś to mi wyskakuje błąd w kompilatorze: ../uart.c:35:5: error: assignment to expression with array type
Nie wiem, czy błąd jest jakiś prosty z niedożywienia ;) czy kolejna rozprawa na 1,5 strony :D
Kod programu: Zaznacz cały


#include <avr/io.h>
#include <util/delay.h>

//void setAngle(int angle);
//void InitServ(void);

#include <inttypes.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdint.h>
    #define USART_BAUD 9600UL
    #define USART_UBBR_VALUE ((8000000UL/(USART_BAUD<<4))-1)

/*UART*/
void USART_Init(unsigned int ubrr) ;
void USART_Transmit( unsigned char data ) ;
unsigned char USART_Receive( void ) ;
void USART_TransmitString (unsigned char *str) ;


int main(void)
{
      unsigned char d[] = {"xyz"};
  unsigned char odb[1];
    USART_Init(USART_UBBR_VALUE);
    //InitServ();
    //int i;
    while(1) {

        USART_TransmitString(d);
_delay_ms(1000);
       
odb = USART_Receive();
    }

}




void USART_Init (unsigned int ubrr)
{
UBRRH = (unsigned char)((USART_UBBR_VALUE>>8) | _BV(URSEL));
    // Set baud rate
        UBRRH = (unsigned char)(USART_UBBR_VALUE>>8);
        UBRRL = (unsigned char)USART_UBBR_VALUE;

    // Enable receiver and transmitter
        UCSRB = (1<<RXEN)|(1<<TXEN);

    // Set frame format to 8 data bits, no parity, 1 stop bit
        UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);


}

void USART_Transmit( unsigned char data )
{

    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) ) ;
    /* Put data into buffer, sends the data */
    UDR = data;
}

void USART_TransmitString (unsigned char *str)
{
    int i = 0;
    for (i=0; str[i]!='\0'; i++) {
        USART_Transmit(str[i]);
        //_delay_ms(50);
    }
}


unsigned char USART_Receive(void)
{
// Wait until a byte has been received

    while((UCSRA&(1<<RXC)) == 0);

// Return received data

    return UDR;

}

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4102
Pomógł: 442 razy
Otrzymał 585 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 14-09-2017, 22:51   

O, fajnie.

Wyrażenia, które wypisujesz w #define są tylko tekstami. Preprocesor czyli taki wstępny analizator szuka swoich dyrektyw (właśnie tych z # na początku), dokonuje odpowiednich podmian tekstu i wynik przesyła do kompilatora, ale niczego sam nie liczy. Dopiero "właściwy" kompilator to robi. Jego arytmetyka (ta używana w trakcie procesu kompilacji programu) jest w GCC taka, jaką założono domyślnie dla docelowego procesora. Maluchy AVR dostały w prezencie arytmetykę 16-bitową - takie są tutaj domyślnie int-y. No i ani 8000000 się w tym nie mieści, ani (9600<<4) też nie. Wynik obliczeń był jakiś przypadkowy i tyle się wpisywało do UBRR. Jakaś prędkość transmisji była bo przecież program działał, ale tylko oscyloskop mógłby powiedzieć jaka. Dodanie na końcu liczby litery 'L' oznacza wymuszenie zwiększenia długości do long int, (czyli tutaj 32 bitów) i to już wystarcza. 'U' z kolei oznacza unsigned, czyli bez znaku.

Funkcja USART_Receive() jest typu unsigned char i taki wynik zwraca. Oznacza to, że to co odda możesz wpisać tylko do czegoś takiego. Ty zrobiłeś tablicę takich "bezznakowych char-ów" a to już jest inny typ. Musisz albo zmienić deklarację na:
unsigned char odb;
i wtedy
odb = USART_Receive();
zadziała, albo zadeklarować tablicę jakiejś sensowniejszej długości, np:
unsigned char odb[10];
i wpisywać odebrany znak do jej konkretnego elementu:
odb[0] = USART_Receive();

Myślę, że zabrałeś się za dwie niełatwe rzeczy na raz. Walczysz ze sprzętem - a wręcz wnętrzem procesora i jednocześnie z językiem. Chyba nie rozumiesz do końca co robisz a praca "na czuja", metodą prób i błędów to moim zdaniem strata czasu. Wiem, że oba tematy są pilne i fajne i że aby zbudować samodzielnie robota musisz być biegły w obu, ale przyhamuj trochę. Przejdź kurs C lub przeczytaj dobrą książkę. Osobno poczytaj o procesorze - o jego peryferiach i samej architekturze. To zaprocentuje. Na kursie będziesz prowadzony za rączkę - to dobrze, każdy musi kiedyś nauczyć się chodzić, żeby później biegać. Wykonaj ćwiczenia z kursu a czytając książkę analizuj ze zrozumieniem pokazane tam programy tak, byś rozumiał każdą ich linijkę. Zacznij od bardzo prostych rzeczy, od typów danych, od podstawowych instrukcji, od poczytania o stylach kodowania, formatowania, czytelności itp. Z kolei mając przegląd tego co procesor ma w środku zupełnie inaczej spojrzysz na system, który projektujesz. Dużo łatwiej będzie Ci ogarnąć zadania jakie będzie on wykonywał i przydzielić je poszczególnym zasobom sprzętowym. Poświęć na to powiedzmy miesiąc a sam zobaczysz z jakim zażenowaniem będziesz patrzył na te swoje dzisiejsze próby rozbudowywania niezrozumiałego kodu. Jeśli chcesz walczyć z robotami, uzbrój się w wiedzę. Powodzenia :)

Polecany artykuł » Druk 3D w olbrzymiej skali!


Postaw piwo autorowi tego posta
 
 
kamdz 



Posty: 39
Wysłany: 15-09-2017, 06:29   

Dzięki. A jaki bezpłatny kurs C mógłbyś mi polecić?

Postaw piwo autorowi tego posta
 
 
kamdz 



Posty: 39
Wysłany: 22-09-2017, 16:18   

marek1707 napisał/a:
Tak, to jest to o czym myślałem.

Wstawiając potencjometr zamiast opornika podciągającego do Vcc możesz łatwo zmieniać czułość wszystkich czujników na raz, bo na tym oporniku odkłada się napięcie z prądów kolejnych tranzystorów. Jeśli nie wierzysz potencjometrom (bo drgania, starzeją się, szumią itp) możesz tam dać kilka rezystorów załączanych zworkami. Jeśli dasz np. 5k1, 5k1, 10k i 20k szeregowo i tym trzem ostatnim równolegle zworkę, to będziesz miał możliwość regulacji od 5k do 40k z krokiem ok. 5k.

Regulacja jest po to, byś mógł trafić z zakresem sygnałów wyjściowych dla danego oświetlenia/podłoża w zakres działania ADC. Przy zbyt słabej czułości (w danych warunkach) możesz np. dostawać odczyty od 950 do 1023 i to w sumie będzie działać bardzo marnie. Z drugiej strony, gdy przesadzisz z wartością opornika, będziesz czytał z ADC np. 0 do 120 i to też nie wróży dobrze. Jeśli natomiast ustawisz się czułością na środku (tzn. napięcie kolektora na granicy taśmy i podłogi będzie mniej więcej Vcc/2) to sygnał z kolektora będzie miał "najwięcej miejsca" do pracy, nie będzie obijał się ani o Vcc ani o GND i dostaniesz np. zakres 200-800, który dużo łatwiej odróżnić od przypadkowych zakłóceń, choćby tych z lamp na suficie.

Zjadłeś kanapkę na przerwie? Dobre odżywianie to podstawa :)

Heja, zabrałem się za produkcję płytki czujników i mam jescze jedno pytanie... Rozumiem, że potencjometr mam dać na gnd diody tak?

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4102
Pomógł: 442 razy
Otrzymał 585 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 22-09-2017, 18:59   

Nie wiem o który Ci chodzi. Zanim narysujesz pierwszą ścieżkę na płytce, pokaż schemat. Inaczej szkoda pracy - schemat zmienia się najłatwiej a im więcej się narobisz tym więcej czasu stracisz.

Postaw piwo autorowi tego posta
 
 
kamdz 



Posty: 39
Wysłany: 22-09-2017, 19:12   

Schemat ten co wczesniej z jednym dopiskiem. Ale robie na uniwersalnej, wiec spoko, nic nie stracę :) daje tez fotki dzisiejszej pracy, wiem że luty nie najlepsze, ale wydawalo mi się, że coś mi sie pomieszalo, zacząłem wylutowywac i zorientowalem sie, że jest ok. Ale ważne, że jest połączenie ;)


20170922_190449.jpg
Plik ściągnięto 3 raz(y) 2.28 MB

20170922_190543.jpg
Plik ściągnięto 6 raz(y) 2.85 MB

20170922_190527.jpg
Plik ściągnięto 4 raz(y) 2.53 MB

20170922_190513.jpg
Plik ściągnięto 2 raz(y) 2.56 MB

20170922_190509.jpg
Plik ściągnięto 2 raz(y) 2.45 MB

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4102
Pomógł: 442 razy
Otrzymał 585 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 22-09-2017, 19:35   

Możesz tam dać potencjometr, ale jest on dużo mniej ważny niż ten w kolektorach tranzystorów. Tu przy diodach możesz wstawić np. 500Ω lub 1k szeregowo z opornikiem 100Ω żeby nie zewrzeć na krótko, ale ten prąd raczej możesz zafiksować na stałe. Koniecznie za to daj pot zamiast tego opornika od wejścia ADC do Vcc.
Zawsze miej aktualny schemat tego co robisz, z numerkami pinów. A najlepiej, gdybyś sobie narysował ideowy, wszystko policzył i ustalił a dopiero potem montażowy, gdzie scalaki wyglądają "jak żywe", mają tak samo wyprowadzone nóżki jak naprawdę i do tego druty je łączące. Wtedy liczba błędów i zmarnowanego czasu spada niesamowicie, bo poprawianie na rysunku kosztuje tylko gumkę do ścierania.

Postaw piwo autorowi tego posta
 
 
kamdz 



Posty: 39
Wysłany: 22-09-2017, 19:47   

Chciałem nawet narysować jeszcze jeden pełny schemat, ale stwierdziłem, że prędzej się pomylę przy przenoszeniu go na płytkę, niż jak bede robił od razu na płytce. Płytka uniwersalna daje taką możliwość ;) a jak byś skomentował moją dotychczasową pracę? Luty?

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4102
Pomógł: 442 razy
Otrzymał 585 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 23-09-2017, 11:10   

Schemat ideowy to podstawa. Tam są wszystkie połączenia ale narysowane tak, by widać było sens działania urządzenia: co czym steruje, z czego jest zasilane, wartości elementów itp. Dopiero na podstawie tego, gdy już jesteś pewien każdego szczegółu robisz - wciąż na papierze lub w kompie - schemat montażowy. Tutaj masz już narysowane wszystko tak jak wygląda w rzeczywistości: scalak jest prostokątem z nóżkami na dwóch lub czterech krawędziach, tranzystor mocy ma trzy nóżki z jednej strony i czasem dziurkę na śrubę radiatora. To wciąż nie ma wiele wspólnego z płytką, ale przybliża Cię do niej. Dopiero teraz zaczynasz kombinować z ułożeniem elementów na prawdziwej płytce, bo dopiero teraz widzisz co i jak fizycznie jest połączone, gdzie jest dużo kabelków a gdzie mało. Który element warto położyć blisko (i na przeciwko i którą krawędzią obrócony do) jakiegoś innego bo między nimi jest 10 linii a który może być dalej, bo do niego dochodzą tylko dwa przewody itp. Potem możesz stworzyć jeszcze trzecią wersję, już z docelowo rozmieszczonymi elementami. Te wszystkie etapy są ważne a chodzenie na skróty wcale nie przyśpiesza. Trzeba mieć dużo wprawy i doświadczenia by na podstawie samego schematu ideowego od razu dobrze położyć elementy na płytce. Zwykle zaraz wychodzi, że to trzeba było przesunąć, dać bliżej albo obrócić. No cóż, sam zobaczysz.
Luty? Zdjęcia są nieostre a płytka jest jednowarstwowa bez metalizacji. Cyna nie wnika w otwory tylko robi kulki na padach. Mogłoby być jej mniej, ale lutowanie nie wygląda na zimne. Ja bym puszczał kabelki po stronie lutowania - jest dużo prościej, bo łączysz wprost piny ze sobą. Do takiego montażu niezbędny jest odpowiedni kabelek. Koniecznie w izolacji teflonowej, bo ta nie znika i nie pali się pod lutownicą. Jest cienki, mieści się między nóżkami scalaków a na tyle sztywny, że połączenia zostają po montażu tak jak je położyłeś. Kup szpuleczkę tzw. kynaru:
http://www.tme.eu/pl/details/kynar30awg50mwh/przewody-jednozylowe-drut/bq-cable/
50m starczy na wiele płytek, a komfort pracy jest nieporównywalny do przewodzików z PVC.

Postaw piwo autorowi tego posta
 
 
kamdz 



Posty: 39
Wysłany: 23-09-2017, 22:29   

Taaak. Szkoda, żepiszesz teraz jak mi już doszło zamówienie z tme... Myślę, żeten projekt skończe na tym druciku co mam, nie zależy mi na estetyce, ani niczym takim... Dzisiaj polutowałem kolejną masę kabelków i jeden czujnik. Potem poprawiłem 9999 znalezionych błędów i czujniczek zadziałał :) oczywiście sprawdzałem tylko multimetrem, bez atmegi i.muxów... Ale działa :) przy 30k dostałem od 0,18 do 4,12 volta ( ale mój czarny był taki szarawy;)) oczywiście wiem, że muszę zastosować potencjometr... No ale coś mi w końcu działa ;)
Aahaaa bo tam wyżej pytałem się, czy nie znasz może jakiegoś dobrego darmowego kursu C dla mikrokontrolerów...


20170923_222159.jpg
Plik ściągnięto 3 raz(y) 3.11 MB

20170923_222212.jpg
Plik ściągnięto 2 raz(y) 3.06 MB

Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Czujnik siły - jaki ... "czunik" d... Gdzie kupić te czujn... Styczniki w MiniSumo...
lub przeszukaj forum po wybranych tagach: czujniki, do, jakie, linefollowera, pomoc, wyborze


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki