- Autores: Matheus Pedro da Silva, Nelson Alves Sousa Moreira, Kauã Lessa Lima dos Santos
- Disciplina: Microcontroladores e suas Aplicações
- Hardware: Arduino UNO
- Data: Junho/2026
- Descrição do Projeto
- Objetivos
- Lista de Materiais
- Diagrama de Conexões
- Funcionamento do Sistema
- Configuração do PID
- Como Usar
- Resultados Obtidos
- Conclusão
- Referências
Este projeto consiste em um sistema de controle de velocidade para um motor DC com encoder, utilizando um controlador PID implementado em um Arduino UNO. O sistema permite:
- Definir a velocidade desejada (setpoint) através de um potenciômetro
- Medir a velocidade real do motor através de um encoder Hall
- Ajustar automaticamente a velocidade usando um controle PID para manter o setpoint mesmo sob variações de carga
- Exibir a velocidade alvo e real em um display LCD 16x2 com interface I2C
- Monitorar os dados em tempo real via Serial Plotter
O sistema é alimentado por 8 pilhas AA (2 cases de 4 pilhas em série), fornecendo 12V para a ponte H, garantindo potência suficiente para o motor.
Desenvolver um sistema de controle de velocidade para motor DC com realimentação por encoder, utilizando um controlador PID para garantir precisão e estabilidade.
- Implementar a leitura do encoder via interrupções externas
- Projetar e ajustar os ganhos do controlador PID (Kp, Ki, Kd)
- Desenvolver uma interface amigável com LCD para exibição de dados
- Criar um sistema de monitoramento via Serial Plotter
- Garantir que o motor mantenha a velocidade desejada mesmo com variações de carga
| Componente | Quantidade | Especificação |
|---|---|---|
| Arduino Mega 2560 | 1 | Microcontrolador ATmega2560 |
| Motor DC com Encoder | 1 | Motor com encoder Hall (C1 e C2) |
| Ponte H TB6612FNG | 1 | Driver para motor DC |
| Display LCD I2C | 1 | 16x2 caracteres, endereço 0x27 |
| Potenciômetro | 1 | 10kΩ linear |
| Case de 4 Pilhas | 2 | Para alimentação do motor (12V total) |
| Pilhas AA | 8 | 1.5V cada |
| Jumpers | Vários | Macho-Macho e Macho-Fêmea |
| Protoboard | 1 | 400 ou 830 pontos |
| Cabo USB | 1 | Para programação e comunicação serial |
| Pino TB6612 | Pino Arduino | Descrição |
|---|---|---|
| PWMA | D9 (PWM) | Controle de velocidade (PWM) |
| AIN1 | D7 | Controle de direção 1 |
| AIN2 | D8 | Controle de direção 2 |
| STBY | 5V | Standby ativo |
| VM | +12V (Pilhas) | Alimentação do motor |
| VCC | 5V | Alimentação lógica |
| GND | GND | Massa comum |
| AO1 | Motor M1 | Saída para o motor |
| AO2 | Motor M2 | Saída para o motor |
| Pino Encoder | Pino Arduino | Descrição |
|---|---|---|
| 3.3V | 3.3V | Alimentação do encoder |
| GND | GND | Massa |
| C1 | D2 (INT0) | Canal 1 (interrupção) |
| C2 | D3 (INT1) | Canal 2 (interrupção) |
| Periférico | Pino Arduino | Descrição |
|---|---|---|
| Potenciômetro (esquerda) | GND | Referência negativa |
| Potenciômetro (meio) | A0 | Sinal analógico |
| Potenciômetro (direita) | 5V | Referência positiva |
| LCD I2C (GND) | GND | Massa |
| LCD I2C (VCC) | 5V | Alimentação |
| LCD I2C (SDA) | D20 | Dados I2C |
| LCD I2C (SCL) | D21 | Clock I2C |
O encoder possui dois canais (C1 e C2) que geram pulsos conforme o motor gira. O código utiliza interrupções externas (INT0 e INT1) para contar cada mudança de estado (borda de subida e descida), garantindo alta precisão na medição.
Cálculo do RPM:
Frequência = (Pulsos_contados) / (Tempo_de_medição_em_segundos)
RPM = (Frequência × 60) / (Pulsos_por_volta)
Configuração do Encoder:
- Pulsos por volta: 1496 (ajustável conforme o motor)
- Período de medição: 50ms (20 medições por segundo)
O controlador PID atua para manter a velocidade do motor igual ao valor definido pelo potenciômetro.
O PID calcula a correção necessária baseada no erro entre o setpoint e o valor real:
erro = setpoint - real
integral = integral + erro × dt
derivativo = (erro - erro_anterior) / dt
saída = Kp × erro + Ki × integral + Kd × derivativo
Para evitar que o termo integral cresça indefinidamente (caso o motor não consiga atingir o setpoint), foi implementado um anti-windup que limita a integral entre -100 e 100.
- Linha 1: Mostra o setpoint (velocidade desejada)
- Linha 2: Mostra a velocidade real medida pelo encoder
- Atualização: 350ms (evita flickering)
- Dados enviados via Serial Plotter para visualização gráfica:
Alvo_RPM:(setpoint)Real_RPM:(velocidade medida)Erro:(diferença entre alvo e real)
- Define o setpoint de 10 a 300 RPM
- Zona morta para valores abaixo de 10 (garante que o motor pare)
Os ganhos foram ajustados experimentalmente para obter a melhor resposta:
| Ganho | Valor | Função |
|---|---|---|
| Kp | 1.1 | Ação proporcional - corrige o erro imediato |
| Ki | 1.3 | Ação integral - elimina o erro em regime permanente |
| Kd | 0.01 | Ação derivativa - amortece oscilações |
- Kp: Aumente até o sistema oscilar, depois reduza pela metade
- Ki: Comece com 0 e aumente até eliminar o erro estático
- Kd: Adicione para reduzir overshoot (geralmente 10% do Kp)
- Coloque todos os componentes na protoboard seguindo o diagrama de conexões
- Conecte os dois cases de pilhas em série (PRETO-CASE1 no VERMELHO-CASE2)
- Alimente o Arduino via USB
- Conecte as pilhas ao VM do driver (após verificar a tensão com multímetro)
- Abra o Arduino IDE
- Instale a biblioteca:
LiquidCrystal I2C(Frank de Brabander) - Selecione a placa: Arduino Mega 2560
- Selecione a porta: COM7 (ou a que aparecer no Gerenciador de Dispositivos)
- Carregue o código para o Arduino
- Gire o potenciômetro para definir a velocidade desejada
- Observe o LCD para ver o setpoint e a velocidade real
- Abra o Serial Plotter (Ferramentas → Serial Plotter) para visualizar os gráficos
- O PID ajustará automaticamente o motor para manter a velocidade definida
- Tempo de estabilização: ≈ 1 segundo
- Erro em regime permanente: < 4 RPM
- Sobressinal: < 10% (ajustável via Kd)
O sistema desenvolvido atendeu todos os objetivos propostos, demonstrando:
- ✅ Controle preciso de velocidade usando PID
- ✅ Leitura confiável do encoder via interrupções
- ✅ Interface amigável com LCD e Serial Plotter
- ✅ Robustez contra variações de carga
- ✅ Código bem estruturado e comentado
O projeto proporcionou uma compreensão aprofundada sobre:
- Controle de sistemas embarcados
- Implementação de PID em microcontroladores
- Leitura de sensores com interrupções
- Comunicação I2C e exibição de dados
- ARDUINO. Arduino UNO Datasheet. Disponível em: https://docs.arduino.cc/hardware/uno-rev3/
- TOSHIBA. TB6612FNG Motor Driver Datasheet. Disponível em: https://www.sparkfun.com/datasheets/Robotics/TB6612FNG.pdf
- OGATA, Katsuhiko. Engenharia de Controle Moderno. 5ª ed. Pearson, 2011.
- BALBINO, Eduardo. Controle PID em Arduino. Embarcados, 2020.
- FRANK DE BRABANDER. LiquidCrystal I2C Library. GitHub, 2023.
