Pages: [1]   Go Down
Author Topic: Ayuda con codigo para seguidor de linea  (Read 10032 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿¿¿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:
http://bit.ly/LVGqNL
http://bit.ly/LVGwoF

Si es lo segundo....¿Por cuánto?  smiley-money smiley-money smiley-money smiley-money smiley-money smiley-money

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 smiley-wink
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
// 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().
« Last Edit: June 29, 2012, 01:36:01 pm by JRodrigo » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Gracias por las respuestas
Logged

COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 191
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
  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.
Logged

Donostia
Offline Offline
God Member
*****
Karma: 3
Posts: 744
elektronikadonbosco
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
http://elektronikadonbosco.blogspot.com.es/2012/04/control-de-motor-dc-con-arduino.html

Salu2
Logged

0
Offline Offline
God Member
*****
Karma: 1
Posts: 524
Arduino inside
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
analogWrite( numero_pin, valor );

donde valor va de 0 a 255.

Te recomiendo la lectura del tutorial de pwm.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: