LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[ARDUINO] Oko Cyklopa – ultradźwiękowy „radar” do lokalizacji obiektów

odpowiedź. Następnie przekazujemy wynik pomiaru poprzez port szeregowy (listing 2).

 

List. 2. Kod obliczający odległość do obiektu i wysyłający dane szeregowo przez RS232

int TX1 = 10;
int RX1 = 11; 
long TIME1;

void setup()
{
  pinMode(TX1, OUTPUT);
  pinMode(RX1, INPUT);
  Serial.begin(9600);
}

void loop()
{
  digitalWrite(TX1, HIGH);
  delayMicroseconds(10);
  digitalWrite(TX1, LOW);
  TIME1 = pulseIn(RX1, HIGH);
  Serial.print("  Czujnik 1: ");
  Serial.println(TIME1/58);
}

W programie z listingu 2 wykorzystano funkcję:

pulseIn(port , oczekiwany_stan)

Funkcja ta zwraca wartość wyrażoną w jednostce czasu informującą o osiągnięciu na danym porcie oczekiwanego stanu logicznego. W powyższym programie po wysłaniu impulsu oczekujemy na pojawienie się na linii 11 wysokiego poziomu napięcia. Otrzymany wynik poprzedzony odpowiednią adnotacją wysyłamy do komputera.

Po zakończeniu testów czujnika przechodzimy do kolejnego etapu, jakim jest jednoczesne uruchomienie trzech czujników oraz określenie, który czujnik znajduje się najbliżej przeszkody. Do wykonania tego zadania warto skorzystać schemat z rysunku 2. Zgodnie z tym schematem czujniki zostały dołączone następująco:

  • Czujnik 1: nadajnik – linia 10, odbiornik – linia 11,
  • Czujnik 2: nadajnik – linia 12, odbiornik – linia 13,
  • Czujnik 3: nadajnik – linia 6, odbiornik – linia 7,
  • Zasilanie oraz masa zostały dołączone równolegle.

Rys. 2. Schemat dołączenia 3 czujników ultradźwiękowych do Arduino Leonardo

Po odpowiednim połączeniu elementów urządzenia kolejnym celem będzie oprogramowanie tego układu. Do tego powielimy kod z listingu 2 odpowiednio konfigurując porty. Wynik tej operacji znajduje się na listingu 3.

 

List. 3. Kod obliczający odległość do obiektu zmierzoną przez trzy czujniki ultradźwiękowe

int TX1 = 10; //port nadajnik Ultrasonic
int RX1 = 11; //port odbiornik Ultrasonic
int TX2 = 12; //port nadajnik Ultrasonic
int RX2 = 13; //port odbiornik Ultrasonic
int TX3 = 6; //port nadajnik Ultrasonic
int RX3 = 7; //port odbiornik Ultrasonic


int CM;     //odległość w cm
long TIME1,TIME2,TIME3;  //długość powrotnego impulsu w uS



void setup()
{
  pinMode(TX1, OUTPUT);
  pinMode(RX1, INPUT);
  pinMode(TX2, OUTPUT);
  pinMode(RX2, INPUT);
  pinMode(TX3, OUTPUT);
  pinMode(RX3, INPUT);
  Serial.begin(9600);
}
 
void loop()
{
  pomiar_odleglosci();
  // szerokość odbitego impulsu w uS podzielone przez
  // 58 to odleglosc w cm - patrz dokumentacja
  Serial.print("  Czujnik 1: ");
  Serial.print(TIME1/58);
  Serial.print("  Czujnik 2: ");  
  Serial.print(TIME2/58);
  Serial.print("  Czujnik 3: ");  
  Serial.println(TIME3/58);
  delay(100);
}

void pomiar_odleglosci ()
{
  // impuls 10 uS inicjalizujacy - patrz dokumentacja
  digitalWrite(TX1, HIGH);
  delayMicroseconds(10);
  digitalWrite(TX1, LOW);
  TIME1 = pulseIn(RX1, HIGH);
  digitalWrite(TX2, HIGH);
  delayMicroseconds(10);
  digitalWrite(TX2, LOW);
  TIME2 = pulseIn(RX2, HIGH);
  digitalWrite(TX3, HIGH);
  delayMicroseconds(10);
  digitalWrite(TX3, LOW);
  TIME3 = pulseIn(RX3, HIGH);
}

Aby określić położenie obiektu, będziemy musieli wyznaczyć wartość minimalną wskazania czujników. Do tego celu posłuży algorytm przedstawiony na rysunku 3. Jego implementacja w języku C jest pokazana na listingu 4.

 

Rys. 3. Algorytm sortowania wartości odczytanych przez czujniki