Robô seguidor de linha de controle PID
Componentes e suprimentos
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Aplicativos e serviços online
![]() |
|
Sobre este projeto
Visão geral
Um recurso de que a maioria dos robôs autônomos rover precisa é o seguimento de linha. O objetivo deste projeto é construir um robô seguidor de linha e começar a aprender o controlador PID de uma forma divertida.
Peças
O robô funciona corretamente com dois motores, o Rosbot Baseboard e um sensor de 5 canais. Ao contrário de outros, você não precisa comprar driver de motor H-bridge extra ou vários componentes, uma vez que o Rosbot Baseboard tem 2x H-bridge dual driver embutido. Simplesmente conecta os motores à placa de base do Rosbot e ele fornecerá mais energia do que o Arduino Uno.


- Estrutura do robô: Chassi de alumínio anodizado KittenBot
Chassis legal e sólido que tem toneladas de orifícios de montagem (4.8mm LEGO Technic), você pode definitivamente reutilizar este chassi para outros projetos divertidos.
- Cérebro do robô :Rodapé RosBot
Uma placa-mãe baseada em Arduino UNO com 2 drivers de motor dual H-bridge integrados.
- Olhos de robô :Sensor rastreador de seguimento de linha IV de 5 canais
Detector infravermelho de 5 canais, mais preciso e estável.
Etapa 1:montagem
Este robô é bastante fácil de montar, siga as instruções e leva cerca de 15 minutos.

Primeiro, prenda seus motores nas laterais do chassi, simplesmente conecte a roda de borracha.

Monte o sensor IR de 5 canais na parte frontal do chassi.

Prenda sua placa de base Rosbot ao chassi, então o robô está pronto para ser conectado.
Etapa 2:torcer
A seguir estão as conexões para o sensor IR de 5 canais:
- VCC a 5V
- GND para RosBot's GND
- T1-T4 para pino A0-A3
- T5 para fixar SDA
Os motores DC simplesmente vão para os pinos A + A- e B + B-.

Codificação
Nos códigos, temos uma máquina de estado que indica cada saída possível da matriz de sensores. O robô se move para uma determinada direção de acordo com a saída da matriz de sensores.
void stateMachine (int a) {switch (a) {case B00000:outlineCnt ++; pausa; case B11111:outlineCnt ++; pausa; caso B00010:caso B00110:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (0, 50, 0)); viés =1; pausa; case B00001:case B00011:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (0, 200, 0)); viés =2; pausa; caso B00100:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (0, 0, 20)); polarização =0; pausa; case B01000:case B01100:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (50, 0, 0)); polarização =-1; pausa; case B10000:case B11000:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (200, 0, 0)); polarização =-2; pausa; padrão:Serial.println (a, BIN); esboçoCnt ++; pausa; }
Já configuramos o valor de Erro, termo de proporção, termo integral e termo derivativo.

float Kp =25; float Ki =0,15; float Kd =1200; erro float, errorLast, erroInte; float calcPid (entrada flutuante) {float errorDiff; saída flutuante; erro =erro * 0,7 + entrada * 0,3; // filtro // erro =entrada; errorDiff =erro - errorLast; erroInte =restrição (erroInte + erro, -50, 50); saída =Kp * erro + Ki * erroInte + Kd * erroDiff; Serial.print (erro); Serial.print (''); Serial.print (erroInte); Serial.print (''); Serial.print (errorDiff); Serial.print (''); Serial.println (saída); errorLast =erro; retorno de saída;
Manipule os valores para encontrar o melhor ajuste para o seu robô.
Código
- Robô seguidor de linha
Robô seguidor de linha Arduino
Nos códigos, incluímos um NeoPixel de Adafruit, mas isso é opcional.#include#define S_NULL 0 # define S_ONTRACE 1Adafruit_NeoPixel pixels =Adafruit_NeoPixel (4, 4, NEO_GRB + int_KHZ800); spdL, int spdR) {spdR =-spdR; if (spdL <0) {analogWrite (5, 0); analogWrite (6, -spdL); } else {analogWrite (5, spdL); analogWrite (6, 0); } if (spdR <0) {analogWrite (9, 0); analogWrite (10, -spdR); } else {analogWrite (9, spdR); analogWrite (10, 0); }} int bias =0; int outlineCnt =0; void stateMachine (int a) {switch (a) {case B00000:outlineCnt ++; pausa; case B11111:outlineCnt ++; pausa; caso B00010:caso B00110:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (0, 50, 0)); viés =1; pausa; case B00001:case B00011:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (0, 200, 0)); viés =2; pausa; caso B00100:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (0, 0, 20)); polarização =0; pausa; case B01000:case B01100:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (50, 0, 0)); polarização =-1; pausa; case B10000:case B11000:outlineCnt =0; pixels.setPixelColor (2, pixels.Color (200, 0, 0)); polarização =-2; pausa; padrão:Serial.println (a, BIN); esboçoCnt ++; pausa; } pixels.setPixelColor (0, pixels.Color (outlineCnt * 10, 0, 0)); if (outlineCnt> 10) {doDcSpeed (0,0); } else {float ff =150; float ctrl =calcPid (polarização); doDcSpeed (ff-ctrl, ff + ctrl); } pixels.show ();} float Kp =25; float Ki =0,15; float Kd =1200; erro de float, errorLast, erroInte; float calcPid (entrada de float) {float errorDiff; saída flutuante; erro =erro * 0,7 + entrada * 0,3; // filtro // erro =entrada; errorDiff =erro - errorLast; erroInte =restrição (erroInte + erro, -50, 50); saída =Kp * erro + Ki * erroInte + Kd * erroDiff; Serial.print (erro); Serial.print (''); Serial.print (erroInte); Serial.print (''); Serial.print (errorDiff); Serial.print (''); Serial.println (saída); errorLast =erro; retorno de saída;} int echoTrace () {int ret =0; int a [5]; para (int i =0; i <5; i ++) {a [i] =restrição ((1025 - analogRead (A0 + i)) / 10 - 4, 0, 20); if (a [i]> 2) ret + =(0x1 < LinefollowRobot
https://github.com/KittenBot/LinefollowRobot
Esquemas

Processo de manufatura
- O Futuro da Robótica
- Basquete
- Bola de golfe
- Tutorial - sPiRobot:controle e veja o que seu robô está vendo de qualquer lugar
- Automação:Linha do robô redesenhada
- Linha do robô SCARA expandida
- Robôs de linha de montagem:um guia definitivo
- Seguidor de linha industrial para fornecimento de materiais
- Controle PID da Garra do Robô em Matlab / Simulink
- Controle de qualidade da linha de embalagem automatizada