Как вы принимаете Простейшее непрерывное считывание с Garmin Lidar Lite V4 с использованием I2C на Particle Boron v4.1.0?

Привет, сообщество Stack. Я работаю с Particle Boron v4.1.0. Я подключаю Garmin Lidar Lite V4 по I2C. Я использую заголовочный файл LIDARLite_v4LED.h, найденный в библиотеке для этого устройства, «LIDAR-Lite». и моя цель здесь - провести оперативную проверку датчика, сняв показания самым простым способом по .h файлу.

Проводка: Я припаял сплошной провод 22AWG к каждому соответствующему контакту датчика: GND: черный, идущий непосредственно на землю. VCC: красный, контакт 3,3 В на Particle Boron. I2C SDA: синий, SDA Pin0 на Particle Boron с подтягивающим резистором 4,7 кОм, подключенным к земле на одном конце и подключенным к Pin0 на Boron. I2C SCL: зеленый, SCL Pin1 на Particle Boron с подтягивающим резистором 4,7 кОм, подключенным к земле на одном конце и подключенным к Pin1 на Boron.

Я запустил сканирование I2C, которое подтвердило адрес 0x62.

Согласно руководству по адресу: https://static.garmin.com /pumac/LIDAR-Lite%20LED%20v4%20Instructions_EN-US.pdf

Чтобы выполнить чтение, необходимо выполнить следующие действия, которые встроены в функции файла .h библиотеки:

"Получение измерений из интерфейса I2C Результаты измерений можно получить через интерфейс I2C.

  1. Запишите 0x04, чтобы зарегистрировать 0x00.
  2. Чтение регистра 0x01.
  3. Повторяйте шаг 2, пока бит 0 (LSB) не станет низким.
  4. Прочитайте два байта от 0x10 (младший байт 0x10, затем старший байт 0x11), чтобы получить 16-битное измеренное расстояние в сантиметрах."
#include <LIDARLite_v4LED.h>

const int I2CADDRESS = 0X62;
uint16_t distance;


LIDARLite_v4LED L1;

void setup() {
    Serial.begin(9600);
}

void loop() {
    L1.takeRange(I2CADDRESS);
    L1.waitForBusy(I2CADDRESS);
    L1.getBusyFlag(I2CADDRESS);
    distance = L1.readDistance(I2CADDRESS);
    Serial.printf("Distance = %u\n", distance);
}

Когда я запускаю приведенный выше код, последовательный монитор постоянно показывает 0 для чтения, что неверно.

Вы случайно не видите, что я делаю не так?

Вот что происходит при каждом вызове соответствующей функции выше:

void LIDARLite_v4LED::takeRange(uint8_t lidarliteAddress)
{
    uint8_t dataByte = 0x04;

    write(0x00, &dataByte, 1, lidarliteAddress);
} /* LIDARLite_v4LED::takeRange */

void LIDARLite_v4LED::waitForBusy(uint8_t lidarliteAddress)
{
    uint8_t  busyFlag;

    do
    {
        busyFlag = getBusyFlag(lidarliteAddress);
    } while (busyFlag);

} /* LIDARLite_v4LED::waitForBusy */

uint8_t LIDARLite_v4LED::getBusyFlag(uint8_t lidarliteAddress)
{
    uint8_t  statusByte = 0;
    uint8_t  busyFlag; // busyFlag отслеживает, когда устройство завершило измерение

    // Чтение регистра состояния для проверки флага занятости
    read(0x01, &statusByte, 1, lidarliteAddress);

    // Бит 0 СОСТОЯНИЯ равен busyFlag
    busyFlag = statusByte & 0x01;

    return busyFlag;
} /* LIDARLite_v4LED::getBusyFlag */

uint16_t LIDARLite_v4LED::readDistance(uint8_t lidarliteAddress)
{
    uint16_t  distance;
    uint8_t * dataBytes = (uint8_t *) &distance;
    // Читаем два байта из регистров 0x10 и 0x11
    read(0x10, dataBytes, 2, lidarliteAddress);
    return (distance);
} /* LIDARLite_v4LED::readDistance */

Заранее благодарим за любую помощь!

ПРИМЕЧАНИЕ. В коде нет ошибок. Возможно я повредил микросхему датчика при пайке, так как я во всем этом новичок! Однако я соединил два датчика и опробовал их каждый по отдельности с одним и тем же кодом и получил одинаковые результаты, пытаясь исключить это. Я лучше припаял второй датчик и считаю маловероятным, что я повредил их оба.

, 👍4

Обсуждение

Подтягивающие резисторы необходимо подключать к VCC, а не к земле... VCC вверху, земля внизу., @romkey

Спасибо, Ромки, я исправил это. К сожалению, я получаю точно такие же результаты, исправив подтягивающие резисторы. Сейчас резисторы подключены к 3,3 В., @Katie Neeley

Согласно схеме подключения, которую можно найти здесь: https://static.garmin.com/pumac/LIDAR-Lite_v3HP_Instructions_EN.pdf. Похоже, что резисторы подключены к земле. Но в справочной таблице они называются подтягивающими резисторами. Теперь я не уверен, следует ли подключать резисторы к земле или к питанию... РЕДАКТИРОВАТЬ: ПОКРАСИТЕ ЭТО! Я неправильно прочитал схему подключения, они подключены к питанию., @Katie Neeley

О, ПАРЕНЬ! Я решил это. Мне пришлось включить Wire.h и запустить Wire.begin(); в настройке., @Katie Neeley

Эй, рад, что у тебя все заработало! Самое сложное вы поняли сами :), @romkey


1 ответ


3

Как заметил Ромки, у меня неправильно подключены подтягивающие резисторы. Подтягивающие резисторы подключаются к питанию, а не к земле.

Затем мне пришлось включить wire.h и запустить Wire.begin(); в настройке.

,