Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
Drukarki XYZprinting!

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

Autor Wiadomość
Robur 



Posty: 6
Otrzymał 1 piw(a)
Wysłany: 17-04-2017, 11:03   

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:
Kod programu: Zaznacz cały

 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
Polecany artykuł z FORBOT.PL:
Systemy kontroli wersji

Jeżeli kiedykolwiek pracowałeś nad większym projektem, na pewno: Bałeś się przystępować do większych zmian żeb... Czytaj całość


Ostatnio zmieniony przez Robur 17-04-2017, 18:51, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7605
Pomógł: 114 razy
Otrzymał 492 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 18-04-2017, 16:10   

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:
Cytat:
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!
Robur napisał/a:
Czy dodaliście taki widok ręcznie?

Tak rysowaliśmy biblioteki samodzielnie.
Robur napisał/a:
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


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
mcklaklen 



Posty: 4
Wysłany: 18-04-2017, 18:13   

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?


Kod programu: Zaznacz cały
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
   
 }
}
 

Ostatnio zmieniony przez mcklaklen 18-04-2017, 18:13, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7605
Pomógł: 114 razy
Otrzymał 492 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 18-04-2017, 18:31   

mcklaklen napisał/a:
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:

Kod programu: Zaznacz cały
[...]
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 :) ?


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
mcklaklen 



Posty: 4
Wysłany: 18-04-2017, 20:44   

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.

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7605
Pomógł: 114 razy
Otrzymał 492 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 19-04-2017, 12:00   

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.


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
mcklaklen 



Posty: 4
Wysłany: 19-04-2017, 15:14   

teraz rozumiem gdzie leży błąd, dziękuje bardzo za odpowiedź.

Ostatnio zmieniony przez mcklaklen 19-04-2017, 15:14, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
kudlaty321 



Posty: 3
Wysłany: 12-05-2017, 08:42   

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

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 3991
Pomógł: 429 razy
Otrzymał 578 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 12-05-2017, 09:12   

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?

Postaw piwo autorowi tego posta
 
 
kudlaty321 



Posty: 3
Wysłany: 13-05-2017, 18:36   

Po powrocie na zasilanie USB wszystko wraca do normy. Zaświeciło mi, że jest to problem z zasilaniem, jednak nie wiem jak go rozwiązać, stąd moje pytanie. Zasilanie przez vin z 4 baterii 1,5V. Sterowanie silnikami (https://botland.com.pl/kola-dagu/3696-kolo-silnik-65x26mm-5v-z-przekladnia-481.html) mostek L293D.

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 3991
Pomógł: 429 razy
Otrzymał 578 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 14-05-2017, 00:32   

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.

Postaw piwo autorowi tego posta
 
 
kudlaty321 



Posty: 3
Wysłany: 16-05-2017, 08:48   

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.

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 3991
Pomógł: 429 razy
Otrzymał 578 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 16-05-2017, 09:12   

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.

Postaw piwo autorowi tego posta
 
 
artoroPL 



Posty: 2
Skąd: Rybnik
Wysłany: 20-07-2017, 20:29   

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?

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7605
Pomógł: 114 razy
Otrzymał 492 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 20-07-2017, 20:51   

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 :)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Kurs STM32 - #4 - St... Kurs STM32 - #5 - Ko... Kurs STM32 - #1 - Za... Kurs STM32 - #3 - Pł...
lub przeszukaj forum po wybranych tagach: artykuly, elektronika, majsterkowanie, robotyka, wiadomosci


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki