Периодическое получение данных от сонара GS-V2.0 через I2C/IIC

Типичной задачей, при разработке любого робота, я вляется оснащение его "органом зрения". Наиболее часто, в этом качестве, используется ультразвуковой дальномер или, как его еще называют, сонар.

Работа сонара схожа с работой его биологического аналога — эхолокатора летучих мышей. Сонар излучает ультразвуковой импульс в пространство перед собой и "слушает" в ожидании отраженного от препятствия импульса. Его задача измерить задержку — время потраченное звуком на путь до препятствия и назад. Дальше, остается только умножить скорость звука на величину задержки и не забыть разделить на 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); 
}