КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Подключаем лидар HLS-LFCD2 к Raspberry Pi

Общие сведения:

Лидар HLS-LFCD2 — является электро-механическим лазерным радаром, замеряет расстояния на 360° посредством вращения оптической сборки вокруг своей оси. Передает информацию по UART.

Спецификация:

  • Питание двигателя: 5В постоянного тока;
  • Рабочее расстояние: 12 ... 350 см;
  • Питание электроники: 5В постоянного тока;
  • Пусковой ток: 1000 мА;
  • Рабочий ток: 400 мА;
  • Протокол передачи данных: UART, 8-N-1;
  • Скорость передачи данных: 230400 бод.

Подключение:

Вывод лидара Подключение
M+ (красный)
Внешний источник питания +5 В
M- (чёрный)
Внешний источник питания 0 В
Vcc +5 В
GND GND
TX GPIO15
RX GPIO14

Описание пакета данных:

№ Байта в пакете Байт Описание
0 0xFA заголовок пакета
1 0xA0 - 0xDB Индекс угла
2-3 0xXXXX скорость вращения (не используется при ручном управлении мотором
4-5 0xXXXX интенсивность
6-7 0xXXXX расстояние
8-9 0x0000 зарезервировано
... ... ...
34-35 0xXXXX интенсивность
36-37 0xXXXX расстояние
38-39 0x0000 зарезервировано
40-41 0xXXXX контрольная сумма

Расчеты:

Градус пробы n = (Индекс угла) * 6 + N

N - номер пробы

проба 0 байты 4-9
проба 1 байты 10-15
проба 2 байты 16-21
проба 3 байты 22-27
проба 4 байты 28-33
проба 5 байты 34-38

Пример пакета данных:

(все данные little endian)

FA A0 00 00 C2 21 62 00 37 00 B0 25 61 00 38 00 68 28 60 00 3A 00 AD 28 60 00

3B 00 6C 29 61 00 3A 00 4D 2D 6200 39 00 9C 9C

  • FA: заголовок пакета 
  • A0: индекс угла
  • 0000: скорость вращения (равна нулю при ручном управлении мотором)
  • C221: интенсивность (качество пробы)
  • 6200: расстояние (0x0062 = 98мм)
  • 3700: зарезервировано
  • .............
  • 9C9C: контрольная сумма

Пример:

import serial

# размер буфера
BUFFSIZE = 2520
# константа заголовка пакета
HEADER = 0xFA
# константа первого пакета
FIRSTPACKET = 0xA0
# размер пакета
PACKETSIZE = 42
# индекс начала данных в пакете
DATASTART = 4
# байт в одной пробе
OFFSETSIZE = 6
# количество проб
NOFFSETS = 6
# конец данных в пакете
DATAEND = 40
# индекс нулевого байта
startCount = 0

# открываем последовательный порт
with serial.Serial('/dev/serial0', 230400) as ser:

    # создаём буфер
    buff = [0] * BUFFSIZE

    print('инициируем передачу')
    try:

        # передаём байт начала передачи лидару
        ser.write(b'g')

        while True:

            # читаем байт в буфер
            buff[startCount] = int.from_bytes(ser.read(), "big")

            # если байт - заголовок пакета и это нулевой элемент буфера
            if startCount == 0 and buff[startCount] == HEADER:
                # меняем индекс
                startCount = 1

            # если индекс изменён и прочитаный байт - первый пакет
            if startCount == 1 and buff[startCount] == FIRSTPACKET:
                # сбрасываем индекс
                startCount = 0

                # записываем в буфер данные, начиная с третьего элемента
                i = 2

                while i < BUFFSIZE:

                    buff[i] = int.from_bytes(ser.read(), "big")
                    i += 1

                # читам каждый пакет
                for i in range(0, BUFFSIZE, PACKETSIZE):

                    # если пакет начинается с заголовка и индекс пакета правильный
                    if buff[i] == HEADER and buff[i+1] == int(FIRSTPACKET + i / PACKETSIZE):

                        # вычислаяем данные в пакете
                        for j in range(i + DATASTART, i + DATAEND, OFFSETSIZE):

                            index = int(NOFFSETS * (i / PACKETSIZE) + (j - DATASTART - i)/OFFSETSIZE)

                            byte0 = buff[j]
                            byte1 = buff[j+1]
                            byte2 = buff[j+2]
                            byte3 = buff[j+3]

                            # интенсивность (качесво) пробы
                            intensity = (byte1 << 8) + byte0

                            # расстояние в мм
                            distance = (byte3 << 8) + byte2

                            # выводим данные
                            print("r[{}]={}".format(359-index, distance/1000))

    finally:

        ser.write(b'e')
        print('заканчиваем передачу')

Применение

  • роботы
  • сигнализация
  • интерактивные системы
  • планировка помещений

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями