Seguidor de linha com Arduino

O leitor Gustavo me pediu um código para um robô seguidor de linha usando arduino.

Não tenho um código pronto para um seguidor de linha. Porque nunca fiz um…

Imagino que você precise ter um LDR de cada lado do robô que ficará na parte branca, enquanto a linha preta passa no meio dos dois, é preciso ter pelo menos um led embaixo do robô para calcular o input do LDR.

Recomendo fazer duas funções, uma para ajuste para esquerda e uma para direita.

Aí basicamente o código vai ser ler os dois LDRs e ver se algum deles está em cima do preto, se estiver usa a função de ajuste. Não tenho como ajudar com a leitura dos LDR porque cada robô vai ter valores diferentes dependendo de onde estão os leds, tipo do chassis (se passa luz por ele ou não), posição dos LDRs e os LDRs e dos resistores/circuito usado.

Para fazer um seguidor de linha, imagino que seja o seguinte:

Basicamente escolha dois pinos analógicos para os LDRs. Configure os pinMode para INPUT nos dois LDRs.

Leia os dois com analogRead e guarde o valor dos dois.

Aí entra a parte de cada robô é diferente… Os valores de seus LDRs no preto e no branco vão variar de robô para robô, você precisa testar com seu chassis pronto para ter o valor real.

Aí você faz um IF para ver se está no preto ou branco (dependendo dos valores do seu teste), se estiver no preto ajuste para o lado contrário ao lado do LDR, o ajuste também depende do tamanho do chassis, então recomento um método de ajuste que receba como parâmetro um inteiro que representará quantos milisegundos o motor ficará ligado ajustando a posição…

Aí é só sintonia fina…. ir mudando os valores dos LDRs e os milisegundos de motor ligado até ficar bala.

Segue um esboço de código de exemplo, to usando o setup do L293D – Circuito Integrado de Dupla Ponte H como base para os motores, é um código teórico nunca usei na prática, e outra como não tenho um Arduino aqui comigo, não sei se está compilando, qualquer coisa me deem um toque:

    int tempoEmAjuste = 100;
    int LDRThreshold = 127;
    
    void Setup()
	{
        pinMode(11, OUTPUT);
        pinMode(10, OUTPUT);
        pinMode(6, OUTPUT);
        pinMode(5, OUTPUT);

        pinMode(0, INPUT);//LDR DIREITA
        pinMode(1, INPUT);//LDR ESQUERDA
	}


    void Loop()
    {
        int valLDRDireita = analogRead(0);
        int valLDREsquerda = analogRead(1);

        if (valLDRDireita < LDRThreshold)
        {
            esquerda(tempoEmAjuste);
        }
        else
        {
            if (valLDREsquerda < LDRThreshold)
            {
                direita(tempoEmAjuste);
            }
            else
            {
                frente(tempoEmAjuste);//Esse tempo pode ser quanto quiser...
            }
        }
    }

    void parar()
    {
        digitalWrite(11, LOW);
        digitalWrite(10, LOW);
        digitalWrite(6, LOW);
        digitalWrite(5, LOW);
    }

    void frente(int milis)
    {
        digitalWrite(11, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(5, LOW);
        digitalWrite(10, LOW);
        delay(milis);
    }

    void re(int milis)
    {
        digitalWrite(11, LOW);
        digitalWrite(6, LOW);
        digitalWrite(5, HIGH);
        digitalWrite(10, HIGH);
        delay(milis);
    }

    void direita(int milis)
    {
        digitalWrite(11, HIGH);
        digitalWrite(10, LOW);
        digitalWrite(6, LOW);
        digitalWrite(5, HIGH);
        delay(milis);
    }

    void esquerda(int milis)
    {
        digitalWrite(11, LOW);
        digitalWrite(10, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(5, LOW);
        delay(milis);
    }

Abraço!

This entry was posted in Arduino. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>