Ayuda con codigo para seguidor de linea

Ayuda quiero que me guien en el codigo de un seguidor de linea modalidad velocista, la mecanica es la siguiente.

El robot consta de dos sensores qrd1114, que estos deberan mover a un solo motor que es utilizado como traccion del robot (como se ve en la imagen) y este es controlado con un driver L293B.

A me olvidaba de lo mas importante el robot sigue una linea negra.

De antemago mil gracias por todos los que quieran aportar algo para mi seguidor

¿¿¿Quieres que te ayuden o quieres que te lo hagan???

Si es lo primero (espero), ¿en qué estado se encuentra tu proyecto? A parte de "decidir" que sensores y que motor/driver usar, ¿qué más tienes? ¿Has realizado alguna prueba? ¿Has montado algo? ....

Si no has llegado al punto de contestar afirmativamente a esas preguntas, empiezas a pedir ayuda muuuuuuuyyyy pronto. En este caso, aqui tienes un par de links:

Si es lo segundo....¿Por cuánto? $) $) $) $) $) $)

PD: Supongo que la foto es de lo que esperas conseguir, no de lo que ya tienes, porque sino no sé que te puede faltar :wink:

1 Like

Mi amigo la foto que subi son los avances que tengo en el proyecto del seguidor toda la extructura la tengo acabada en un 90%, mi problema es el codigo o como tomar el valor de los sensores qrd1114 y tener el control del driver bien, yo estaba tratando de hacer el siguiente condigo pero no funciona bien.

float qrdizq;
float qrdder;
int qrd1 = 1;
int qrd3 = 3;
int moizq = 4;
int moder = 5;

void setup(){

pinMode(moizq, OUTPUT);
pinMode(moder, OUTPUT);
Serial.begin(9600);
}

void loop(){

qrdizq = analogRead(qrd1);
//Entrada analogica 1 sensor 1

qrdder = analogRead(qrd3);
//Entrada analogica 3 sensor 2

//Control de giro del sensor 1 qrdizq

if (qrdizq >= 300)
{
digitalWrite(moizq, HIGH);
}
else
{
digitalWrite(moder, LOW);
}

//Control de giro del sensor 2 qrdder

if (qrdder <= 300)
{
digitalWrite(moder, HIGH);
}
else
{
digitalWrite(moizq, LOW);
}

//Imprimeindo en el terminal

// Actualizando cada segundo
Serial.println(qrdizq);
Serial.println(qrdder);
delay(1000);
}

La forma que tomo en la lectura de los sensores es por medio del terminal, alguien me ayude de favor como hacer el codigo bien, gracias de antemano por sus respuestas.

// Actualizando cada segundo
Serial.println(qrdizq);
Serial.println(qrdder);
delay(1000);

Esta parte para mi no esta bien por que ese delay hace que solo sea capaz de modificar su trayectoria una vez cada segundo. Te recomiendo si quieres tener la maxima velocidad de procesamiento en un robot no utilices delay's utiliza la función millis().

Y en la logica de los sensores me recomiendan hacer un cambio o utilizar alguna otra variable

Gracias por las respuestas

Para suavizar los movimientos puedes utilizar el analogWrite() [PWM] para en vez de que pare el motor de golpe vaya más lento hasta parar.

Como en cualquier lectura de un sensor, yo te recomendaría que hicieses varias lecturas y calculases una media para obtener el valor "resultado" con el que vas a trabajar.

Como te han dicho, lo más importante de ese código es que quites el delay y no utilices ninguno, ya que eso "para" la ejecución del código y dejas sin control el robot durante ese segundo. Si quieres ver como hacer una temporización sin delays, hay un ejemplo en el IDE "blink without delay" donde lo importante está en:

  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) 
  {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   
    // Codigo que se ejecuta cada "interval" de tiempo
  }

En cuanto al motor, no dices que tipo de motor utilizas ni como lo has conectado, con lo cual no se sabe si lo estás controlando bien o no.

Como te dije en el primer post, si ese es tu robot, antes de montar todo deberías haber ido probando cada cosa por separado para saber como controlarlas y después ir juntandolas y probandolas juntas. Si lo tienes todo montado y no lo has probado, ahora no vas a saber si el fallo está en el software o en el hardware, por no decir que no sabes como controlar cada una de las partes.

Como te comenta Jrodrigo lo ideal sería usar PWM. La teoría la tengo explicada aquí, es la teoría faltaría pasar de la teoría al código para Arduino aunque es un salto muy pequeño.

Salu2

podrías pensar en poner 2 o 3 sensores más, aunque con dos puede que te valga.

Mis amigos disculpen el no poder indicado avances esta semana la verdad que e comensado examenes y no me queda tiempo para nada bueno vamos al punto el problema es que el seguidor se me descontrola al rato de estar yendo bien.... me pedrian decir como implemento en control pwm teniendo en cuenta que solo utilizo un solo motor de direccion como se ve en las fotografias

float qrdizq;
float qrdder;

int qrd1 = 4;
int qrd3 = 5;
int moizq = 0;
int moder = 1;

void setup(){
pinMode(moizq, OUTPUT);
pinMode(moder, OUTPUT);
}

void loop(){

qrdizq = analogRead(qrd1);
qrdder = analogRead(qrd3);

//Control de giro del sensor 2 qrdder
if (qrdder >= 400)
{
digitalWrite(moder, HIGH);
}
else
{
digitalWrite(moder, LOW);
}
//Control de giro del sensor 1 qrdizq
if (qrdizq <= 400)
{
digitalWrite(moizq, HIGH);
}
else
{
digitalWrite(moizq, LOW);
}

delay(50);
}[/table]

El pwm en arduino se usa con los pines digitales marcados como tal y con la instrucción

analogWrite( numero_pin, valor );

donde valor va de 0 a 255.

Te recomiendo la lectura del tutorial de pwm.

buenas. soy novato en esto de los arduinos. estoy intentando programar un arduino para ser seguidor de linea, pero tengo el problema que en las curvas el se demora para sensar y pasa derecho hasta lo blanco.

agradezco la ayuda que me puedan brindar.

necesito ayuda no se como programar los sensores qrd1114 en un seguidor de linea

me han dicho que tiene que tomarse la lectura de los sensores y en base a eso convertir la lectura a 1 y a 0