Как использовать лазерный датчик расстояния ToF с Arduino и Wisblock

Лазерная дальнометрия имеет множество применений в производстве и быту, таких как измерение расстояния, позиционирование, обход препятствий и так далее. Time-of-Flight (ToF) Range, как тип технологии лазерной дальнометрии, часто используется для обнаружения объектов в реальном времени в роботах, автономных транспортных средствах и управлении дорожным движением из-за его точности, быстрого отклика и низкого энергопотребления. Функция распознавания лиц мобильных телефонов также использует эту технологию.

Модуль датчика ToF WisBlock RAK12014 использует ST VL53L0X , самый маленький в мире датчик измерения расстояния ToF.

В этом обзоре будет представлен модуль лазерного датчика расстояния WisBlock RAK12014 ToF, а также будет использована макетная плата WisBlock, чтобы продемонстрировать, как работает этот модуль.

Что такое модуль датчика расстояния ToF?

Модуль лазерного датчика расстояния ToF использует лазерные импульсы для измерения расстояния между собой и целевым объектом. Модуль лазерного датчика расстояния ToF WisBlock RAK12014 основан на STMicro VL53L0X, самом маленьком датчике измерения расстояния ToF в мире.

WisBlock RAK12014 обеспечивает точное измерение расстояния и может измерять расстояние до 2 метров. Его 940-нм передатчик VCSEL (лазер с вертикальной полостью, излучающий поверхность) полностью невидим для человеческого глаза, а в сочетании со встроенным физическим инфракрасным фильтром он имеет большую дальность действия и более сильную невосприимчивость к окружающему свету. Другими словами, датчик обеспечивает точное измерение расстояния независимо от отражательной способности цели.

Модуль датчика ToF RAK12014, подключенный к модульной платформе разработки оборудования WisBlock

Основные характеристики и спецификации модуля RAK12014:

  • Дальность до 2 метров
  • Интерфейс I2C для управления устройством и передачи данных
  • Выключение (сброс) и прерывание GPIO
  • Источник питания — 2,6 ~ 3,5 В
  • Размеры – 10 х 10 мм

Модуль RAK12014 содержит 24-контактный разъем, совместимый с разъемом датчика основной платы WisBlock. Модуль RAK12014 можно установить на базовый модуль WisBlock (например, RAK5005-O) через этот разъем. Порядок контактов и определения контактов этого разъема показаны на рисунке ниже.

Распиновка RAK12014

Примечание. К разъему этого модуля подключены только контакты I2C, SHUT (сброс), INT, 3V3_S и GND.

Пример RAK12014: отображение расстояния на OLED-дисплее

Мы будем использовать RAK12014 в очень типичном приложении: отображение измеренного расстояния на OLED-дисплее.

В этом примере мы подключим RAK12014 к базе RAK 5005-O, а измерение расстояния и OLED будем управлять через скетч Arduino, работающий на модуле RAK4631.

Список элементов и кабелей WisBlock, используемых в этом проекте:

  • Беспроводной датчик RAK12014 ToF
  • Модуль Rakwireless RAK4631 nRF52840 BLE xore для LoRaWAN
  • Базовая плата Rakwireless RAK5005-O WisBlock
  • Rakwireless RAK1921 OLED-дисплей
  • Соединительные кабели и USB-кабель для питания
Схема подключения

Вот конкретные шаги для реализации этого проекта:

  1. Установите библиотеку OLED (U8g2). Для управления OLED-дисплеем необходимо использовать библиотеку «U8g2».

2. Установите библиотеку датчика расстояния ToF Laser. Для управления модулем датчика расстояния ToF требуется библиотека Arduino «stm32duino_vl53l0x».

Примечание. После установки всех библиотек вам необходимо перезапустить Arduino IDE, чтобы установленные библиотеки вступили в силу.

3.Импорт кода. Затем импортируйте код в библиотеки, необходимые для OLED-дисплея и модуля лазерного датчика расстояния ToF, и определите два объекта с именами «u8g2» и «sensor_vl53l0».

#include <Wire.h>
#include <vl53l0x_class.h>      // Click to install library: http://librarymanager/All#stm32duino_vl53l0x
#include <U8g2lib.h>            // Click to install library: http://librarymanager/All#u8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
VL53L0X sensor_vl53l0x(&Wire, WB_IO2);

4. Функция GetDistance(). Функция GetDistance() соберет данные с датчика ToF и отобразит расстояние на OLED-дисплее или, если данных нет, отобразит «Ничего»:

void GetDistance(){
  int status;
  char report[64];
  uint32_t distance;  
  u8g2.clearBuffer();                 // clear the internal memory
  u8g2.setFont(u8g2_font_ncenB10_tr); // choose a suitable font
  // Read Range.
  status = sensor_vl53l0x.GetDistance(&distance);
  if (status == VL53L0X_ERROR_NONE)
  {
    // Output data. 
    snprintf(report, sizeof(report), "Range: %ld mm", distance);    
  }
  else
  {
    snprintf(report, sizeof(report), "Nothing at all", distance);
  }
  Serial.println(report);
  u8g2.drawStr(15, 30, report);
  u8g2.sendBuffer();

5.Функция setup(). В функции setup() инициализируются как лазерный датчик расстояния ToF, так и OLED-дисплей. Мы также выводим сообщение на последовательный монитор в случае сбоя инициализации датчика VL53L0X:

void setup() {
  int status;
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode(WB_IO2, OUTPUT);
  digitalWrite(WB_IO2, HIGH);
  // Initialize Serial for debug output
  Serial.begin(115200);
  time_t serial_timeout = millis();
  // On nRF52840 the USB serial is not available immediately
  while (!Serial)
  {
    if ((millis() - serial_timeout) < 5000)
    {
      delay(100);
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    } else {
      break;
    }
  }
  u8g2.begin();
  // Initialize I2C bus.
  Wire.begin();
  // Configure VL53L0X component.
  sensor_vl53l0x.begin();
  // Switch off VL53L0X component.
  sensor_vl53l0x.VL53L0X_Off();
  // Initialize VL53L0X component.
  status = sensor_vl53l0x.InitSensor(0x52);
  if(status)
  {
    Serial.println("Init sensor_vl53l0x failed...");
  }
}

6. Функция loop(). Основной цикл вызывает функцию GetDistance() каждые 300 мс.

void loop() { 
  uint32_t distance;
  int status;
  GetDistance();
  delay(300);
}

7.Загрузка кода. Теперь мы можем загрузить наш скетч Arduino на макетную плату RAK4631. Выбрали плату в Arduino IDE, а также правильный порт и начали загрузку и прошивку кода. Вы также можете открыть последовательный монитор Arduino IDE, выбрав скорость передачи данных 111500 бит/с для отслеживания данных дальности от модуля лазерного датчика расстояния ToF.

8.Видео демонстрация

Заключительные слова

Модуль лазерного датчика расстояния ToF можно использовать в самых разных приложениях и сценариях. Все данные, собранные с датчика, также можно загрузить непосредственно в облако для анализа в реальном времени. В этом обзоре в основном показано, как использовать модуль датчика расстояния ToF для измерения расстояния до объекта от датчика.

Для справки, пожалуйста, найдите полный эскиз Arduino для этого проекта датчика измерения расстояния ToF:

/**
@file RAK12014_Distance_Detection.ino
@author rakwireless.com
@brief Distance detection by laser
@version 0.1
@date 2021-8-28
@copyright Copyright (c) 2020
**/
#include <Wire.h>
#include <vl53l0x_class.h> // Click to install library: http://librarymanager/All#stm32duino_vl53l0x
#include <U8g2lib.h>       // Click to install library: http://librarymanager/All#u8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
VL53L0X sensor_vl53l0x(&Wire, WB_IO2);
 
void GetDistance(){
  int status;
  char report[64];
  uint32_t distance;
  u8g2.clearBuffer(); // clear the internal memory
  u8g2.setFont(u8g2_font_ncenB10_tr); // choose a suitable font
  // Read Range.
  status = sensor_vl53l0x.GetDistance(&distance);
  if (status == VL53L0X_ERROR_NONE)
  {
    // Output data.
    snprintf(report, sizeof(report), "Range: %ld mm", distance);
  } else {
    snprintf(report, sizeof(report), "Nothing at all", distance);
  }
  Serial.println(report);
  u8g2.drawStr(15, 30, report);
  u8g2.sendBuffer();
}
 
void setup() {
  int status;
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode(WB_IO2, OUTPUT);
  digitalWrite(WB_IO2, HIGH);
 
// Initialize Serial for debug output
  Serial.begin(115200);
  time_t serial_timeout = millis();
  // On nRF52840 the USB serial is not available immediately
  while (!Serial)
  {
    if ((millis() - serial_timeout) < 5000)
    {
      delay(100);
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    } else {
      break;
    }
  }
  u8g2.begin();
  // Initialize I2C bus.
  Wire.begin();
  // Configure VL53L0X component.
  sensor_vl53l0x.begin();
  // Switch off VL53L0X component.
  sensor_vl53l0x.VL53L0X_Off();
  // Initialize VL53L0X component.
  status = sensor_vl53l0x.InitSensor(0x52);
  if(status)
  {
    Serial.println("Init sensor_vl53l0x failed...");
  }
}
 
void loop() {
  uint32_t distance;
  int status;
  GetDistance();
  delay(300);
}

Этот обзор написан на основе перевода с некоторыми правками руководства, размещенного на китайском языке на сайте CNX Software China.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

5 1 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments