Skocz do zawartości

Jakie czujniki do linefollowera? Pomoc w wyborze


kamdz

Pomocna odpowiedź

Okej trochę potestowałem.

Wysyłanie danych na serial działa prawidłowo. Sprawdzone tym kodem:

 #include <stdlib.h>




#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 skan(uint16_t* wyniki, uint8_t dlugosc);
void USART_Init(unsigned int ubrr) ;
void USART_Transmit(char data ) ;
unsigned char USART_Receive( void ) ;
int getADC(int number);
void USART_TransmitString (char *str) ;
void ustawmux (int liczba) ;
int adc;
char adc1 [4];
#define CZUJNIKI 8
uint16_t wynikiADC[CZUJNIKI] = {1234,2345,3456,4567,5678,6789,7891,8912};

int main(void)
{

 unsigned char odb;
   USART_Init(USART_UBBR_VALUE);
   //InitServ();
   //int i;
   while(1) {
   	odb = USART_Receive();
   	        if(odb =='0'){
   	for(int a=0; a<8; a++){
   	 itoa(wynikiADC[a],adc1,10);
   	USART_TransmitString (adc1);
   	USART_TransmitString ("\n");
   	}
   }
   }
//_delay_ms(1000);


   }






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(char data )
{

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

void USART_TransmitString (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;

}

int getADC(int number)
//number należy do <0, 7>, kod nie sprawdza szkoda pamięci FLASH
{
       ADMUX &= 0xf0; //zerowanie 4 młodszych bitów
       ADMUX |= number; //ustawianie numeru kanału

       ADCSRA |= 1<<ADSC; //zaczyna konwersję
       while(ADCSRA & (1 << ADIF));    //dopuki bit ADIF nie jest ustawiony nie jest gotowa kowersja
       ADCSRA &= ~((1 << ADSC) | (1 << ADIF)); //zeruj flage konwersji i rozkaz rozpoczecia
       return ADCW;
}

void ustawmux (int liczba)
{
   PORTD = (PORTD & 0b00011111) | ((liczba & 0b111) << 5);
}

void skan(uint16_t* wyniki, uint8_t dlugosc)
{
  for (uint8_t kanal=0; kanal<dlugosc; kanal++)
  {
     ustawmux(kanal);
     _delay_us(100);
     wyniki[kanal] = getADC(0);
  }
}

Za to przy teście funkcji od zapalania diód ir coś jest nie tak: cały czas świeci tylko ta ostatnia...

 #include <stdlib.h>




#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 skan(uint16_t* wyniki, uint8_t dlugosc);
void USART_Init(unsigned int ubrr) ;
void USART_Transmit(char data ) ;
unsigned char USART_Receive( void ) ;
int getADC(int number);
void USART_TransmitString (char *str) ;
void ustawmux (int liczba) ;
int adc;
char adc1 [4];
#define CZUJNIKI 8
uint16_t wynikiADC[CZUJNIKI] = {1234,2345,3456,4567,5678,6789,7891,8912};

int main(void)
{
while(1){
for(int a = 1; a<9; a++){
	ustawmux (a);
	_delay_ms(2000);


}
}
   }






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(char data )
{

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

void USART_TransmitString (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;

}

int getADC(int number)
//number należy do <0, 7>, kod nie sprawdza szkoda pamięci FLASH
{
       ADMUX &= 0xf0; //zerowanie 4 młodszych bitów
       ADMUX |= number; //ustawianie numeru kanału

       ADCSRA |= 1<<ADSC; //zaczyna konwersję
       while(ADCSRA & (1 << ADIF));    //dopuki bit ADIF nie jest ustawiony nie jest gotowa kowersja
       ADCSRA &= ~((1 << ADSC) | (1 << ADIF)); //zeruj flage konwersji i rozkaz rozpoczecia
       return ADCW;
}

void ustawmux (int liczba)
{
   PORTD = (PORTD & 0b00011111) | ((liczba & 0b111) << 5);
}

void skan(uint16_t* wyniki, uint8_t dlugosc)
{
  for (uint8_t kanal=0; kanal<dlugosc; kanal++)
  {
     ustawmux(kanal);
     _delay_us(100);
     wyniki[kanal] = getADC(0);
  }
}


To tu może być problem... ale ta funkcja jest od Marka1707 więc ten. no 😉

Czy w tym drugim kodzie jest jakiś błąd?

Link do komentarza
Share on other sites

No to niech ktoś się jej przyjrzy, pisałem z głowy i nigdzie testowana nie była. Ja się gapię i moim zdaniem powinna działać pod warunkiem, że multiplekser zapalający diody podłączyłeś do PD7, PD6 i PD5 bo tam funkcja ustawmux() wysyła 3 najmłodsze bity otrzymanego argumentu. Napisałem ją na podstawie Twojej, widząc co i gdzie zmieniasz na portach w swoim switchu. Swoją drogą do portu D wysyłałeś całkiem duże liczby dziesiętne.. I dlatego przydałby się schemat, bo problem może być na styku sprzętu i programu. Pokaż jak masz ten mux podłączony.

No ale dobrze, znajdowanie błędów to podstawowe zajęcie w czasie uruchamiania kodu, brawo, to pierwszy większy sukces 🙂 Teraz już tylko trzeba znaleźć przyczynę niedziałania diodek. Napisz jak poszło.

Acha, i jeśli puszczasz pętlę for taką jak pokazałeś, to prosisz o ustawienie muxa na adresy od 1 do 8 a przecież powinieneś od 0 do 7, prawda? To niewiele zmienia choć sam test jest błędny, bo nie działa jak sobie założyłeś. Prawdziwe adresy multipleksera są tylko 3-bitowe, więc w rzeczywistości skanujesz obecnie czujniki w sekwencji 1,2,3,4,5,6,7,0 a nie 0,1,2,3,4,5,6,7. Jeśli już działa wypisywanie przez UART a nie jesteś pewien swoich umiejętności w zakresie zakładania pętli, zawsze możesz wyświetlić numer czujnika z jakim wywołujesz ustawmux().

Link do komentarza
Share on other sites

A bez mikrokontrolera? Na czym polegały Twoje testy? Nie potwierdziłeś nawet podłączenia muxa do trzech najstarszych bitów portu D a to zakłada funkcja ustawmux. To za trudne, nie rozumiesz o co pytam czy po prostu nie che Ci się? Czy możesz być bardziej wylewny? Bez schematu z numerami pinów obu kostek dalsze bicie piany nie ma sensu. Gadanie do ściany powoli zaczyna mi brzydnąć.

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

Dobra, jutro obiecuję sprawdzić tę funkcję na jakimś moim AVR. Tymczasem spróbuj ją zmienić na coś takiego:

void ustawmux (uint8_t liczba) 
{ 
   PORTD = (PORTD & 0b00011111) | ((uint8_t)(liczba << 5));
} 

To wymusza operacje 8-bitowe i kod asemblerowy jest bardziej zwięzły. Choć teoretycznie robi to samo..

Link do komentarza
Share on other sites

To ja też jutro sprawdzę 😉

[ Dodano: 16-10-2017, 12:19 ]

Sprawdziłem to: świeci mi się teraz diodka 1 przez 2s, przestaje i już nie świeci... Hardware chyba musi być dobry, bo jak zmieniam te trzy kabelki ręcznie to mi działa (oprócz jednej diody, która najpewniej jest spalona... Do wymiany)

Niecierpliwie czekam na wyniki Twoich testów Marek 🙂

Link do komentarza
Share on other sites

A czy sprawdziłeś, choćby woltomierzem czy zmieniają się stany logiczne na PD5..PD7? Tam powinny pokazywać się kolejne liczby binarne 000..111. Jeśli robisz to powoli (np. delay(2000)) to zwykły multimetr pokaże raz 0V a raz napięcie Vcc. Czy masz ustawione te piny na wyjścia? Odpowiednie bity w rej. DDRD powinny być jedynkami - czyli przynajmniej trzy najstarsze.

Link do komentarza
Share on other sites

Witam ponownie. Długo mnie nie było bo miałem inne zajęcia, w tym pieszczenie pianinka na arduino;) Ale jestem i wracam z kolejną garścią informacji. JAk podłączę do tych 3 wyjść diody led, to widać, że wszystko po tej stronie działa poprawnie. Jak podłączę sobie muxa osobna na stykówce i manualnie go steruję zwierając piny adresu do gnd lub vcc to też wszystko ładnie działa. A jak połączę to wszystko razem to klops 🙁 Ale ciągle coś węszę, więc pożyjemy zobaczymy. Ale będę wdzięczny za wszelkie sugestie.

[ Dodano: 31-10-2017, 22:16 ]

Okej. Wszystko ładnie działa na normalnych ledach, miałem tam wgrany jakiś inniejszy projekt bez ddrd = 11111111

Nie świecą mi dwie diodki ir pod telefonem, 1 i 4. Czy to znaczy, że spalone i do wymiany?

Link do komentarza
Share on other sites

To znaczy tylko tyle, że nie świecą. Być może nie płynie przez nie prąd a przyczyn tego może być kilka: źle przylutowany sam czujnik (anoda lub katoda diody), odwrotnie podłączone kabelki do diodki w czujniku, niedolutowanie po stronie muxa, uszkodzona diodka lub wyjście scalaka. Wybierz na stałe numer jednego albo drugiego felernego wyjścia i zacznij mierzyć napięcia. Zacznij od pinu muxa, potem po kabelku do samej diodki. Jeżeli na niej (na anodzie) będzie >2V to albo jest uszkodzona, albo jej drugi koniec (katoda) nie ma masy. Nie pamiętam Twojego schematu i zakładam, że z muxa przychodzi plus do anod a katody są do GND. Wszystko jedno, prześledź gdzie ginie sterowanie i daj znać jak poszło.

Pianinko rozmontowane czy coś tam jeszcze brzdąkasz? Jakaś rozbudowa?

Naprawdę robisz korkociągi? To trudna figura akrobacji zarówno do wejścia jak i trudna do wyciągnięcia. Może myślałeś o beczkach i pętlach?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Ok jutro jeszcze zbadam pacjenta 😉

Pianinko narazie nie rozmontowane, bo jeszcze pewnie to dam jako projekt na technikę, ale rozbudowy narazie nie planuję. Teraz linefollower 🙂 zrobilem tylko obudowe. Jutro dam filmiki.

Korkociągi robię tylko na dużej wysokości 🙂 no i wiadomo, ta taśma klejąca na modelu to nie dla zabawy, nie jedno miał niekontrolowane przyziemienie. Nie wiem co to beczka i petla, robiłem jescze takie wielkie koła w pionie samolotem to pewnie któreś z nich 🙂 ale no tak jak jak mówię to zajęcie na ferie i wakacje, bo wtedy na wieś wyjezdzam i mam gdzie latac...

[ Dodano: 01-11-2017, 18:42 ]

Diodki ir udało mi się ogarnąć i ładnie działają. Ale teraz nagle wszystkie czujniki na wyjściu mają 1000. Sprawdzam bez muxów, miernikiem wpinając się w odpowiednie piny i 4,5 volta nie reaguje na światło ani zmianę koloru 🙁 sprawdziłem połączenia 50 razy i jestem na dnie otchłani rozpaczy 🙁🙂

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.