Skocz do zawartości

Kurs Arduino - #9 - Czujnik odległości HC-SR04, funkcje


Komentator

Pomocna odpowiedź

Cześć,
To mój pierwszy post na forum, witam wszystkich serdecznie i światecznie. Jestem w trakcie kurs, w tej chwili w dziewiątej lekcji z pierwszej części bawię się z czujnikiem odległości.

Mam dwa pytania:

1. Próbowałem narysować swój schemat we Frizingu, jednak znalazłem jedynie HC-SR04 w wersji „z przodu”. Na waszym schemacie jest wersja „z góry”. Gdzie ją znaleźć? Czy dodaliście taki widok ręcznie? Poniżej widok mojego schematu. W stosunku do rzeczywistości łączenia Echo i Trig są skrzyżowane.

2. W jaki sposób wydrukować na terminalu w jednej wersji kilka wartości. Używam tego do monitorowania wartości podczas działania programu. Chodzi mi o komendę podobna do printf. Nie udało mi się znaleźć podobnej komendy.

W tej chwili robię to w sposób następujący:

Serial.print("Czas: ");           	//wydruk testowy
 Serial.print(EchoTime);
 Serial.print("  Odległość: ");
 Serial.print(Distance);
 Serial.print("  Odleglosc mapowana: ");
 Serial.println(DistanceConv);	//koniec wydruku testowego

Dzięki za odpowiedzi

Link do komentarza
Share on other sites

mcklaklen, witam na forum 🙂 Zaraz zobaczymy, co da się zrobić tylko skupmy się proszę na jednym programie, bo już się pogubiłem. Piszesz przykładowo:

Zastanawia mnie fakt dlaczego w pierwszym kodzie dioda mruga tylko wtedy gdy trzymam guzik. Dla "for" kod mi nie działał, dopiero gdy zatrzymałem w while działa.

A tymczasem w pierwszym programie nie widzę "for", ani "while". Postaraj się opisać problem raz jeszcze (i nie wszystko na raz), to pójdziemy dalej 😉

Robur, również witam na forum!

Czy dodaliście taki widok ręcznie?

Tak rysowaliśmy biblioteki samodzielnie.

W jaki sposób wydrukować na terminalu w jednej wersji kilka wartości. Używam tego do monitorowania wartości podczas działania programu.

Rozumiem, że chodzi o "w jednej linii". Najprościej i najszybciej robić to właśnie tak, jak robisz to teraz. Ewentualnie można pokusić się o wstawianie tabulatorów (zamiast spacji) poprzez wpisanie "\t". Jeśli chcesz zdziałać więcej w tym zakresie, to ten dokument powinien Cie zainteresować: http://playground.arduino.cc/Main/Printf

Link do komentarza
Share on other sites

ok dość chaotycznie to opisałem.

Chodzi mi o to że chciałem napisać program który działa dopiero po wciśnięciu guzika i wykorzystuje pwm do kilku "przebłyśnięć"

Tylko że ten program nie działa. Działa tak ,że muszę trzymać guzik i chodzi (ciągle ) ,ale tylko do momentu aż puszczę guzik, potem zatrzymuje się na pewnej wartości.

Drugi program ten co tam wcześniej podałem na forum (na drugiej pozycji) musiałem trochę pokombinować aby zablokować to w pętli while (co prawda program działa dobrze ,ale wydaje mi się bardzo przekombinowany), ten podany niżej to ten co nie działa w sumie nie wiem dlaczego.

czy jest jakoś prostszy sposób na napisane tego programu?

int pwm;
int zmiana = 5;

void setup() {
 pinMode(5, INPUT_PULLUP); // przypisanie pinu 5 na guzik  
 pinMode(11, OUTPUT);    //wyście LED
}

void loop() {

if(digitalRead(5) == LOW){    //po nacisnieciu guzika...
 for(int i =0; i <5; i++){
 funkcjaLED();  
   }  
 }  
}
void funkcjaLED(){
 analogWrite(11,pwm); //przypisanie wwjscia sygnalu pwm
 pwm += zmiana; 
 delay(10);

 if(pwm == 255 || pwm ==0){
   zmiana = 0-zmiana; //zmiana znaku na przeciwny jezeli osiagnie próg 0 lub 255

} 
}
Link do komentarza
Share on other sites

Tylko że ten program nie działa. Działa tak ,że muszę trzymać guzik i chodzi (ciągle ) ,ale tylko do momentu aż puszczę guzik, potem zatrzymuje się na pewnej wartości.

Czyli rozumiem, że chciałbyś, aby program po włączeniu zasilania nic nie robił, a dopiero po wciśnięciu przycisku zaczął wykonywać swoje zadania. Inaczej mówiąc, program chcesz wstrzymać tylko raz na samym początku. To, co ma być wykonane tylko raz umieszczamy w pętli setup. Więc wystarczy dodać tam pustą pętlę while, która będzie "nic robiła", do czasu wciśnięcia przycisku:

[...]
void setup() { 
 pinMode(5, INPUT_PULLUP);
 pinMode(11, OUTPUT);   

 while(digitalRead(5) != LOW) { //Do momentu, gdy przycisk nie jest wciśnięty
 //Nic nie rób
 }
} 
[...]

Czy to rozwiązuje Twój problem 🙂?

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

nie do końca o to mi chodzi... Chciałbym, aby dioda po wciśnięciu guzika wykonała załóżmy 5 cykli mrugania (1 cykl pwm od 0 do 255 i 255 do 0 z pewnym opóźnieniem), wyłączyła się po tym i oczekiwała na kolejne naduszenie.

Link do komentarza
Share on other sites

mcklaklen, to w takim razie przeanalizuj co robi funkcja funkcjaLED().

W tej chwili wywołujesz ją po wciśnięciu tylko 5 razy. Jedno wywołanie tej funkcji wcale nie oznacza jednego mignięcia diody, tylko jedną zmianę jej jasności. W związku z tym, po każdym wciśnięciu przycisku dioda będzie świeciła jaśniej o 5*(wartość zmiennej "zmiana") = 5 * 5 = 25 jednostek. Aby to mogło działać, musisz dodać w funkcji funkcjaLED() pętlę (najlepiej for), która spowoduje, że jednokrotne wywołanie funkcji będzie powodowało mignięcie diody.

Link do komentarza
Share on other sites

Witam, jestem nowy na forum.

Postanowiłem zrobić robota (jakich wiele na forum), który będzie mierzył odległość i wybierał kierunek jazdy bez przeszkód. Robot działa poprawnie gdy zasilany jest przez kabel USB. W przypadku zasilania z baterii robot działa błędnie. Robot sprawdza odległość, odwraca się i znowu sprawdza odległość i tak w kółko. Na forum znalazłem informację, że powodem takiego stanu rzeczy może być uszkodzona płytka arduino. Po zmianie na nową problem dalej występuje. Spotkaliście się może z tym, albo znacie rozwiązanie problemu ?

Pozdrawiam Maciek

Link do komentarza
Share on other sites

Witamy.

Jeśli jedyną zmianą jest sposób zasilania, to może tam byś poszukał? Czy powrót do zasilania z USB przywraca poprawną pracę? I nic nie zaświtało? Z jakiej baterii to napędzasz? Przez pin Vin? Jakie masz silniki, jaki mostek, może coś więcej o konstrukcji?

Link do komentarza
Share on other sites

Nie wiesz jak go rozwiązać? To proponuję wrócić do źródeł i przeczytać np. to:

https://www.arduino.cc/en/Products/Compare

Co tam piszą o Vin? Dla ułatwienia: kolumna Operating/Input Voltage. Możesz przytoczyć zakres zasilania dla swojej płytki?

A jeszcze napisz skąd bierzesz napięcie zasilania mostka silnikowego i czy mierzyłeś napięcie swojej baterii w czasie pracy i kłopotów. Bo wiesz, 1.5V to tylko napis na opakowaniu.

Link do komentarza
Share on other sites

Dziękuję za odpowiedz i zainteresowanie tematem. Operating/Input

Voltage dla mojej płytki to 5/7-12V. Mój zestaw zasilający daje 5,6V, więc problem zapewne z niedostatecznym napięciem. Jeśli chodzi o zasilanie mostka to logika z arduino - 5V,a zasilanie silników z zestawu baterii.

Link do komentarza
Share on other sites

Brawo. Napis "5/7-12V" oznacza, że wewnętrzne napięcie zasilania procesora wynosi 5V a z zewnątrz płytka potrzebuje 7 do 12V. Tak, 4 baterie "1.5V" nie mają szans w sposób pewny napędzić Arduino z Vin. Czasem zadziała a czasem nie, wszystko zależy od egzemplarza stabilizatora i poboru prądu - bo wraz z nim zmienia się napięcie baterii. Ekonomicznie znaczniej bardziej rozsądne jest używanie akumulatorków, ale te mają jeszcze niższe napięcie. Wtedy koszyczek na 6 sztuk to absolutne minimum a dopiero komplet 8xNiMH zapewnia odpowiednie przewyższenie i wcelowanie w wymagania płytki w każdym stanie naładowania ogniw.

Link do komentarza
Share on other sites

Witam, mam problem z czujnikiem odległości - wszystko zrobiłem według instrukcji w kursie, ale czujnik wyświetlał praktycznie losowe wartości, co trochę mnie zniechęciło do niego. Próbowałem różnie ustawiać czujnik, kierować na różne powierzchnie z różnych odległości, ale nie zauważyłem żadnej prawidłowości. Czasami pojawiały się po prostu ciągi zer. Po dwóch tygodniach postanowiłem wrócić do tego elementu, ale tym razem uzyskuję już tylko same zera.

Wydaje mi się, że jest to wina czujnika, bo Arduino przy innych elementach zachowuje się prawidłowo. Macie jakieś pomysł, co mógłbym zrobić? Jak zbadać, gdzie pojawia się błąd?

Link do komentarza
Share on other sites

artoroPL, witam na forum! Upewnij się, że wszystkie połączenia siedzą mocno w płytce stykowej. Może coś nie styka czasami? Wstaw też zdjęcie układu - będzie łatwiej znaleźć ewentualny błąd 🙂

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.