Skocz do zawartości

Braders94

Użytkownicy
  • Zawartość

    97
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    2

Braders94 wygrał w ostatnim dniu 31 sierpnia 2014

Braders94 ma najbardziej lubianą zawartość!

Reputacja

5 Neutralna

O Braders94

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna
  1. Witam. Chciał bym wam zaprezentować moje próby wykonania nawigacji dla robota. Pomysł zrodził się już jakiś czas temu ale praca nie pozwala na rozwijanie swojego hobby, ale udało mi się znaleźć trochę czasu na wykonanie pierwszych prób. Pomysł jest bardzo prosty dwie wieże nadawany sygnał ultradźwiękowy plus przez kabel "później radio" sygnał o wysłaniu sygnału. Odbieramy jak długo fala leciała i znamy odległość. Później obliczamy punkt przecięcia dwóch okręgów o promieniach takich jak odległość wieżyczek od robota i mamy współrzędne robota. Obrazek z painta:) Teraz zaprezentuję krótki filmik co mi się udało zrobić, widać tam zasadę działania. Sorki za miejsce nagrania ale nie chciało mi się tego przenosić Jako iż odbiornik ultradźwiękowy zbiera fale z 10° co do tego projektu jest znacznie za mało to postanowiłem zbudować taki mały przyrząd czeka na przetestowanie . Dodałem obsługę czujników za pomocą timerów i zwiększyłem dokładność do dwóch zer po przecinku. Jak widać na powyższym filmiku mam kłopot z falowaniem wyniku, będzie trzeba dodać jakieś uśrednianie kilku wyników. Ok udało mi się ogarnąć program potrzeba mu jeszcze trochę podpicowania bo pisałem i składałem go na szybko, ale działa. Prosty opis planszy do testów "I znów ten paint" Punkt (X0:Y0) na dole po lewej stronie. Drugi nadajnik jest odsunięty od tego o ~400mm w prawo. Opis danych na wyświetlaczu. Pierwsza linijka odległość od stacji numer 1 i 2. Druga linijka pozycja X i Y odbiornika. Oto filmik z testów. Jak widać jakoś "ledwie" to działa. Teraz pozostał największy problem do ogarnięcia, a mianowicie rozproszenie sygnału,tak aby pokrywał sygnałem jakieś 90°. A po drugie to żeby zebrać ten sygnał na około robota. Schemat Kod #include "HD44780.h" #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile uint16_t pomiar,ostatniPomiar; float odleglosc, odleglosc2; uint16_t bufor[10]; uint16_t bufor2[10]; uint8_t miejsce=0; double x3, y3, x3_prime, y3_prime; void Start(void); void Start2(void); uint8_t circle_circle_intersection(double x0, double y0, double r0, double x1, double y1, double r1, double *xi, double *yi, double *xi_prime, double *yi_prime) ; int main(void) { //WE/WY DDRB |= (1<<PB1);//jako wyjscie DDRB |= (1<<PB2);//jako wyjscie DDRD |= (1<<PD7);//jako wyjście echo DDRB &= ~(1<<PB0);//jako wejscie echo PORTB &= ~((1<<PB2)|(1<<PB1) | (1<<PB0)); PORTC &= ~(1<<PD7); TCCR1B |= (1<<ICES1);//Zbocze narastające wywoła przerwanie TCCR1B |= (1<<CS11);// preskaler 8 TIMSK |= (1<<TICIE1);// zezwolenie na przerwanie od ICP sei();//globalne odblokowanie przerwan LCD_Initalize(); //inicjacja LCD //PETLA GLOWNA while(1) { Start();//wywołanie pomiaru bufor[miejsce]=pomiar;//zapisz do bufora miejsce++; if (miejsce>9) miejsce=0; //zapętlenie zmiennej pomiar=bufor[0]; //wpisanie 1 rejestru for(uint8_t i=1;i<10;i++)//dodawanie kolejnych rejestrów pomiar=pomiar+bufor[i]; pomiar=pomiar/10; //dzielenie przez liczbę rejestrów odleglosc = (float)(pomiar / 29.00);//obliczenie dystansu w cm Start2();//wywołanie pomiaru bufor2[miejsce]=pomiar; pomiar=bufor2[0]; //wpisanie 1 rejestru for(uint8_t i=1;i<10;i++)//dodawanie kolejnych rejestrów pomiar=pomiar+bufor2[i]; pomiar=pomiar/10; //dzielenie przez liczbę odleglosc2 = (float)(pomiar / 29.00);//obliczenie dystansu w cm //run_test(0.0, 0.0, odleglosc, 40.0, 0.0, odleglosc2); if(miejsce==5) { LCD_Home(); //czyść ekran LCD_WriteFloat(odleglosc); LCD_WriteText("cm "); LCD_WriteFloat(odleglosc2); LCD_WriteText("cm "); LCD_GoTo(0, 1); if(circle_circle_intersection(0.0, 0.0,odleglosc , 28, 0, odleglosc2, &x3, &y3, &x3_prime, &y3_prime)) { LCD_WriteText("x"); LCD_WriteFloat(x3); LCD_WriteText("y"); LCD_WriteFloat(y3); } else LCD_WriteText("blad obliczen"); } _delay_ms(100); } } //Przerwanie z pinu ISR(TIMER1_CAPT_vect) { if((TCCR1B & (1<<ICES1))) { ostatniPomiar = ICR1;//jesli zbocze narastajace, zapisz ICR1 } else { pomiar = ICR1 -ostatniPomiar;//Jeśli zbocze opadajace oblicz pomiar } TCCR1B ^= (1<<ICES1);//Zmiana zbocza wyw przerwanie } void Start(void) { ostatniPomiar=0; pomiar=0; PORTB |= (1<<PB1);//uruchomienie pomiaru w nadajniku PORTD |= (1<<PD7);//uruchomienie pomiaru w odbiorniku _delay_ms(10); PORTB &= ~(1<<PB1); PORTD &= ~(1<<PD7); _delay_ms(60); } void Start2(void) { ostatniPomiar=0; pomiar=0; PORTB |= (1<<PB2);//uruchomienie pomiaru w nadajniku PORTD |= (1<<PD7);//uruchomienie pomiaru w odbiorniku _delay_ms(10); PORTB &= ~(1<<PB2); PORTD &= ~(1<<PD7); _delay_ms(60); } uint8_t circle_circle_intersection(double x0, double y0, double r0, double x1, double y1, double r1, double *xi, double *yi, double *xi_prime, double *yi_prime) { double a, dx, dy, d, h, rx, ry; double x2, y2; dx = x1 - x0; dy = y1 - y0; d = hypot(dx,dy); if (d > (r0 + r1)) { return 0; } if (d < fabs(r0 - r1)) { return 0; } a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ; x2 = x0 + (dx * a/d); y2 = y0 + (dy * a/d); h = sqrt((r0*r0) - (a*a)); rx = -dy * (h/d); ry = dx * (h/d); *xi = x2 + rx; *xi_prime = x2 - rx; *yi = y2 + ry; *yi_prime = y2 - ry; return 1; } W kodzie wykorzystałem kilka bibliotek z internetu tutaj są linki do stron gdzie je znalazłem. Obliczanie punktu styku dwóch kół. http://paulbourke.net/geometry/circlesphere/ Biblioteka do wyświetlacza. http://radzio.dxp.pl/hd44780/hd44780_avr_4-bit_norw_c.htm
  2. Po pierwsze odblokuj prędkość zegara w pliku MAKEFILE. Usuń znaczek # przed prędkością zegara jaka jaką jest taktowany twój avr. Masz najnowszą wersję Winter?
  3. F_CPU masz dwa razy zdefiniowane usuń pierwsza linijkę bo tego się nigdy nie definiuje w pliku *.c. I wstaw plik MAKEFILE. Chyba mam rozwiązanie twojego problemu. Tutaj rozpoczynasz funkcje main która nie pobiera parametrów, i zwraca liczbę int. Ale nie zwracasz tej liczby na koniec funkcji. Dopisz na końcu funkcji main return(0);
  4. Dryf ma żyroskop a nie akcelerometr. Jak nie zamierzasz robić tą platformą szybkich ruchów to starczy ci akcelerometr.
  5. http://arduino.cc/en/Main/arduinoBoardUno Do tego rozładowanie plus spadek napięcia.
  6. Czy naprawdę musiałeś zakładać nowy temat? A co do balsy i serwa to podaj wymiary i udźwig bo wróżki poszły na emeryturę. A serwo się dobiera po przeprowadzeniu obliczeń, obliczyłeś masę ramienia i chwytaka?
  7. http://lol24.com/wideo/niesamowite/wykonal-koparke-z-drewna-i-strzykawek-7270 Są daleko za murzynami.
  8. To zależy od wielkości całego robota i jego przyszłego udźwigu. Najlepsze aluminium łatwy w obróbce mocne i lekkie, laminat łatwy w obróbce dość mocny ale swoje waży, plexa łatwa w obróbce dość giętka i trochę waży, Listewki drewniane "ktoś dopisze nazwę bo zapomniałem" tanie dość łatwe w obróbce mocne i lekkie.
  9. Te silniki można zasilać do 12v dwie baterie dają jakieś 7.4 do tego spadek na mostku. Jak nie będziesz chciał cofania to daj dwa tranzystory to znacznie ułatwi pracę. Stabilizator daj jakiś LDO one potrzebują 0.5v wyższego zasilania. Co do kół to tylko koszulkę na wał i ustawić je jakoś po skosie. A co do adc to attiny go nie mają więc albo dzielnik na rezystorach albo zmiana na atmege.
  10. Bez przekładni raczej nie będzie jeździć "ale jak robot będzie lekki to z małymi kołami a najlepiej z koszulką termokurczliwą na wale i bez kół na samym wale jeździć" najlepiej zastosuj przekładnie. To czy będzie działał na 5v to zależy od silnika jaki masz. Tranzystory zawsze możesz zastosować ale sterowanie na mostku będzie łatwiejsze.
  11. Przeglądając internet znalazłem takie coś jak "banana pi" lepsza odmiana RPI. Corex A7 dualcore 2x1ghz i 1gb ram.
  12. Widziałem gdzieś arduino z kamerą i wyświetlaczem, i jakoś to chodziło. Zasoby nie są aż tak ważne tylko może być problem z wysyłaniem obrazu do pc bo atmega by nie zbierała danych w rami tylko by służyła jako konwerter wyjścia kamery na wifi. Ale wysłanie by mogło dużo czasu procesora zajmować. Wniosek nie warto. Albo pomyśl o jakimś ARM.
  13. @Elvis A ile zajmuje czasu obróbka jednej klatki, czyli pobranie, konwersja na odcień szarości i wykrycie koloru?
  14. Telefon z androidem idzie wykorzystać jako kamerę bezprzewodową. Co do sterowania to moim skromnym zdaniem radził bym coś z modułów radiowych. Lepiej sam zrób sobie sterownik wyjdzie taniej. Do sterownia będzie potrzebne: atmega, mostek, konwerter usb uart i programator. Albo rpi kupujesz jakiś ruter malinkę i kamerę razem jakieś 300zł ale masz wszystko co potrzebne.
  15. Rpi programuje się tak samo jak komputer na linuksie. Kurs do open cv jest na forum, i wykrywani koloru jest łatwe tylko czy kalinka się wyrobi żeby każda klatkę przeanalizować. Kamera w odcieniu szarości by starczyła do takiego czegoś zawsze szybciej będzie. Coś ostatnio bum na roboty z kamerami jest.
×
×
  • Utwórz nowe...