Простой лазерный дальномер на Arduino своими руками
Измерение расстояния до объекта является важной особенностью некоторых проектов, как в серьезной инженерии, так и в радиолюбительстве. Сегодня на рынке представлено много датчиков расстояния, отличающихся как по характеристикам, так и по цене.

В данном примере мы свяжем лазерный датчик расстояния ToF 10120 с Arduino и будем выводить получаемые с него данные на ЖК-дисплей.
Датчики типа ToF (Time-of-Flight) стали очень популярными благодаря своей надежности и простоте использования. Кроме того, лазерные датчики ToF, несмотря на более высокую цену относительно стоимости ультразвуковых датчиков, отлично подходят для высокочастотных приложений.

Лазерные датчики имеют тот же принцип работы, что и ультразвуковые: отправка сигнала и ожидание его возврата назад. Продолжительность между отправкой и получением называется временем полета (Time-of-Flight). Скорость известна заранее, длительность рассчитывается и делится на 2, в итоге мы можем найти расстояние.
Преимущество лазерных датчиков в том, что они очень малы по сравнению с другими типами, и могут использоваться для высокочастотных применений, таких как автофокусировка камеры.

Модуль ToF10120, который мы будем использовать в данном проекте, имеет 6 выводов: питание GND-VCC, RX-TX для UART и SDA-SCL для I2C. В этом примере мы будем использовать интерфейс I2C для подключения датчика к Arduino, а также добавим ЖК-экран с интерфейсом I2C, чтобы увидеть результаты измерений в мм.
Схема подключения Arduino, датчика расстояния ToF10120 и LCD-дисплея выглядит следующим образом.

Комментированный код программы получения данных от датчика расстояния следующий.
#include <Wire.h>
unsigned char ok_flag;
unsigned char fail_flag;
unsigned short lenth_val = 0;
unsigned char i2c_rx_buf[16];
unsigned char dirsend_flag=0;
void setup() {
Wire.begin();
Serial.begin(9600,SERIAL_8N1);
printf_begin();
}
void loop() {
int x=ReadDistance();
Serial.print(x);
Serial.println(" mm");
}
int serial_putc( char c, struct __file * )
{
Serial.write( c );
return c;
}
void printf_begin(void)
{
fdevopen( &serial_putc, 0 );
}
void SensorRead(unsigned char addr,unsigned char* datbuf,unsigned char cnt)
{
unsigned short result=0;
// шаг 1: дать указание датчику считать эхо-сигнал
Wire.beginTransmission(82); // передать на устройство 82 (0x52)
// адрес, указанный в документации - 164 (0xa4)
// но i2c адресация использует старшие 7 бит, так что это 82
Wire.write(byte(addr)); // устанавливает адрес данных расстояния (адрес)
Wire.endTransmission(); // прекратить передачу
// Шаг 2: дожидаемся показаний
delay(1); // в документации указано, что ждать нужно минимум 30 мкс
// шаг 3: запрос показаний от датчика
Wire.requestFrom(82, cnt); // запрос cnt байтов от ведомого устройства 82 (0x52)
// шаг 5: получить показания от датчика
if (cnt <= Wire.available()) { // если два байта были получены
*datbuf++ = Wire.read(); // получить старший байт (перезаписывает предыдущее считывание)
*datbuf++ = Wire.read(); // получить младший байт как младшие 8 бит
}
}
int ReadDistance(){
SensorRead(0x00,i2c_rx_buf,2);
lenth_val=i2c_rx_buf[0];
lenth_val=lenth_val<<8;
lenth_val|=i2c_rx_buf[1];
delay(300);
return lenth_val;
}
Подключив компоненты и загрузив код в Arduino, можно протестировать устройство. Включите питание и наблюдайте за полученными показаниями сделанного своими руками лазерного дальномера. В документации на датчик максимальный диапазон составляет 1,8 метра, но, как показано ниже, можно измерить расстояние до 2 метров.

© digitrode.ru