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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 21 maja 2025, o 17:41


    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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 0 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO