Как вы принимаете Простейшее непрерывное считывание с 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.
- Запишите 0x04, чтобы зарегистрировать 0x00.
- Чтение регистра 0x01.
- Повторяйте шаг 2, пока бит 0 (LSB) не станет низким.
- Прочитайте два байта от 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 */
Заранее благодарим за любую помощь!
ПРИМЕЧАНИЕ. В коде нет ошибок. Возможно я повредил микросхему датчика при пайке, так как я во всем этом новичок! Однако я соединил два датчика и опробовал их каждый по отдельности с одним и тем же кодом и получил одинаковые результаты, пытаясь исключить это. Я лучше припаял второй датчик и считаю маловероятным, что я повредил их оба.
@Katie Neeley, 👍4
Обсуждение1 ответ
Как заметил Ромки, у меня неправильно подключены подтягивающие резисторы. Подтягивающие резисторы подключаются к питанию, а не к земле.
Затем мне пришлось включить wire.h
и запустить Wire.begin();
в настройке.
- Альтернативы библиотеке Wire для I2C
- Запуск 7-контактного OLED-дисплея с 4 контактами (I2C)
- Какие Arduino поддерживают ATOMIC_BLOCK?
- Отправка строки из RPi в Arduino - Рабочий код
- Ошибка: Переменная или поле объявлены недействительными
- Существуют ли хорошие и поддерживаемые библиотеки для использования моста DS2482 I2C с 1-Wire?
- Как определить, было ли нажато более одной кнопки
- Как масштабировать растровое изображение (массив uint8_t) в Arduino?
Подтягивающие резисторы необходимо подключать к 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