Делаем радар

Типичной задачей, при разработке любого робота, является оснащение его "органом зрения". Наиболее часто для этого используется ультразвуковой дальномер или, как его еще называют, сонар.
Работа сонара схожа с работой его биологического аналога — эхолокатора летучих мышей. Сонар излучает ультразвуковой импульс в пространство перед собой и "слушает" отраженный от препятствия импульс. Его задача измерить задержку — время, потраченное звуком, на путь до препятствия и назад. Дальше остается только умножить скорость звука на величину задержки и не забыть разделить на 2, ведь звук путешествует к цели и назад, то есть проходит одно расстояние дважды. Если ультразвуковой импульс не вернулся, следовательно, препятствия впереди нет - путь свободен!
По такой схеме работают все ультразвуковые дальномеры. Но большинство из них не измеряют время сами, а лишь управляются внешним контроллером, излучая сигнал по команде и сообщая о приеме отраженного импульса. Это не очень удобно, потому что отнимает такой ценный ресурс контроллера, как таймер. Именно поэтому мы разработали более совершенный сонар, оснащенный собственным контроллером. Это позволяет производить все вычисления на стороне сонара, отдавая "наружу" готовый результат измерения в сантиметрах. Для того, чтобы работать с сонаром в таком режиме, нужно подключиться к нему по интерфейсу I2C и задать желаемый интервал измерений. По умолчанию, сонар имеет I2C адрес 14.
При этом сохранилась возможность работы с сонаром с использованием традиционного протокола EchoTrigger, для тех, кому интересно самому разобраться в логике его работы производить расчеты на стороне Arduino.

Напишем простую программу, которая будет измерять расстояние до препятствия и выводить его в терминал. Для более простой работы с сонаром необходимо подключить библиотеку Sonar.h

  
  #include "Sonar.h"

  void setup() {
  //Инициализация TWI модуля 
  SonarInit();

  //Подключаемся к сонару с адресом 14 и задаем 
  //период измерений равный 200мс (допустимый интервал 
  //20 - 65535 мс)
  SonarTxDataTime(14,200);

  //Открываем последовательное соединение для обмена 
  //данными с компьютером на скорости 9600бит/c
  Serial.begin(9600);
}

  void loop() {
  //Контроллер сонара обновляет результат раз в 200мс, как и было
  //задано выше. Данные хранятся до следующего измерения.
  //Для того, чтобы получать актуальные данные,
  //мы должны также забирать их раз в 200мс. 
  //Чаще нет смысла, так как будем забирать один и 
  //тот же результат несколько раз. 
  //Если же забирать реже, то есть вероятность пропуска результата. 
  //Установка периода получения данных устанавливается 
  //функцией delay(200); в конце цикла
  int range = SonarRxData(14);

  //Выводим данные в терминал
  Serial.println(range);

  //Ждем 200мс
  delay(200); 
}