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.
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
| 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 |
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.
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
# 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 --versionsudo raspi-config
# Interface Options → Serial Port
# Login shell: No | Serial port hardware: Yescd /home/pi/RaspberryRobot
dotnet build -c Release# 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/# 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 grupogpio:sudo usermod -aG gpio $USER
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â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 |
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):
invalidestrength_warning - Checksum: algoritmo Neato LDS (soma de 10 palavras de 16 bits com rotação)
| 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 |
MIT — livre para uso, modificação e distribuição.