Форум по Роботика

Контролери => Ардуино (Arduino) => Темата е започната от: importante в Май 24, 2014, 10:22:14 am

Титла: Проблем с Ultrasonic sensor HC-SR04
Публикувано от: importante в Май 24, 2014, 10:22:14 am
Здравейте!
Свързвам два сензора към ардуино платката и вкарвам ето този код:
#define trigPin1 13
#define echoPin1 12
#define led1 11
#define led2 10
#define trigPin2 9
#define echoPin2 8
#define led3 7
#define led4 6

void setup() {
  Serial.begin (9600);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
}


void loop() { //L1
long duration, distance;
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration = pulseIn(echoPin1, HIGH);
distance = (duration/2) / 29.1;
if (distance < 10) { //L2
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
} //R1
else { //L3
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);

}
{
long duration, distance;
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  duration = pulseIn(echoPin2, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 10) {
    digitalWrite(led3,HIGH);
  digitalWrite(led4,HIGH);
}
  else
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
 
  }
  delay(500);
}

Обаче ардуино, когато няма нищо пред сензорите на по-далечно разстояние подава високо ниво на пиновете. Демек на затворено пространство сензорите реагират добре, но щом ги изкарам на вън пиновете са на постоянно високо ниво, докато не сложа нещо пред сензора (на примерно 2метра), тогава вече ардуино работи по програмата, задава високо ниво при 10 см. Как да поправя този проблем?
Титла: Re: Проблем с Ultrasonic sensor HC-SR04
Публикувано от: mivr в Май 29, 2014, 09:47:06 pm
Здравей,

Прочитайки документацията на сензора забелязах че сензора изпраща сигнал обратно само ако е получил сигнал което води до грешно отчитане от функцията pulseIn която връща 0 ако не засече импулс в рамките на зададеното време, ако не е зададено се използва 1 секунда. Препоръката ми е да зададеш граница на функцията и да филтрираш варианта с отговор 0 от pulseIn.

Източниците ми са:
Документацията на Ардуино езикът, функция pulseIn(): http://arduino.cc/en/Reference/pulseIn
Документация на сензора: http://www.micropik.com/PDF/HCSR04.pdf

Поздрави,
Михаил Врачански