Wątek przeniesiony 2018-12-03 19:10 z Newbie przez furious programming.

Problem z czujnikiem odległości - Arduino RedBot

0

Witam. Posiadam od niedawna Arduino RedBot wraz z czujnikiem odległości LV-MaxSonar-EZ, akcelerometrem, buzzerem (póki co nie wykorzystuje) i line followerem (którego raczej nie wykorzystam). Chcę stworzyć robota, który po puknięciu w obudowę uruchamia się (i to już działa) i jedzie prosto (też działa), a po wykryciu przeszkody w odległości Xcm od siebie to wycofa i skręci w prawo. Jest wiele poradników do Arduino Uno z wykorzystaniem wyjścia analogowego, lecz do RedBota już nie, oraz z wykorzystaniem tanich i najbardziej popularnych czujek odległości HC-SR04. Próbowałem pracować w oparciu na inne przykładowe kody, ale kod obiektu czujnika nie potrafię stworzyć :( Wykorzystuję w czujniku wyjście PW impulsowe, może łatwiej to zrobić z wyjściem analogowym? Proszę o pomoc, zamieszczam mój "kod" poniżej. Czujnik wpięty do pinu A0. Korzystam z gotowych bibliotek. Pozdrawiam.```

#include <RedBot.h>
#include <RedBotSoftwareSerial.h>
#define ledPin 13

RedBotAccel accel;       // obiekt obsługujący akcelerometr
RedBotMotors motors; 
long CZAS;
int CM; 

void setup()
{
  Serial.begin(9600);
  // konfiguracja pinu diody LED
  pinMode(ledPin, OUTPUT);
  // gaszę diodę
  digitalWrite(ledPin, LOW);
  // uruchomienie i konfiguracja detekcji puknięc
  accel.enableBump();
  accel.setBumpThresh(50);
  pinMode(0, OUTPUT); //LV-MaxSonar
}

void pomiar_odleglosci ()
{
  digitalWrite(0, HIGH);       //ustawienie stanu wysokiego na 10 us - impuls inicjalizujacy
  delayMicroseconds(10);
  digitalWrite(0, LOW);
  CM = 100;  
}    
void loop()
{
  pomiar_odleglosci();              //pomiar odległości
  Serial.print("Odleglosc: ");      //wyświetlanie wyników
  Serial.print(CM);
  Serial.println(" cm");

  if(CM>17)                  //jesli odległość od przeszkody będzie większa od 17cm to:
 {
  motors.drive(100);         //jedź prosto
 }
 else 
 {
  motors.drive(-100);        //cofaj przez 0,4s                         
  delay(400);
  motors.stop();
                             
  motors.rightMotor(100);    //następnie skręcaj przez 0,7s
  delay(700);
  motors.stop();
                        
  motors.drive(100);         //i znowu jedź prosto
 }
  
}
0

Patrząc na dokumentację czujnika, którą znalazłem myślę, że jeśli ciężko Ci znaleźć gotowe rozwiązania do obsługi tego czujnika to chyba najlepiej wykorzystać do tego interfejs USART. Rozwiązanie podobne do tego, które widzę u Ciebie w kodzie (mam na myśli ustawianie pinu na stan wysoki, pomiar...), jednak wydaje się być dość wygodne.
Najlepiej byłoby napisać jakąś ładną osobną klasę, która zawierałaby metody inicjalizujące, wykonujące pomiar, konwertujące otrzymany wynik (widzę, że wynik otrzymujemy w postaci Rppp gdzie p to znak z pomiarem).
Potem tworzysz obiekt takiej klasy i działasz na nim jak tylko potrzebujesz. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1