Найти тему
Алексей Кретов

Arduino радар на оптическом датчике SHARP 2Y0A21

Оглавление

Ещё один вариант датчиков, определяющих расстояние.

Испытательный стенд
Испытательный стенд

В отличии от УЗ датчика, рассмотренного ранее, оптические датчики измеряют расстояние не по времени получения отраженного от поверхности сигнала, а по изменению интенсивности возвратившегося импульса света.

Принцип работы датчика

Принцип работы оптического датчика Sharp заключается в том, что лазерный луч отражается от препятствия и попадает на матрицу в разные её места, в зависимости от того, на каком расстоянии произошло отражение .

https://3d-diy.ru/wiki/arduino-datchiki/infrakrasnyj-datchik-rasstojanija/
https://3d-diy.ru/wiki/arduino-datchiki/infrakrasnyj-datchik-rasstojanija/

Выход датчика нелинеен. Зависимость показаний датчика от расстояния имеет следующий вид:

https://static.chipdip.ru/lib/492/DOC001492017.pdf
https://static.chipdip.ru/lib/492/DOC001492017.pdf

Пик в начале первого графика объясняется тем, что датчик не способен обнаруживать объекты на малых расстояниях. Также, у разных моделей таких датчиков будут разные минимальное и максимальное расстояния.

Подключение

Датчик Sharp аналоговый, а значит его можно подключить к одному из входов АЦП Ардуино. В нашем случае, подключаем к A0.

SHARP 2Y0A21 | GND | VCC | OUT |
Arduino | GND | +5V | A0 |

-4

Считывать полученное значение с датчика мы будем при помощи функции analogRead. Функция analogRead возвращает нам целое число от 0 до 1023 и чтобы узнать уровень напряжение на выходе сенсора,  нам нужно умножить это число на 5 и поделить на 1023. операции с рациональными числами использовать нецелесообразно

Скетч выглядит следующим образом:

Текстовая версия внизу страницы
Текстовая версия внизу страницы

После проведения серии экспериментов были подтверждены характеристики датчика:

Менее 10 см точность резко падает, далее долгий промежуток достаточно качественных показаний.

Будем использовать датчик совместно с ультразвуковым, в следующих проектах

Размеры корпуса

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

-6

Статья составлена при поддержке клуба робототехники и магазина "Робот и Я" на Кантемировской - лучшего магазина с интереснейшими роботами!

Код программы:

# 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);
}