Ультразвуковой измеритель расстояния

RainMan
Offline
Зарегистрирован: 21.06.2011

Купил вот такую штуку.  http://iteadstudio.com/store/index.php?main_page=product_info&cPath=4&products_id=52   Там же есть библиотека. Все работает, но библиотека дает разрешение в 1 см. А датчик может мерять с точностью 3мм.  Библиотека предоставляет такую функцию - Timing(), которая возварщает длительность импульса от датчика, чтобы потом по формуле высчитать расстояние:

Distance = ((Duration of high level)*(Sonic :340m/s))/2

Я понял, что  Duration of high level=Timing()

а что это за параметр Sonic???

 Возможно это можно понять из этого текста, но при всем моем знании английского, понят смысла не могу:

There are 4 pins out of the module : VCC , Trig, Echo, GND . So it’s a very easy interface for controller to use it ranging. The all process is : pull the Trig pin to high level for more than 10us impulse , the module start ranging ; finish ranging , If you find an object in front , Echo pin will be high level , and based on the different distance,it will take the different duration of high level. So we can calculated the distance easily :
 

Я понял что мы на вход "Trig" подаем высокий уровень на 10миллисекунд. И после этого ловим на выходе "Echo" высокий уровень. Когда пришел высокий уровень, мы меряем его длительность (Duration of high level), ее возвращает функция Timing(). А что такое в формуле Sonic? 

 

step962
Offline
Зарегистрирован: 23.05.2011

 там же написано - Sonic:340m/s. Скорость звука.

Берем время между началом отправки у/з-сигнала и получением первого отклика. Умножаем это время на скорость звука. Получаем расстояние, которое звук прошел до ближайшего отражающего объекта и обратно. Делим полученное значение на два. В сухом остатке - искомая величина Distance.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Я делал так:

#define Trig_pin 10
#define Echo_pin 12

int dist_cm = 0;
unsigned long micros_new, micros_old = 0;

void setup(){
  pinMode(Trig_pin, OUTPUT);
}

void loop(){
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  micros_new = micros() + 500;
  while(!digitalRead(Echo_pin) && micros() < micros_new){
  }
  micros_old = micros();
  micros_new = micros() + 30000;
  while(digitalRead(Echo_pin) && micros() < micros_new){
  }
  dist_cm = (micros() - micros_old)/29.0/2;  // Вычисляем дистанцию
  delay(50);
}

Ну а дальше меняйте расчет как хотите

Sanchez
Offline
Зарегистрирован: 29.04.2013

А можно к строкам програмы добавить цетаты, чтоб было понятно что и за что отвечает?