скачут показания УЗ дальномера

romiras
Offline
Зарегистрирован: 12.07.2015

Есть код самодельного парктроника из УЗ дальномера и активной пьезы.  

Почему то прыгают показания дальномера.

данные с посл. монитора:

(УЗ направлен на стену)

MS: 5536, CM: 100.21, IN: 39.45
MS: 7138, CM: 129.20, IN: 50.87
MS: 6620, CM: 119.83, IN: 47.18
MS: 5363, CM: 97.07, IN: 38.22
MS: 2914, CM: 52.75, IN: 20.77
MS: 2968, CM: 53.72, IN: 21.15
MS: 2956, CM: 53.51, IN: 21.07
MS: 5477, CM: 99.14, IN: 39.03
MS: 5528, CM: 100.06, IN: 39.39
MS: 5510, CM: 99.73, IN: 39.27
MS: 9527, CM: 172.44, IN: 67.89
MS: 6673, CM: 120.79, IN: 47.55
MS: 5437, CM: 98.41, IN: 38.75
MS: 5504, CM: 99.63, IN: 39.22
MS: 5486, CM: 99.30, IN: 39.09
MS: 5512, CM: 99.77, IN: 39.28
MS: 5485, CM: 99.28, IN: 39.09
MS: 5512, CM: 99.77, IN: 39.28
MS: 5461, CM: 98.85, IN: 38.92
MS: 5488, CM: 99.34, IN: 39.11
MS: 5537, CM: 100.22, IN: 39.46
MS: 5528, CM: 100.06, IN: 39.39
MS: 5512, CM: 99.77, IN: 39.28
MS: 5485, CM: 99.28, IN: 39.09
MS: 5486, CM: 99.30, IN: 39.09
MS: 5479, CM: 99.17, IN: 39.04
MS: 7313, CM: 132.37, IN: 52.11
MS: 5441, CM: 98.49, IN: 38.77
MS: 9547, CM: 172.81, IN: 68.03
MS: 5372, CM: 97.24, IN: 38.28
MS: 5510, CM: 99.73, IN: 39.27
MS: 9629, CM: 174.29, IN: 68.62
MS: 6388, CM: 115.63, IN: 45.52
MS: 1516, CM: 27.44, IN: 10.80
MS: 6632, CM: 120.04, IN: 47.26
MS: 5348, CM: 96.80, IN: 38.11
MS: 5485, CM: 99.28, IN: 39.09
 

 

скетч:


#include <Ultrasonic.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     13
#define led 10

Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

void setup()
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop()
{
  float cmMsec, inMsec;
  long microsec = ultrasonic.timing();

  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
  inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
  Serial.print("MS: ");
  Serial.print(microsec);
  Serial.print(", CM: ");
  Serial.print(cmMsec);
  Serial.print(", IN: ");
  Serial.println(inMsec);

  if ((cmMsec) < 10 && (cmMsec) > 0)  {
    digitalWrite(led, HIGH);  delay(50);
    digitalWrite(led, LOW);
    delay(50);
  }
  if ((cmMsec) < 20 && (cmMsec) > 10)  {
    digitalWrite(led, HIGH); delay(130);
    digitalWrite(led, LOW);
    delay(130);
  }
  if ((cmMsec) < 30 && (cmMsec) > 20)  {
    digitalWrite(led, HIGH);  delay(210);
    digitalWrite(led, LOW);
    delay(210);
  }
  if ((cmMsec) < 40 && (cmMsec) > 30)  {
    digitalWrite(led, HIGH);  delay(290);
    digitalWrite(led, LOW);
    delay(290);
  }
  if ((cmMsec) < 50 && (cmMsec) > 40)  {
    digitalWrite(led, HIGH);  delay(370);
    digitalWrite(led, LOW);
    delay(370);
  }
  if ((cmMsec) < 60 && (cmMsec) > 50)  {
    digitalWrite(led, HIGH);  delay(450);
    digitalWrite(led, LOW);
    delay(450);
  }
  if ((cmMsec) < 70 && (cmMsec) > 60)  {
    digitalWrite(led, HIGH);  delay(530);
    digitalWrite(led, LOW);
    delay(530);
  }
  if ((cmMsec) < 80 && (cmMsec) > 70)  {
    digitalWrite(led, HIGH);  delay(610);
    digitalWrite(led, LOW);
    delay(610);
  }
  if ((cmMsec) < 90 && (cmMsec) > 80)  {
    digitalWrite(led, HIGH);  delay(690);
    digitalWrite(led, LOW);
    delay(690);
  }
  if ((cmMsec) < 100 && (cmMsec) > 90)  {
    digitalWrite(led, HIGH);  delay(770);
    digitalWrite(led, LOW);
    delay(770);
  }

  if ((cmMsec) < 110 && (cmMsec) > 100)  {
    digitalWrite(led, HIGH);  delay(850);
    digitalWrite(led, LOW);
    delay(850);
  }
  if ((cmMsec) > 110)  {

    digitalWrite(led, LOW);

  }


Andrey-S
Offline
Зарегистрирован: 02.01.2015

А если просто вот так попробовать? http://zelectro.cc/HC-SR04 Или даже вот так http://chingachgook.net/arduino/arduino-i-ultrazvukovoj-dalnomer-hc-sr04.html

romiras
Offline
Зарегистрирован: 12.07.2015

попробовал, результат не лучше, вот:

35
105
42
158
119
29
158
124
24
108
39
113
35
108
39
158
111
36
107
40
91
157
97
158
96
158
124
26
158
121
28
158
106
42
157
100
46
157
111
36
158
120
 
Radjah
Offline
Зарегистрирован: 06.08.2014

Добавь после замера выдержку в полсекунды.

romiras
Offline
Зарегистрирован: 12.07.2015

так работает, но пьеза с обилием delay, пищит уже не так как нужно

romiras
Offline
Зарегистрирован: 12.07.2015

после первого условия поставил delay(50); , так более менее сносно работает

Araris
Offline
Зарегистрирован: 09.11.2012

1. Рекомендованный период между импульсами должен быть не менее 50 мсек.

2. Весьма полезны фильтрация и усреднение полученных данных. Вот это https://bitbucket.org/alxarduino/leshakfilters/get/5b4c5a29d0aa.zip посмотрите.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

romiras пишет:

после первого условия поставил delay(50); , так более менее сносно работает

Ну и по традиции http://arduino.ru/tutorials/BlinkWithoutDelay  если нужно)

romiras
Offline
Зарегистрирован: 12.07.2015

Всем спасибо за советы, за архив - отдельное!

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Покупал 4 или 5 штук, все, кроме одного работали нормально, а у одного постоянно менялись показания. Внешне никаких багов не видно.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Глючные они...... сами по себе....

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Он же обычно глючить начинает (если рабочий) когда под углом к плоскости его ставишь или к неровной еще плоскости... Он может упал (или на него че нит грохнулось) и приемник/передатчик на пару миллиметров сместился и вот результат... А как он ведет себя на расстоянии до 10см?