Ещё один вариант датчиков, определяющих расстояние.
В отличии от УЗ датчика, рассмотренного ранее, оптические датчики измеряют расстояние не по времени получения отраженного от поверхности сигнала, а по изменению интенсивности возвратившегося импульса света.
Принцип работы датчика
Принцип работы оптического датчика Sharp заключается в том, что лазерный луч отражается от препятствия и попадает на матрицу в разные её места, в зависимости от того, на каком расстоянии произошло отражение .
Выход датчика нелинеен. Зависимость показаний датчика от расстояния имеет следующий вид:
Пик в начале первого графика объясняется тем, что датчик не способен обнаруживать объекты на малых расстояниях. Также, у разных моделей таких датчиков будут разные минимальное и максимальное расстояния.
Подключение
Датчик Sharp аналоговый, а значит его можно подключить к одному из входов АЦП Ардуино. В нашем случае, подключаем к A0.
SHARP 2Y0A21 | GND | VCC | OUT |
Arduino | GND | +5V | A0 |
Считывать полученное значение с датчика мы будем при помощи функции analogRead. Функция analogRead возвращает нам целое число от 0 до 1023 и чтобы узнать уровень напряжение на выходе сенсора, нам нужно умножить это число на 5 и поделить на 1023. операции с рациональными числами использовать нецелесообразно
Скетч выглядит следующим образом:
После проведения серии экспериментов были подтверждены характеристики датчика:
Менее 10 см точность резко падает, далее долгий промежуток достаточно качественных показаний.
Будем использовать датчик совместно с ультразвуковым, в следующих проектах
Размеры корпуса
Для любителей прикрутить датчики к своему роботу, прикрепляю чертёжик из даташита. Пока датчики едут, можно успеть подготовить и распечатать для них корпусы:
Статья составлена при поддержке клуба робототехники и магазина "Робот и Я" на Кантемировской - лучшего магазина с интереснейшими роботами!
Код программы:
# define SENS_PIN A0
float voltage; // переменная для хранения значения АЦП
float dist; // переменная для хранения вычисленного расстояния
void Printer(int m, float v, float d) {
Serial.print(m);
Serial.print(" ADC, ");
Serial.print(v); Serial.print(" V, ");
Serial.print(d);
Serial.println(" cm");
}
void setup() {
Serial.begin(115200); // старт последовательного порта
}
void loop() {
// считываем значение сенсора и переводим в напряжение
float measur = analogRead(SENS_PIN);
voltage = measur * 5 / 1023;
dist = 65 * pow(voltage, -1.10); // вычисляем расстояние
//выводим показания в монитор порта
Printer(measur, voltage, dist);
delay(200);
}