Общие сведения:
Лидар 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('заканчиваем передачу')
Применение
- роботы
- сигнализация
- интерактивные системы
- планировка помещений
Обсуждение