Skip to content

mkazimoto/RaspberryRobotLIDAR

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Raspberry Robot — LIDAR Xiaomi LDS01RR

Robô autônomo desenvolvido em C# / .NET 8 para Raspberry Pi, usando o sensor LIDAR Xiaomi LDS01RR (LDS-01) para desvio de obstáculos em tempo real.


Estrutura do projeto

RaspberryRobot/
├── Program.cs                     # Ponto de entrada
├── RaspberryRobot.csproj
├── Lidar/
│   ├── ScanPoint.cs               # Modelo de dado de um ponto LIDAR
│   └── LDS01RR.cs                 # Driver de comunicação serial
├── Robot/
│   ├── SoftwarePwm.cs             # PWM por software via GPIO
│   ├── MotorDriver.cs             # Driver L298N dual H-bridge
│   └── RobotController.cs         # Controlador principal
└── Navigation/
    ├── NavigationCommand.cs        # Enum de comandos de movimento
    └── ObstacleAvoidance.cs        # Lógica de desvio de obstáculos

Hardware necessário

Componente Descrição
Raspberry Pi 3/4/5 Qualquer modelo com GPIO e USB
Xiaomi LDS01RR Sensor LIDAR rotativo (360°, até ~6 m)
Adaptador USB-UART Para conectar o LIDAR (ex.: CH340, CP2102)
L298N Driver de motores dual H-bridge
2× Motor DC Motores das rodas (5–12 V)
Fonte de alimentação 7–12 V para os motores; 5 V para o Pi

Esquema de ligação

LIDAR LDS01RR → Raspberry Pi

LDS01RR  ──── Adaptador USB-UART ──── Porta USB do Raspberry Pi
                                       (aparece como /dev/ttyUSB0)

Tensão: O LDS01RR opera em 3,3 V UART. Use um adaptador compatível.

L298N → Raspberry Pi (pinos BCM/GPIO)

Raspberry Pi (BCM)   L298N       Função
─────────────────────────────────────────────────────
GPIO 17          →   IN1         Motor Esquerdo – Direção A
GPIO 18          →   IN2         Motor Esquerdo – Direção B
GPIO 27          →   ENA         Motor Esquerdo – Velocidade (PWM)
GPIO 22          →   IN3         Motor Direito  – Direção A
GPIO 23          →   IN4         Motor Direito  – Direção B
GPIO 24          →   ENB         Motor Direito  – Velocidade (PWM)
GND              →   GND         Terra comum
L298N           Motores / Alimentação
─────────────────────────────────────
OUT1 + OUT2  →  Motor Esquerdo (DC)
OUT3 + OUT4  →  Motor Direito  (DC)
VCC          →  Bateria 7–12 V
GND          →  Bateria GND

Pré-requisitos de software

No Raspberry Pi

# Instalar .NET 8 SDK
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel 8.0

# Adicionar ao PATH
echo 'export PATH=$PATH:$HOME/.dotnet' >> ~/.bashrc
source ~/.bashrc

# Verificar instalação
dotnet --version

Habilitar porta serial (se usar GPIO UART)

sudo raspi-config
# Interface Options → Serial Port
# Login shell: No  |  Serial port hardware: Yes

Compilar e executar

Compilar diretamente no Raspberry Pi

cd /home/pi/RaspberryRobot
dotnet build -c Release

Cross-compile no Windows/Linux e copiar para o Pi

# No PC de desenvolvimento
dotnet publish -c Release -r linux-arm64 --self-contained true -o publish/

# Copiar via SCP
scp -r publish/ pi@<IP_DO_PI>:/home/pi/RaspberryRobot/

Executar

# Porta padrão: /dev/ttyUSB0
sudo dotnet RaspberryRobot.dll

# Especificar porta e habilitar mapa ASCII
sudo dotnet RaspberryRobot.dll /dev/ttyUSB0 --map

sudo é necessário para acesso GPIO em alguns sistemas.
Alternativamente, adicione o usuário ao grupo gpio: sudo usermod -aG gpio $USER


Lógica de navegação

O sistema divide o espaço em setores angulares e toma decisões hierárquicas:

         ↑ FRENTE (330°–30°)
   ┌─────────────┐
   │  Livre?     │──► Avançar
   │  < 600 mm?  │──► Curva suave
   │  < 300 mm?  │──► Recuar → Girar
   └─────────────┘

Espaço lateral esquerdo (31°–90°) vs direito (270°–329°):
   Maior espaço livre → escolhe lado para girar

Parâmetros ajustáveis (em RobotController)

Parâmetro Padrão Descrição
CriticalDistanceMm 300 mm Obstáculo imediato (parar/girar)
CautionDistanceMm 600 mm Zona de precaução (desvio suave)
MinValidDistanceMm 80 mm Filtra ruído do sensor

Protocolo LDS01RR

O sensor transmite pacotes de 22 bytes a 115200 baud:

[0xFA][IDX][SPEED_L][SPEED_H]
[D0_L][D0_H+flags][Q0][RES]
[D1_L][D1_H+flags][Q1][RES]
[D2_L][D2_H+flags][Q2][RES]
[D3_L][D3_H+flags][Q3][RES]
[CHKSUM_L][CHKSUM_H]
  • IDX: 0xA0–0xF9 → 90 pacotes × 4 amostras = 360 pontos/volta
  • Distância: 14 bits (máx. ~16 m; útil até ~6 m)
  • Flags (bits 7–6 de D_H): invalid e strength_warning
  • Checksum: algoritmo Neato LDS (soma de 10 palavras de 16 bits com rotação)

Solução de problemas

Sintoma Possível causa / Solução
Porta não encontrada ls /dev/tty* para identificar a porta correta
Permission denied na porta sudo usermod -aG dialout $USER e relogar
LIDAR não gira Verificar alimentação 5 V do motor do LIDAR
Dados inválidos / checksum falho Verificar adaptador USB-UART e cabo
Motores não respondem Conferir ligações L298N e tensão da bateria
GPIO sem permissão Executar com sudo ou adicionar ao grupo gpio

Licença

MIT — livre para uso, modificação e distribuição.

About

Robô autonomo com Raspberry e LIDAR Xiaomi LDS01RR

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages