Для определения положения робота в пространстве можно использовать разные датчики и подходы. Самый универсальный из них - ультразвуковой датчик.
Результаты экспериментов в самом конце страницы!
Есть несколько основных вариантов дальномеров:
Принцип работы датчика
Модуль HY-SRF05 при получении импульса от ардуино запускает работу встроенного контроллера, который формирует несколько ультразвуковых импульсов, которые излучаются с динамика "Т". После отражения от объекта - эхо возвращается на приёмник "R". Встроенный контроллер определяет время между отправкой первого фронта и приходом отраженного фронта. Полученное значение времени соответствует сигналу HIGH на пине Echo, который формирует контроллер датчика.
На стороне ардуино обработка времени высокого сигнала от Echo обеспечивается командой pulseIn(Pin,High). Эта функция работает на прерываниях программных прерываниях ардуино, и принимает в качестве аргументов номер пина, на котором отслеживается изменение уровня, и уровень - HIGH или LOW
Код и подключение
Статья составлена при поддержке клуба робототехники и магазина "Робот и Я" на Кантемировской - лучшего магазина с интереснейшими роботами!
Код скетча
# define TRIG_PIN 12
# define ECHO_PIN 13
void setup() { // открываем монитор порта на скорости 115200 bod
Serial.begin(115200);
//Конфигурируем порты
pinMode(TRIG_PIN,OUTPUT);
pinMode(ECHO_PIN,INPUT); /*выполнять не обязательно, т.к. по умолчанию все порты работают на входы*/
}
void loop() {
// создаём переменные
long duration, distanceCm, distanceIn;
/*Задаем короткий импульс LOW заблаговременно, чтобы обеспечить чистый импульс HIGH:*/
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN,HIGH); // Преобразуем время в расстояние
distanceCm = duration / 29.1 / 2 ;
distanceIn = duration / 74 / 2;
if (distanceCm <= 0){
Serial.println("Out of range");
}
else {
//расстояние в дюймах
Serial.print(distanceIn);
Serial.print("in, ");
//расстояние в сантиметрах
Serial.print(distanceCm);
Serial.print("cm");
Serial.println();
}
delay(200);
}