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

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

Autor Wiadomość
Robur 



Posty: 3
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:
Sterowanie silników skokowych

W odróżnieniu od klasycznych silników prądu stałego, w których do wymuszenia obrotu wirnika wystarczy podanie ... 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: 7429
Pomógł: 113 razy
Otrzymał 487 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 elektronikiKurs STM32
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: 7429
Pomógł: 113 razy
Otrzymał 487 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 elektronikiKurs STM32
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: 7429
Pomógł: 113 razy
Otrzymał 487 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 elektronikiKurs STM32
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
 
 
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