Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 23 gru 2024, o 17:58


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 13 maja 2014, o 15:53 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Prosił bym o sprawdzenie oraz modyfikacje kodu który nie działa tak jakbym chciał.
Informuje, że fizycznie jest wszystko sprawnie złożone i tylko potrzeba odpowiedni program.
Z czego zbudowany jest ten robot: czujnik ultrasonic hc-sr04, mini serwo modelarskie, które to obraca czujnik, dwa silniki dc zasilane 6v oraz odbiornik podczerwieni IR 36kHz.
Docelowy cel działania : Robot załącza się na czujnik IR po czym reaguje na czujnik ultradźwiękowy i tak : w odległości większej jak 30 cm jedzie prosto , gdy jest 30 cm do 10 cm skręca w lewo, natomiast w odległości poniżej 10 cm jak gdzieś wjedzie to serwo obkręca się dwa razy o 180 stopni po czym za trzecim razem staje na 90 stopniach czyli ustawia się pośrodku no i cofa kołami. Na koniec chciałbym tak jak załączyłem tak wyłączyć go na ten czujnik IR.
Prototypowy zły kod, co w nim zmienić ?:
[
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mam nadzieję, że mi ktoś pomoże z tym z góry dziękuję ;)

Kody w tym dziale wklejamy przy pomocy syntax=cpp - Różowo-zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 16:58 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Napisz co nie działa. np. nie załącza się po podaniu impulsu IR, nie skręca, itp.. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 17:10 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Odbiornik IR działa załącza i wyłącza tak jak przycisk obojętnie jakim kodem z pilota, lecz po tym już nie wchodzi w funkcje loop i nie wykonuje pomiaru z czujnika, gdyż od razu idzie do else i kręcą koła do przodu, a czujnik nie reaguje.
Gdy go włączę to kręci czujnikiem serwo jak szalone ;)
Gdy wyrzucę z programu odbiornik IR to czujnik działa dobrze. W odległości odpowiedniej przełącza silniki.
Czyli pewnie pilot nie działa odpowiednio , a tak poza tym to serwo nie zawsze łapie tak jak trzeba.

Wywnioskowałem , że kod źle napisany trzeba go zmienić tylko za małą mam wiedzę aby z tym kombinować już 2 dni nad tym siedziałem i ciągle nie chce działać tak jak trzeba. Pomożesz?

------------------------ [ Dodano po: 19 minutach ]

Przetestowałem jeszcze raz ten program który wrzuciłem i tak:
Załączają się oba silniki, serwo kręci w prawo i w lewo po czym ustawia się na pozycji, ale czujnik już nie reaguje na odległość ręki . Dopiero, gdy użyje pilota to ożywa i kręci kołami w drugą stroną przy czym wykonuje cykl obrotu serwem i dalej nie reaguje na czujnik odległości tylko ciągle kręci kołami, a reakcje daje tylko na odbiornik podczerwieni , lecz to takie impulsy załączające i wyłączające oba silniki na mili sekundy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 17:30 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Ja się nie znam na programowaniu arduino ale czy nie musisz zrobić sobie pętli ?
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 17:37 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Pętla while z języka C, to w arduino loop jeśli się nie mylę. Loop ma za zadanie ciągle w koło wykonywać czynności, a w setup się ustawia parametry.

Tą funkcje void pilot() wykonuje tylko i wyłącznie jeśli w loop dodam odnośnik do tego czyli pilot();

Jak dam while przed setup to błąd wyskakuje.

Chyba, że masz na myśli aby dać zamiast if - while w pętli loop?

Znalazłem stronkę opisującą warunki wykonywania czynności w Arduino IDE po polsku, próbowałem z tego coś pozmieniać, ale mi ciągle nie wychodziło. Może Tobie pomoże? tutaj link: http://www.plociennik.info/index.php/st ... aniem-kodu



Ostatnio edytowano 13 maja 2014, o 17:41 przez daniel89, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 17:40 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Zastanawiają mnie te pętle for jeszcze bo one wykonają się wszystkie po kolei bez sprawdzania warunku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 17:47 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

A te pętle for nie są ustawione pod warunkiem if (distance < 10) ?

Może jakieś przerwanie do tego trzeba ?

No i ta funkcja pilot() powinna chyba inaczej wyglądać , nie sądzisz ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 17:53 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

A zmień w tej pętli void pilot{ if (digitalRead(IRpin) ==LOW) while (digitalRead(IRpin)==LOW);}
bo tam jest chyba podciągnięcie do Vcc czyli cały czas jest HIGH.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 18:11 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Zmieniłem na LOW . Tam jest stan wysoki bo 5v wychodzi a jak się naciśnie przycisk to spada do 4.3v .
Niestety to też nie pomogło . Nie da się teraz wyłączyć pwm silników aby stanęły. Serwo kręci się ciągle a silniki do tyłu. Po wciśnięciu przycisku pilota oba koła jakby chciały się w dwie różne strony kręcić.

Dodam, że dodałem też break; po tych pętlach for(), lecz też nic to nie dało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 18:30 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Chcą się kręcić w dwie różne strony ponieważ tak jest w funkcji pilot(); zmieniasz stan!=stan zgadza się?
A pilot przecież mruga więc wykonuję się ta funkcja wielokrotnie aby tego uniknąć musiałbyś odebrać ramkę rc5 i odczytać bit odpowiedzialny za trzymanie guzika ( w pierwszej wysłanej ramce ma on stan 1 (jak się nie mylę) a w kolejnych 0)

------------------------ [ Dodano po: 12 minutach ]

Zmień ostatniego delay'a w void pilot() na 500 wtedy jeśli przyciśnięcie będzie krótsze niż 500ms(0,5s) to zmieni się stan tylko raz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 18:43 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

stan jest ustawiony zdefiniowany na 0, czyli jeśli odczyt z IRpinu będzie w stanie niskim (czyli będzie spadała wartość) to zmienia na przeciwny czyli wysoki i go przypisuje tak? Czyli żeby przypisać tam 0 nie trzeba stanu na przeciwny zmieniać ,dobrze to rozumiem ?

No tak z delayem masz racje bo to impulsy daje i nie zawsze łapie w tak krótkim czasie. Zmienię i zobaczymy co z tym będzie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 18:49 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Jeśli stan był 0 to po wykonaniu się stan != stan to stan będzie równy 1.
Natomiast jeśli stan będzie równy 1 to po wykonaniu stan != stan to stan będzie równy 0.

------------------------ [ Dodano po: 2 minutach ]

daniel89 napisał(a):
No tak z delayem masz racje bo to impulsy daje i nie zawsze łapie w tak krótkim czasie. Zmienię i zobaczymy co z tym będzie.


nie do końca. Jak zwiększysz delay to impulsy będą pomijane oczywiście nie dłużej niż 500ms. Jak delay jest mniejszy to częściej wykonuje się pomiar.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 18:53 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

tak zgadza się stan równy jeden z tym że nic mi to na razie nie daje, gdyż jak zmieniłem te parametry to nie chce reagować na pilota i ciągle kręci silnikami do tyłu a serwo nie zamyka pętli. Jakoś trzeba to przerwać może masz jakiś pomysł ? Bo ewidentnie program skupia się na serwie i nim kręci a nie zważa na czujnik

jak sama nazwa wskazuje delay - opóźnienie 1000 (ms) = 1 s. Im większy delay np w serwie tym wolniej się kręci.



Ostatnio edytowano 13 maja 2014, o 18:57 przez daniel89, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 18:55 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

a usunąłeś break; po każdej pętli for bo pisałeś, że dopisałeś a nie powinno ich być.

------------------------ [ Dodano po: 5 minutach ]

digitalWrite(pwmMotorA, stan);
Możesz mi wytłumaczyć co to ma robić?

jeśli działa tak jak ja myślę to bym zrobił to tak na początku void loop() if(stan==1){tutaj te 2 if'y i else} i za tym pilot();



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:02 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Tak. Wyrzuciłem wszystkie break; .

Dalej ta sama sytuacja kręci się ciągle serwo i silniki do tyłu, a pilot nie reaguje i bądź tutaj mądry.

Jak to rozgryziesz to Ci piwo stawiam ;)

Przypisanie wartości stan do PWM czyli jeśli stan niski to wyłącza a jeśli wysoki to włącza silniki tak to powinno działać bo tak mi z lampką działało. Gdy wcisnąłem guzik to się zapalała i na wyjściu był stan wysoki a jak kliknąłem jeszcze raz to wyłączało czyli było 0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:07 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Czyli stan po takiej operacji przyjmuje 255 a nie 1

------------------------ [ Dodano po: 3 minutach ]

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


podmień te funkcje



Ostatnio edytowano 13 maja 2014, o 21:28 przez gumeni, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:11 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

No tak 1 w pwm to maksimum 255 i też zależy na którym pinie bo na niektórych jak sprawdzałem to nie było pełnych 5v jakieś spadki gdzieś się pojawiały.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:13 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Zależy jaką rozdzielczość ma PWM może mieć więcej niż 8 bitów wtedy nie będzie max 255 a więcej dla 9 bit będzie 511 dla 10 bit 1023.

------------------------ [ Dodano po: 1 minucie ]

Podmieniłeś te funkcje ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:23 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Podmieniłem te funkcje .

Stanął dęba i nie reaguje na nic ani ręką jak zbliżam ani na pilota. Pilotem powinien się załączyć ale nic z tego. Sprawdzałem ile volt ma na wyjściu i gdy kliknę to z 5v zmienia się na ok. 4,5v , może to za mała różnica aby działał , na moje oko to nadal jest stan wysoki ;p

Odczytałem z pilota wartość po wciśnięciu przyciska power na pilocie i tyle wskazuje : 0x1D00B946, może to podstawić ?

Analogowe piny mają chyba 1023 jak się nie mylę



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:26 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

A możesz dać schemat podłączenia odbiornika IR do procka może za mały rezystor podciągający masz i nie daje rady przyciągnąć do zera.
Na razie nie będziemy kombinować z ramką rc5 bo powinno obejść się bez niej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:32 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Obrazek

Odbiornik IR podłączyłem na wyjściu z kondensatorów 5v i do masy w arduino. Sygnałowy jest podpięty pod 7 pin w arduino on jest bez sterowania pwm zwykły cyfrowy 8 bitowy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 19:34 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Może pogadamy przez skype lub fb bo tutaj za długo to trwa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 18:17 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 27
Pomógł: 0

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czemu w tym kodzie jak ustawię wielozadaniowość na odległość mniejszą od 10, to program wykonuje i obrót serwem i jedzie do tyłu, a jak ustawię na odległość większą od 30, aby się serwo obracało wraz z jechaniem do przodu, to serwo nie idzie tzn. wykonuje takie impulsy w bok i się cofa na 90stopni.?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO