Arduino:Примеры/Ping

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Ультразвуковой дальномер PING))) [1]

PING))) – это ультразвуковой дальномер от компании Parallax. Он определяет дистанцию до ближайшего объекта, который находится перед ним (поисковой диапазон варьируется от 2 см до 3 м). Принцип его работы заключается в следующем – он отсылает пучок ультразвуковых волн, а затем ждет эха, создаваемого «отпружиниванием» этого сигнала от находящегося впереди объекта. Arduino отсылает дальномеру короткий импульс, чтобы запустить процесс обнаружения, а затем через тот же контакт ждет импульса при помощи функции pulseIn(). Продолжительность ответного импульса эквивалентна времени, которое уходит на то, чтобы ультразвук дошел до объекта и вернулся к датчику. При помощи скорости звука это время можно конвертировать в дистанцию.

Необходимое оборудование

  • Плата Arduino;
  • Ультразвуковой дальномер PING)));
  • Провода-перемычки;

Цепь

5-вольтовый контакт PING))) подключен к 5-вольтовому контакту на Arduino, и аналогично контакт с «землей» на PING))) соединен с «землей» на Arduino. Контакт SIG (т.е. сигнал) на PING))) подсоединен к 7-ому цифровому контакту на Arduino.

Схема

Код

/* Датчик PING)))
  
   Этот скетч считывает данные ультразвукового дальномера PING))),
 а затем возвращает данные о дистанции до ближайшего объекта. 
   Для этого он отсылает датчику импульс (чтобы начать обнаружение), а 
 а затем слушает в ожидании ответного импульса.
   Длина ответного импульса пропорциональна дистанции от объекта до датчика.
     
   Цепь:
    * Контакт +5V на PING))) подключен к +5V на Arduino
    * Контакт «земля» (GND) на PING))) подключен к «земле» на Arduino
    * Контакт SIG на PING))) подключен к 7-ому цифровому контакту

   http://www.arduino.cc/en/Tutorial/Ping
   
   Создан 3 ноября 2008 Дэвидом Меллисом (David A. Mellis),
   модифицирован 30 августа 2011 Томом Иго (Tom Igoe).
 
   Этот код не защищен авторским правом.

 */

// Это константы, т.е. значения, которые не изменятся. 
// Зададим контакт для датчика:
const int pingPin = 7;

void setup() {
  // Инициализируем последовательную передачу данных:
  Serial.begin(9600);
}

void loop()
{
  // Задаем переменные для продолжительности импульса,
  // а также итоговую дистанцию – в дюймах и сантиметрах:
  long duration, inches, cm;

  // PING))) активируется импульсом HIGH продолжительностью 2 или более микросекунды.
  // Перед этим дадим короткий импульс LOW, чтобы «смыть» импульс HIGH (если тот вдруг остался с прошлого раза):
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);

  // Воспользуемся тем же контактом для считывания сигнала от PING))).
  // Продолжительность сигнала HIGH – это и есть время (в микросекундах)
  // от отправки ультразвуковых волн до получения эха от объекта.
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);

  // Конвертируем время в дистанцию:
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  
  delay(100);
}

long microsecondsToInches(long microseconds)
{
  // Согласно паспортным данным к PING))), 
  // ультразвуку на преодоление одного дюйма требуется 73,746 микросекунды
  // (т.е. ультразвук движется со скоростью 1130 футов в секунду).
  // Это позволяет нам определить дистанцию, 
  // пройденную сигналом (туда и обратно).
  // Поэтому мы делим ее на два, чтобы получить реальную дистанцию до объекта.
  // Характеристики PING))) можно посмотреть здесь:
  // http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{
  // Сила звука – это 340 м/с или 29 микросекунд на сантиметр.
  // Импульс движется туда и обратно, поэтому для определения реальной дистанции
  // нам нужно поделить полученное значение надвое. 
  return microseconds / 29 / 2;
}

См.также

  1. pinMode()
  2. delayMicroseconds()
  3. pulseIn()
  4. digitalWrite()
  5. return
  6. serial.begin()
  7. serial.print()
  8. ADXL3xx
  9. Memsic2125
  10. Knock

Внешние ссылки