Skocz do zawartości

malum

Users
  • Zawartość

    75
  • Rejestracja

  • Ostatnio

Wszystko napisane przez malum

  1. Zdaję sobie z tego sprawę, ale nie bardzo wiem jak rozwiązać ten problem. Dokumentacja też nie wiele mi mówi, chyba że czegoś nie widzę. GP2D12-DATA-SHEET.PDF
  2. Witam! Przymierzam się do zastosowania czujnika Sharp GP2D12 w moim robocie. Podczepiłem go więc do miktokontrolera AtMega8 i napisałem prosty program mający za zadanie zapalić diodę LED, gdy czujnik coś zobaczy. Linijka odpowiedzialna za uruchomienie diody wygląda tak: if(PINB & _BV(6)) PORTC = 0x04; elsr PORTC = 0x00; Program działa, ale dioda zapala się dopiero, gdy czujnik zobaczy coś w odległości co najwyżej 18cm. Przy większej odległości dioda gaśnie. Teoretycznie czujnik powinien działać do 80cm. Postanowiłem więc utworzyć zmienną, która zmieni wartość z 0 na 1 gdy czujnik
  3. Schemat Hornera znam, ale nie spotkałem się nigdy z konstrukcją wynik <<= 1; i szczerze mówiąc nadal nie bardzo rozumiem jak to działa, no i dlaczego w linijce int na10(const char* liczba2) char'a deklarujemy jako stałą?
  4. Faktycznie, ja też przekleiłem mechanicznie bez przeanalizowania - teraz działa. [ Dodano: 04-11-2015, 23:32 ] Szczerze powiem, że tej konstrukcji nie znałem, możesz trochę dokładniej opisać zastosowane polecenia?
  5. Elvis, sprawdziłem działanie tego programu w DevC++ i nie bardzo działa. Po wykonaniu polecenia na10("00110011") otrzymałem 12291, a powinienem otrzymać 51. Czy kompilator C++ skompilował inaczej niż kompilator C?
  6. Założeniem programu jest sterowanie 6 diodami podpiętymi do portów D mikrokontrolera Atmega8, więc teoretycznie wystarczy mi 6 znaków liczby binarnej. Jednak dla lepszego zobrazowania całego portu D zdecydowałem się na użycie 8 znaków. Więcej mi nie potrzeba. Gdyby jednak zaszła taka konieczność to wystarczy sprawdzić wielkość tablicy char'ów i powtórzyć pętlę dokładnie tyle razy. Jeśli chodzi o mnożnik, to oczywiście można pokusić się o zastosowanie schematu Hornera czy choćby potęgowania, ale nie zmniejszy to ani złożoności obliczeniowej, ani pamięciowej tego algorytmu, ponieważ ilość oper
  7. Czyli jak rozumiem proponujesz takie rozwiązanie: int na10(char liczba2[]) { int liczba10=0, mnoznik=1; for(int i=7;i>=0;i--) { liczba10 += (liczba2[i]-48) * mnoznik; mnoznik *= 2; } return liczba10; } Jutro sprawdzę czy to zadziała.
  8. To nie tylko standardowe zadanie na OIG, ale również jeden z podstawowych algorytmów ... i na pewno działa. Problem rozwiązany, a zwycięzcą jest Elvis! Dziękuję bardzo za podpowiedź i rozwiązanie, chociaż teraz mam jeszcze jeden problem Pierwotnym problemem było złe rozumienie liczby przez mikrokontroler. Gdy podawałem 00111111 niby w systemie dziesiętnym, to mikrokontroler rozpoznawał ją jako liczbę ósemkową a nie dziesiętną no i zamiana nie wychodziła. Wystarczyło usunąć te dwa zera na początku i wszystko działa. Drugi problem to sprzeczność z moim założeniem. Chciałem podawać ko
  9. Dlaczego pomysł jest zły? Teoretycznie podaję liczbę w postaci dziesiętnej, ale gdy obliczam reszty z dzielenia to otrzymuję liczby jednocyfrowe dziesiętne, czyli dokładnie takie jakich oczekuję. Wystarczy przemnożyć je przez kolejne czynniki tworzące rzędy systemu binarnego, czyli 1, 2, 4, 8, 16, 32, ...i otrzymuję wartość dziesiętną danego rzędu. Jest to jeden z klasycznych algorytmów. Bardziej obrazowo wygląda to tak: 00111111(2) = 0*2^7 + 0*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 0*128 + 0*64 + 1*32 + 1*16 + 1*8 + 1*4 + 1*2 + 1*1 = 0 + 0 + 32 + 16 + 8 + 4 + 2 + 1 = 63
  10. Witam! Postanowiłem napisać funkcję zamieniającą liczbę podaną w systemie dwójkowym na liczbę zapisaną w systemie dziesiątkowym. Jest to klasyczny algorytm konwersji liczb i gdy kompiluje go w DevC++ to działa, ale gdy wrzucam go do AtMega8 to się sypie. Program testowałem na 6 diodach LED, które mają mrugać w kombinacjach opisanych za pomocą liczby binarnej. Gdy zamieniam tę liczbę na system heksadecymalny (szesnastkowy) lub decymalny (dziesiątkowy) to wszystko działa prawidłowo, ale gdy otrzymuję liczbę dziesiętną z funkcji to kolejność diod jest zupełnie inna. Poniżej funkcja - co jest nie
  11. Znasz to serwo czy oceniasz po zdjęciu? Szczerze mówiąc patrząc na zdjęcie to mam wątpliwości, ale jeśli jesteś pewny, to jeden problem jest rozwiązany. [ Dodano: 21-10-2015, 19:57 ] Jak je odróżnić? Czy serwo TowerPro MG996 jest RC czy smart?
  12. Witam! Przymierzam się do wykonania robota klasy minisumo no i oczywiście stanąłem przed problemem wyboru napędu. Zdecydowałem się na przerobione serwomechanizmy z metalowymi zębami. Rozważam poniższe serwa: - Emax ES08MAII (chyba jedne z najszybszych) - TowerPro MG90s (podobne do powyższego, ale nie wiem czy da się przerobić, ponieważ znalazłem jedno zdjęcie rozebranego serwa, gdzie na zębatce jest uskok - czy to takie dziwne zdjęcie czy faktycznie zębatka tak wygląda - uskok pokazany na załączonym zdjęciu?) - TowerPro MG996 (bardzo ciężkie i bardzo mocne, ale cyfrowe - czy da się takie
  13. Chyba doszedłem, chodzi o przekroczenie zakresu zmiennej Mam jednak inny problem, gdy zbudowałem program bazujący na czułości 128 robot spisywał się bardzo dobrze poruszając się po brązowym linoleum z białymi liniami. Gdy jednak wprowadziłem procedurę uśredniania wszystko diabli wzięli. już piszę o co chodzi. Średnią obliczam na podstawie czujnika 0 i 5. Czujniki mam ułożone w taki sposób: 5 2 1 3 0 4 Gdy po kalibracji na tej samej białej linii na brązowym linoleum zaczynam przesuwać robota na boli, to okazuje się, że czujniki głupieją
  14. Z tym to strzeliłem gafę, chyba ślepy jestem, ale tego to nie rozumiem. Jak zrozumiałem mam obliczyć średnią z dwóch pomiarów, z linii i z tła. Średnia to suma wszystkich pomiarów podzielona przez ich ilość. Czemu więc moja wersja jest niepoprawna?Jeszcze jedno, co to za zmienna i czym różni się od ? Zmienne znalazłem, ale się trochę naszukałem Nazwa typu danych | Długość w bajtach | Zakres wartości int8_t | 1 | -128 ... 127 uint8_t | 1 | 0 ... 255 int16_t | 2 | -32768 ... 32767
  15. No, i o to właśnie chodzi. Czyli mam wykorzystać Twój kod, zapisać w dwóch zmiennych pomiar z czujnika środkowego i bocznego, dodać podzielić przez 2 i wynik przypisać zmiennej czułość? Ale jak zmierzyć tą czułość? Czy wystarczy taki kod (przypominam, że czujniki mam przyczepione do bloku C)? int p1, p2, czulosc; //POCZĄTEK SPRAWDZANIA CZUJNIKA 0 PODŁĄCZONEGO DO PORTU C0 ADMUX = (PC0 + 96); //+96 aby ustawić ADLAR i REFS !!!!!WYBÓR CZUJNIKA ADCSRA |= (1<<ADSC); //start conversion while(bit_is_clear(ADCSRA,ADIF)); //czekaj na koniec pomiaru p1 = ADSC; //POCZĄTEK SPRAWDZANIA CZ
  16. Dzięki wielkie, już jestem bardziej w temacie. Mam robota na uC AtMega8, czujniki podczepione do wszystkich ponów bloku C zgodnie z opisanym przez Ciebie schematem, więc wszystko powinno grać. Mam jedna pytanie if(ADCH > czulosc) Wykorzystałeś tutaj zmienną czulosc, ale nie widzę, żeby miała ona przypisana jakąś wartość - mylę się? Jak ją przypisać, tzn. jak obliczyć?
  17. Mój robot pracuje na standardzie 1MHz. Mam kwarc, ale jeszcze go nie uruchamiałem i wykorzystuję wbudowany zegar. Trochę boję się tego kwarcu, bo czytałem, że można zablokować uC... Co do ADC, z tego co przed chwilą wyszukałem w necie, powinienem użyć przetwornika ADC, inni piszą, że czujniki powinny być podczepione pod ADC uC, ale gdzie to, bo w opisie nie ma takiego pinu. Ja korzystam z L293D - czy w takiej sytuacji da się zastosować ADC? Nes86, zamieściłeś takie fragment kodu: if(ADCH > czulosc){ //czujnik wyrył czarną linię } else{ //czujnik nie wykrył czarnej l
  18. Odświeżam temat! Zabrałem się za pisanie programu dla Line Folower'a w C. Napisałem prosty program, bazujący na konstrukcji "widzę linię / nie widzę linii". Robot zachowuje się poprawnie, ale tylko w sytuacji, gdy między linią a tłem jest dość spory kontrast. Problem powstaje jednak, gdy kontrast jest mały. Z tego co czytam powinienem zastosować autokalibrację. Mam jednak pytanie - w jaki sposób mierzyć napięcia na czujnikach. Mogę prosić o jakieś źródełko w C wykonujące pomiar napięcia na czujniku CNY70?
  19. SUPER!! Dzięki za pomoc - masz u mnie piwko! Problemem były odwrotne komentarze - nic dziwnego, że mi silniki szalały. Dla potomnych mających ten sam problem zamieszczam kod: #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> void ledy_on() { for(int i=0;i<=6;i++) { _delay_ms(1000); switch(i) { case 0: PORTD |= 0x01; break; case 1: PORTD |= 0x02; break; case 2: PORTD |= 0x04; break; case 3: PORTD |= 0x08; break; case 4: PORTD |= 0x10; break;
  20. Nie bardzo rozumiem - możesz wprowadzić poprawki do powyższego opisu? Z tego co piszesz wynika, że praktycznie wszystkie linijki sterowania silnikami są złe
  21. Gdy wrzucam ten kod silniki w ogóle nie startują, diody zapalają się jak poprzednio, ale oba silniki stoją. Próbowałem też wersję z 0x3f bo chyba tak powinno być. Zasilenie silników jest OK, oba silniki pracują, ale nie tak jakbym chciał.
  22. W dalszym ciągu coś mi nie gra. Napisałem taki program: #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> void ledy_on() { for(int i=0;i<=6;i++) { _delay_ms(1000); switch(i) { case 0: PORTD |= 0x01; break; case 1: PORTD |= 0x02; break; case 2: PORTD |= 0x04; break; case 3: PORTD |= 0x08; break; case 4: PORTD |= 0x10; break; case 5: PORTD |= 0x20; break; case 6: PORTD = 0x00; break; } } } void przod() {
  23. Czyli jak rozumiem, gdy podaję stan wysoki na 1A a niski na 2A to silnik obraca się w jedną stronę, a gdy podaję stan niski na 1A i wysoki na 2A to silnik kręci w drugą stronę - zgadza się? Tylko teraz jeszcze jedno pytanie - jak rozróżnić który to !a, który 1A, 2A, itd. Patrząc na przykład: void turn_left_fast() { PORTB &= ~_BV(3); PORTB &= ~_BV(0); PORTB |= _BV(4); PORTB |= _BV(5); PORTB &= ~_BV(1); //kanały pwm (maksymalne wypełnienie) PORTB &= ~_BV(2); } nie bardzo potrafię go rozczytać - mógłbyś wyjaśnić linijka po linijce co tu się dzieje i
  24. Skleciłem dzisiaj już chyba ostateczną wersję płytki do Line Follower'a i zabrałem się za oprogramowanie. Stan czujników pokazywany jest przez diody, a zrealizowałem to tak: int main(void) { /* Wszystkie linie portu D to wyjścia */ DDRD = 0x3f; /* Początek nieskończonej pętli */ while(1) { // wykrywanie linii w czujniku 1 if(!(PINC & 0x01)) PORTD = 0x01; else PORTD = 0x00; // wykrywanie linii w czujniku 5 if(!(PINC & 0x10)) PORTD = 0x20; else PORTD = 0x00; // wykrywanie linii w czujniku 2 if(!(PINC & 0x02)) PORTD = 0x02; else PORTD = 0x00; // wykrywanie
  25. Problem polega tylko na tym, że nie mogę stworzyć pliku Makefile bo nie mam na liście tego rodzaju kompilatora, a z tego co zrozumiałem Makefile jest potrzebny do kompilowania - mylę się?
×
×
  • 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.