Sensor de linha no robô seguidor: calibrar no chão real para ele não sair da pista
Entenda que o sensor mede reflexão, calibre mínimo e máximo de cada sensor na pista real, escolha o limiar pelo meio e confira o contraste antes de culpar o código.
No vídeo, o robô segue a fita preta com elegância. No piso da sua sala, ele passa reto por cima dela, ou fica girando no lugar. O código é o mesmo, os sensores também. O sensor de linha não enxerga a fita: ele mede quanta luz infravermelha volta do chão. Piso, iluminação e altura do sensor mudam esse número, e o limiar que funcionava na mesa do vídeo não funciona na sua pista.
A resposta curta: leia o valor analógico de cada sensor em cima da linha e fora dela, na pista onde o robô vai andar, e use como limiar o ponto do meio. Melhor ainda, faça o robô se calibrar sozinho nos primeiros segundos, guardando o mínimo e o máximo de cada sensor. Se a distância entre os dois for pequena, o problema é contraste, não código.
Por que o robô ignora a linha
Os módulos mais comuns usam um par infravermelho, como o TCRT5000: um LED emite infravermelho para baixo e um fototransistor ao lado mede o que volta. Superfície clara reflete muito; superfície escura absorve. A leitura é uma tensão que varia com a reflexão. Num módulo típico, mais reflexão faz a tensão cair, então a linha preta dá valores altos e o chão claro dá valores baixos. Confira no seu: a polaridade depende do circuito do módulo.
Três coisas mudam essa leitura sem que a linha mude:
- A luz do ambiente. O sol tem muito infravermelho, e uma janela aberta pode encher o sensor de luz que não veio do LED.
- A altura. O par funciona a poucos milímetros do chão. Alguns milímetros a mais, e a diferença entre preto e branco encolhe até sumir.
- O material. Fita isolante brilhante pode refletir mais infravermelho do que parece aos olhos; piso escuro pode refletir quase tanto quanto a fita.
Muitos módulos também têm uma saída digital, com um comparador e um trimpot que define o limiar. Ela funciona, mas o limiar fica escondido num parafuso. A saída analógica mostra o número e deixa a calibração no código, onde dá para ver e repetir.
A calibração que o vídeo não mostra
O exemplo que vai atravessar o texto: um robô com três sensores analógicos, esquerdo no A0, central no A1 e direito no A2, numa pista de fita preta fosca sobre piso de cerâmica bege. As leituras medidas na pista real foram estas:
esquerdo central direito
na fita 870 905 880
no piso 160 140 175
limiar 515 522 527 (média entre fita e piso)
Cada sensor tem números ligeiramente diferentes, por diferença de fabricação e de altura. Por isso cada um ganha o próprio limiar. Um limiar único para os três funciona até o dia em que um sensor está um milímetro mais alto.
Calibração automática nos primeiros segundos
- Coloque o robô sobre a linha.
- Ligue e, durante os 4 segundos de calibração, deslize o robô de um lado para o outro de modo que cada sensor passe pela fita e pelo piso.
- Leia no monitor serial o mínimo, o máximo e o contraste de cada sensor.
- Se algum contraste vier abaixo de 200, ajuste a altura ou troque a fita antes de continuar.
const int NUM_SENSORES = 3;
const int SENSORES[NUM_SENSORES] = {A0, A1, A2};
const bool PRETO_DA_VALOR_ALTO = true; // confira no seu módulo
const int CONTRASTE_MINIMO = 200;
int minimo[NUM_SENSORES];
int maximo[NUM_SENSORES];
void calibrar(unsigned long duracaoMs) {
for (int i = 0; i < NUM_SENSORES; i++) {
minimo[i] = 1023;
maximo[i] = 0;
}
unsigned long inicio = millis();
while (millis() - inicio < duracaoMs) {
for (int i = 0; i < NUM_SENSORES; i++) {
int v = analogRead(SENSORES[i]);
if (v < minimo[i]) minimo[i] = v;
if (v > maximo[i]) maximo[i] = v;
}
}
}
bool sobreALinha(int i) {
int v = analogRead(SENSORES[i]);
int limiar = (minimo[i] + maximo[i]) / 2;
return PRETO_DA_VALOR_ALTO ? (v > limiar) : (v < limiar);
}
void setup() {
Serial.begin(9600);
Serial.println("Calibrando: deslize o robo sobre a linha por 4 s.");
calibrar(4000);
for (int i = 0; i < NUM_SENSORES; i++) {
int contraste = maximo[i] - minimo[i];
Serial.print("sensor ");
Serial.print(i);
Serial.print(" min=");
Serial.print(minimo[i]);
Serial.print(" max=");
Serial.print(maximo[i]);
Serial.print(" contraste=");
Serial.print(contraste);
Serial.println(contraste < CONTRASTE_MINIMO ? " POUCO CONTRASTE" : "");
}
}
void loop() {
bool esq = sobreALinha(0);
bool centro = sobreALinha(1);
bool dir = sobreALinha(2);
if (centro && !esq && !dir) {
Serial.println("reto");
} else if (esq) {
Serial.println("corrigir para a esquerda");
} else if (dir) {
Serial.println("corrigir para a direita");
} else {
Serial.println("linha perdida");
}
delay(100);
}
As mensagens no monitor permitem testar a lógica com o robô na mão, antes de ligar os motores. Depois, troque cada Serial.println pelas funções de movimento; o controle de sentido e velocidade de cada roda está em motor DC no Arduino com ponte H.
Um sensor, dois ou três
Com um sensor só, o robô sabe apenas "estou em cima" ou "não estou". Quando sai da linha, não sabe para que lado corrigir. Com dois, um de cada lado da fita, ele sabe para onde a linha escapou. Com três ou mais, distingue reta, curva suave e curva fechada, e consegue guardar o último lado em que viu a linha para tentar reencontrá-la quando todos leem piso. É isso que o ramo "linha perdida" deveria fazer num robô de verdade: virar para o último lado conhecido, não parar no meio da sala.
Teste com a luz acesa e apagada
Depois de calibrar, apague a luz da sala, ou abra a cortina, e rode de novo. Se o comportamento muda, a calibração era da lâmpada, não da pista. As soluções são físicas: uma saia de papelão preto ao redor dos sensores bloqueia a luz lateral, e baixar os sensores aumenta a parte da leitura que vem do LED. O mesmo raciocínio de escolher a faixa útil antes de mexer no código aparece no sensor de luz LDR.
Erros comuns
- Copiar o limiar do tutorial: o piso e a luz do vídeo não são os seus, e o robô ignora a linha.
- Um limiar para todos os sensores: diferenças pequenas de altura fazem um deles nunca ver a fita.
- Sensores altos demais: o contraste encolhe e qualquer variação do piso parece linha.
- Calibrar com sol na janela e testar à noite: o infravermelho do ambiente mudou e o limiar ficou no lugar errado.
- Usar só a saída digital sem olhar os números: o ajuste vira girar trimpot no escuro.
- Parar quando perde a linha: sem memória do último lado, o robô não volta para a pista.
Checklist
- Leu os valores analógicos de cada sensor sobre a fita e sobre o piso real.
- Sabe se, no seu módulo, preto dá valor alto ou baixo.
- Cada sensor tem o próprio limiar, calculado pelo meio entre mínimo e máximo.
- O contraste de todos os sensores passa de 200 passos.
- A altura dos sensores é a mesma e fica a poucos milímetros do chão.
- Testou com luz acesa, apagada e com a janela aberta.
- O código sabe o que fazer quando nenhum sensor vê a linha.
Ponha o robô sobre a fita e depois sobre o piso, e anote os dois números do sensor central. Qual é a distância entre eles? Se forem vizinhos, nenhuma linha de código vai criar o contraste que a pista não tem.
Referência: http://labdeeletronica.com.br/sensor-de-linha-arduino/