Skocz do zawartości

Regulowanie dystansu załączania pinu wyjścia arduino+ HC-SR04


omce90

Pomocna odpowiedź

Witam 

Do kodu który zamieszczam:

int Trig = 2;   // Numer pinu wyzwolenia
int Echo = 3;   // Numer pinu odpowiedzi
int Lewo = 4;    // Numer pinu - skretu w Lewo
int Prawo = 5;  // Numer Pinu - skretu w Prawo
 
long EchoTime;  // Czas trwania sygnału ECHO
int  Distance;  // Odległość w centymetrach
int  MaximumRange = 200; // Maksymalna odległość
int  MinimumRange = 2;   // Minimalna odległość
 
void setup()
{
  // Inicjalizacja portu szeregowego
  Serial.begin(9600);
 
  // Konfiguracja pinów
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  pinMode(Lewo, OUTPUT);
  pinMode(Prawo, OUTPUT);
 
}
 
void loop()
{
  // Ustawiamy TRIG w stan niski na 2us
  digitalWrite(Trig, LOW);
  delayMicroseconds(2);
 
  // Ustawiamy TRIG w stan wysoki na 10us
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
 
  // Ustawiamy TRIG w stan niski - rozpoczynamy pomiar
  digitalWrite(Trig, LOW);
 
  // Odczytujamy czas trwania stanu wysokiego na pinie ECHO
  EchoTime = pulseIn(Echo, HIGH);
 
  // Obliczamy odległość
  Distance = EchoTime / 58;
 
  // Sprawdzamy zakres pomiarowy
  if (Distance >= MaximumRange || Distance <= MinimumRange)
  {
    Serial.println("Poza zakresem");  
  } else  
  {
    // Jeśli poniżej 50cm skret w Lewo---> tę warto
    // Jeśli równy 60cm nie rób nic
    // Jeśli powyżej 70cm skręt w Prawo
    if (Distance < 50)
    {
      digitalWrite(Lewo, HIGH);      
      digitalWrite(Prawo, LOW);
    } else
    {
    if (Distance = 60)
    {
      digitalWrite(Lewo, LOW);      
      digitalWrite(Prawo, LOW);
    }  else
    {
    if (Distance > 70)
    {
      digitalWrite(Lewo, LOW);      
      digitalWrite(Prawo, HIGH);
    }       
      
    Serial.print("Odleglosc: ");
    Serial.println(Distance);
  }
 
  // Opóźnienie kolejnego pomiaru
  delay(100);
}
}
}

 chciał bym dodać potencjometr który regulował by odległość  załączania  skrętów .

Jezeli by ktoś mógł podsunąć pomysł jak zmodyfikować kod by dodać ten potencjometr bym był bardzo wdzieczny.

 {
    // Jeśli poniżej X cm skret w Lewo---> tę wartość X cm chciał bym regulować 
    // Jeśli równy X+10 cm nie rób nic ----> 
    // Jeśli powyżej X+20 cm skręt w Prawo
    if (Distance < X)
    {
      digitalWrite(Lewo, HIGH);      
      digitalWrite(Prawo, LOW);
    } else
    {
    if (Distance = X+10)
    {
      digitalWrite(Lewo, LOW);      
      digitalWrite(Prawo, LOW);
    }  else
    {
    if (Distance > X+20)
    {
      digitalWrite(Lewo, LOW);      
      digitalWrite(Prawo, HIGH);
    }       
      

 

Link do komentarza
Share on other sites

@omce90 Zaglądnij tutaj https://forbot.pl/blog/kurs-arduino-pomiar-napiecia-przetwornik-adc-id3819 powinno pomóc, jeśli nie to pytaj dalej.

Ponadto proponuję abyś włączył w kompilatorze maksymalny poziom ostrzeżeń, a unikniesz takich kwiatków jak w okolicy linii 57:

if (Distance = 60) { instrukcja;}

Jest to poprawna instrukcja polecająca podstawienie do zmiennej Distance wartości 60 i jeśli nowa wartość Distance jest różna od zera, to wykonanie instrukcji umieszczonej w nawiasach klamrowych, czyli instrukcja ta wykonywana jest zawsze. Domyślam się, że chodziło Ci  o

if (Distance == 60) { instrukcja;}

czyli porównanie Distance z 60 i jeśli równe to wykonywanie instrukcji. To częsty przypadek spowodowany dosyć nieszczęśliwym zestawem operatorów języka C i pochodnych. Jest to tak częste, że większość kompilatorów wysyła ostrzeżenie - nie zgłasza błędu bo instrukcja jest poprawna.  Arduino IDE wyświetla ostrzeżenie:

57:23: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

"Sugerujemy użycie nawiasów wokół instrukcji podstawienia użytej jako wartość PRAWDA"

Edytowano przez bjrk
Link do komentarza
Share on other sites

Rozwiązałem to tak:

co o tym myślicie?

int Trig = 2;   // Numer pinu wyzwolenia
int Echo = 3;   // Numer pinu odpowiedzi
int Lewo = 4;    // Numer pinu - skretu w Lewo
int Prawo = 5;  // Numer Pinu - skretu w Prawo
int odczytanaWartosc1 = 0; //Zmienna do przechowywania odczytu ADC (PIN A0)
int odczytanaWartosc2 = 0; //Zmienna do przechowywania odczytu ADC (PIN A1)
int czujniklewy = 6;
int czujnikprawy = 7;
int led = 8;   //sygnalizacja maksymalnej odleglosci
int led1 = 9;   //sygnalizacjia minimalnej odleglosci

long EchoTime;  // Czas trwania sygnału ECHO
int  Distance;  // Odległość w centymetrach
int  MaximumRange = 200; // Maksymalna odległość
int  MinimumRange = 10;   // Minimalna odległość
 
void setup()
{
  // Inicjalizacja portu szeregowego
  Serial.begin(9600);
 
  // Konfiguracja pinów
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  pinMode(Lewo, OUTPUT);
  pinMode(Prawo, OUTPUT);
  pinMode(czujniklewy, INPUT);
  pinMode(czujnikprawy, INPUT);  
}
 
void loop()
{
  odczytanaWartosc1 = analogRead(A0);//Odczytanie wartości z ADC   
  odczytanaWartosc1 = map(odczytanaWartosc1, 0, 1023, 30, 200);//Przeskalowanie wartości
  odczytanaWartosc2 = analogRead(A1);//Odczytanie wartości z ADC   
  odczytanaWartosc2 = map(odczytanaWartosc2, 0, 1023, 5, 100);//Przeskalowanie wartości

 // Ustawiamy TRIG w stan niski na 2us
  digitalWrite(Trig, LOW);
  delayMicroseconds(2);
 
  // Ustawiamy TRIG w stan wysoki na 10us
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
 
  // Ustawiamy TRIG w stan niski - rozpoczynamy pomiar
  digitalWrite(Trig, LOW);
 
  // Odczytujamy czas trwania stanu wysokiego na pinie ECHO
  EchoTime = pulseIn(Echo, HIGH);
 
  // Obliczamy odległość
  Distance = EchoTime / 58;
 
  // Sprawdzamy zakres pomiarowy
  if (Distance >= MaximumRange)
  {
    digitalWrite(led , HIGH);
    digitalWrite(Lewo, HIGH);      
    digitalWrite(Prawo, LOW);
    
    }
    {
      if (Distance >= MinimumRange)
      {
    digitalWrite(led1 , HIGH);
    digitalWrite(Lewo, LOW);      
    digitalWrite(Prawo, HIGH);
      }
     
    
    
  {
    // Jeśli poniżej "odczytanawartosc1" załącz skret w Lewo
    // Jesli "czujniklewy" wartosc HIGH rozłącz skret w Lewo
    // Jeśli równy "odczytanawartosc1" rozłącz skręt w Lewo
    // Jeśli powyżej "odczytanawartosc1" + "odczytanawartosc2" skręt w Prawo
    // Jeśli "czujnikprawy" HIGH rozłącz skręt w Prawo
    
    if (Distance < odczytanaWartosc1)
    {
      digitalWrite(Lewo, LOW) ;     
      digitalWrite(Prawo, HIGH);
      
      delay(500);
     
    } 
    {
    if (czujniklewy==HIGH)    //Jesli czunik max skretu w lewo jest załaczony rozłacz układ
                                           
    
    digitalWrite(Lewo, HIGH);      
    digitalWrite(Prawo, HIGH);
    }
    {
    if (Distance == odczytanaWartosc1)
    
    {
      digitalWrite(Lewo, HIGH);      
      digitalWrite(Prawo, HIGH);
      
      delay(1500);
    }  
    {
    if (Distance > odczytanaWartosc1 + odczytanaWartosc2 )
    {
      digitalWrite(Lewo, HIGH);      
      digitalWrite(Prawo, LOW);

      delay(150);
      
    }       
    {
      if(czujnikprawy==HIGH)    //Jesli czunik max skretu w prawo jest załaczony rozłacz układ
      
      digitalWrite(Lewo, HIGH);      
      digitalWrite(Prawo, HIGH);
      
      }
    Serial.print("Odleglosc: ");
    Serial.println(Distance);
  }
 
  // Opóźnienie kolejnego pomiaru
  delay(100);
}
}
}
}

 

Link do komentarza
Share on other sites

@omce90

Jeśli działa tak jak chciałeś to znaczy że kod dobry. 🙂
Mam dwie propozycje:
   1 . Wyświetl w powyższym poście kod jako kod, tak jak zrobiłeś to w pierwszym.
   2. Jeśli używasz Arduino IDE, to sformatuj sobie kod i zobacz jak układają się pary nawiasów. Na moje wyczucie, na końcu powinny być jedynie dwa nawiasy klamrowe, jeden zamykający główną pętlę, a drugi od ostatniego ifa.

Wydaje mi się, że masz w kodzie niepotrzebne pary nawiasów.

Często używasz pary instrukcji

          digitalWrite(Lewo, x);
          digitalWrite(Prawo, y);

Raz jest to LOW, HIGH,  innym razem HIGH, LOW lub HIGH, HIGH jaka jest tego rola?. Spróbuj proszę opisać algorytm. Na przykład w tym stylu, (lub lepszym):

Sprawdzam odległość od przeszkody.
Jeśli brak przeszkody lub przeszkoda w odległości większej od X,  jadę prosto: oba silniki włączone.
Jeśli przeszkoda w odległości mniejszej od Y a większej od Z skręcam w prawo: hamowanie lewym silnikiem.
Jeśli przeszkoda ...

Wtedy inni łatwiej zrozumieją co chcesz osiągnąć a i ty sam będziesz miał ułatwione zadanie przy kodowaniu.

Ja na przykład nie rozumiem co chcesz osiągnąć na poszczególnych etapach.

Pozdrawiam i Wszystkiego Najlepszego W nowym Roku!

          Bogusław

 

Edytowano przez bjrk
Zrobiłem palcówkę i "uciekł" mi tekst.
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

@omce90 kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku 😉

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.