Guia Prático: Construindo um Robô Seguidor com STM32

Robôs seguidores de linha são projetos fundamentais na robótica educacional e industrial, integrando eletrônica, programação e sistemas de controle. Utilizando microcontroladores STM32Famílias de microcontroladores STM32: Uma visão geralFamílias de microcontroladores STM32: Uma visão geralProfundo mergulho nas famílias STM32, explorando arquitetura, aplicações e desempenho. Descubra dicas e casos práticos para projetos embarcados., é possível desenvolver soluções altamente eficientes e personalizáveis, aproveitando periféricos avançados como GPIOs, temporizadores (PWM), ADCs e comunicação serialTouchscreen capacitivo com STM32: Integração e calibraçãoTouchscreen capacitivo com STM32: Integração e calibraçãoDescubra como utilizar touchscreens capacitivos com STM32, explorando conexão, calibração e firmware para interfaces precisas e responsivas.. Este artigo combina teoria e prática, abordando desde a seleção de componentes até a implementação de algoritmos de controle PID, calibração de sensores e otimizações de código. Com exemplos detalhados e estratégias testadas em ambiente real, o guia visa oferecer um recurso completo para entusiastas e profissionais.

Conteúdo🔗

1. Arquitetura e Princípio de Funcionamento

2. Seleção de Componentes e Esquemático

3. Sensores de Linha: Tipos, Configuração e Calibração

4. Controle de Motores com PWMGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo. e Drivers

5. Algoritmo PID para Seguimento de Linha

6. Implementação do Código: Estrutura e Otimizações

7. Testes, Calibração e Troubleshooting

8. Conclusão

Arquitetura e Princípio de Funcionamento🔗

O robô seguidor de linha opera detectando uma faixa contrastante (ex: preta sobre branco) usando sensores infravermelhos (IR). A diferença na reflexão da luz é convertida em sinais elétricos, processados pelo STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora. para ajustar a velocidade dos motores via PWMGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo., mantendo o alinhamento com a linha.

Diagrama de Blocos:

graph TD A[Sensores IR] -->|Sinal Analógico/Digital| B(STM32) B -->|PWM| C[Driver de Motor] C --> D[Motor Esquerdo] C --> E[Motor Direito]

Componentes Principais:

Seleção de Componentes e Esquemático🔗

ComponenteEspecificações Recomendadas
MicrocontroladorSTM32F401RE (Cortex-M4, 84 MHz)
Sensores IRTCRT5000 (saída analógica/digital)
Driver de MotorL298N ou TB6612FNG (2 canais PWM)
Motores6V DC com caixa de redução
BateriaLiPo 7.4V + regulador 5V

Conexões Básicas:

Sensores de Linha: Tipos, Configuração e Calibração🔗

Tipos de Sensores

  • Sensores IR Refletivos (ex: TCRT5000): Emitem e detectam luz infravermelha refletida.
  • Fototransistores com LEDs: Medem variações de luminosidade ambiente.

Configuração no STM32

Para leitura analógica:

// Configuração do ADC (HAL Library)
ADC_HandleTypeDef hadc1;
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ContinuousConvMode = ENABLE;
HAL_ADC_Init(&hadc1);
uint16_t read_IR_sensor(uint32_t channel) {
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1, 100);
  return HAL_ADC_GetValue(&hadc1);
}

Calibração Dinâmica:

#define BLACK_THRESHOLD 800  // Valor ADC para linha preta
#define WHITE_THRESHOLD 300  // Valor ADC para fundo branco

Filtro de Média Móvel (reduz ruído):

#define SAMPLE_SIZE 5
uint16_t adc_buffer[SAMPLE_SIZE];
uint16_t filtered_value = 0;
for(int i=0; i<SAMPLE_SIZE-1; i++){
  adc_buffer[i] = adc_buffer[i+1];
  filtered_value += adc_buffer[i];
}
adc_buffer[SAMPLE_SIZE-1] = read_IR_sensor();
filtered_value /= SAMPLE_SIZE;

Controle de Motores com PWM e Drivers🔗

Configuração do PWM no STM32

Exemplo com TIM1 (50 Hz):

TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 84-1;  // Clock de 1 MHz
htim1.Init.Period = 20000-1;   // Período de 20 ms
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // PE9
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); // PE11
// Ajuste de velocidade (duty cycle)
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1500); // 7.5%

Controle de Direção e Velocidade

O driver L298N requer dois sinais por motor: PWM (velocidade) e GPIOConfigurando e usando GPIOs no STM32Configurando e usando GPIOs no STM32Explore neste tutorial os fundamentos e configurações práticas dos GPIOs no STM32, com exemplos de LED, botões e modos alternativos. (direção). Para movimento bidirecional:

// Exemplo: Motor direito para frente
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET);

Algoritmo PID para Seguimento de Linha🔗

Fórmula do PID

$$ u(t) = K_p e(t) + K_i \int_{0}^{t} e(\tau) d\tau + K_d \frac{de(t)}{dt} $$

Implementação no Código

float Kp = 0.8, Ki = 0.001, Kd = 0.2;
float error, last_error, integral, derivative;
void PID_Update() {
  error = calculate_line_position(); // Ex: -5 (esquerda) a +5 (direita)
  integral += error;
  derivative = error - last_error;
  float correction = Kp*error + Ki*integral + Kd*derivative;
  set_motor_speed(LEFT_MOTOR, BASE_SPEED + correction);
  set_motor_speed(RIGHT_MOTOR, BASE_SPEED - correction);
  last_error = error;
}

Estratégias de Ajuste:

1. Kp (Proporcional): Define a resposta imediata ao erro.

2. Kd (Derivativo): Reduz oscilações antecipando mudanças.

3. Ki (Integral): Corrige erros acumulados em longo prazo.

Implementação do Código: Estrutura e Otimizações🔗

Estrutura Modular

Uso de Interrupções para Amostragem

// Timer interrupt para PID (100 Hz)
void TIM2_IRQHandler() {
  if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE)) {
    __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
    PID_Update();
  }
}

DMA para Leitura Simultânea de Múltiplos Sensores

Configurar o ADCConfigurando e usando o ADC no STM32Configurando e usando o ADC no STM32Este tutorial para STM32 ensina a configurar o ADC via registradores e HAL, explicando calibração, DMA, filtragem e resolução de problemas práticos. com DMA permite ler vários canais sem sobrecarregar a CPU.

Testes, Calibração e Troubleshooting🔗

Passos para Teste

1. Calibração Inicial:

2. Ajuste do PID:

  • Comece com Kp=0, aumente gradualmente até o robô responder sem oscilar.
  • Adicione Kd para suavizar movimentos e Ki para correção de deriva.

3. Validação em Curva:

  • Teste o robô em linhas retas, curvas suaves e fechadas.

Problemas Comuns e Soluções

  • Motores Desbalanceados:
// Ajuste individual de PWM
#define LEFT_MOTOR_OFFSET  50
#define RIGHT_MOTOR_OFFSET 45
  • Ruído nos Sensores:
    • Aumente o tamanho do filtro de média móvel ou adicione um capacitor em paralelo com o sensor.

Conclusão🔗

Desenvolver um robô seguidor de linha com STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora. exige integração cuidadosa entre hardware e software. Desde a seleção de componentes e calibração de sensores até a implementação de algoritmos de controle como o PID, cada etapa influencia diretamente no desempenho final. A utilização de técnicas como filtragem de sinais, interrupções de timer e DMA garante um sistema responsivo e eficiente. Este guia oferece as ferramentas necessárias para enfrentar desafios práticos, incentivando a experimentação e adaptação para diferentes cenários, desde competições educacionais até aplicações industriais simplificadas.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados