martes, 29 de noviembre de 2016

Robot Velocista QTR8A (Parte II - Manejando Sensores y Motores)

 Manejando Sensores QTR8A


1. Manejando Sensor QTR8A con la libreria

Uso de librería Qtr8a en Arduino:


  • https://www.pololu.com/product/960/resources (mayor información)
  • Descargar la librería desde aquí : https://mega.nz/#F!78FVmD7Q!auGJgTr0Muo9qkNtl9CuLA
  • Una vez descargado instalar la librería de modo convencional en arduino: Copiar y pegar en la carpeta “librerías” de la carpeta donde esta instalado arduino.
  • Generalmente en esta dirección esta instalada C:\Program Files (x86)\Arduino\libraries
Descargar, descomprimir y copiar .

Ubicar la dirección donde se instalo arduino y buscar la carpeta libraries, y pergar la libreria QTRSensors.


La conexión sera la siguiente: 



  • La librería contiene un ejemplo básico de uso de los sensores
  • “QTRAExample”, abrirla y experimentar…


Configurando pines para uso de sensores Qtr8a :

Como estamos usando la regleta que trae 8 sensores, entonces debemos configurarlo para usar los 8 sensores, ya que por defecto esta configurado para usar 6, en esta imagen se muestra como configurarlo correctamente de acuerdo a las conexiones que se tienen en arduino de la imagen previa.


El código completo :
/////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <QTRSensors.h>

#define NUM_SENSORS             8  // number of sensors used
#define NUM_SAMPLES_PER_SENSOR  4  // average 4 analog samples per sensor reading
#define EMITTER_PIN             9  // emitter is controlled by digital pin 2

// sensors 0 through 5 are connected to analog inputs 0 through 5, respectively
QTRSensorsAnalog qtra((unsigned char[]) {7, 6, 5, 4, 3, 2, 1, 0}, 
  NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];


void setup()
{
  delay(500);
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);    // turn on Arduino's LED to indicate we are in calibration mode
  for (int i = 0; i < 400; i++)  // make the calibration take about 10 seconds
  {
    qtra.calibrate();       // reads all sensors 10 times at 2.5 ms per six sensors (i.e. ~25 ms per call)
  }
  digitalWrite(13, LOW);     // turn off Arduino's LED to indicate we are through with calibration

  // print the calibration minimum values measured when emitters were on
  Serial.begin(9600);
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtra.calibratedMinimumOn[i]);
    Serial.print(' ');
  }
  Serial.println();
  
  // print the calibration maximum values measured when emitters were on
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtra.calibratedMaximumOn[i]);
    Serial.print(' ');
  }
  Serial.println();
  Serial.println();
  delay(1000);
}


void loop()
{
  unsigned int position = qtra.readLine(sensorValues);
  
  // print the sensor values as numbers from 0 to 1000, where 0 means maximum reflectance and
  // 1000 means minimum reflectance, followed by the line position
  for (unsigned char i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(sensorValues[i]);
    Serial.print('\t');
  }
  //Serial.println(); // uncomment this line if you are using raw values
  Serial.println(position); // comment this line out if you are using raw values
  
  delay(50);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



Calibración

  • Previamente, para poder utilizar los sensores es necesario hacer una rutina de calibración, esto  durante algunos segundos. esto hace que la librería procese los datos de sensado, y muestre valores correctos.
  • En el proceso de calibración es necesario pasar repetidas veces los sensores sobre la línea negra y luego sobre la superficie blanca si levantar los sensores.
  • Se recomienda hacer la calibración de manera a una distancia constante sobre la superficie.
Lo que hace este código ejemplo es hacer uso de la librería QTRSensors ,se  obtienen los datos  de los sensores, que son las 8 primeras columnas. La 9na columna son los datos de posición relativa del sensor que vas desde 0 hasta 7000, en donde el centro se encuentra en 3500 a este valor le llamaremos set point. Este valore nos sera util para utilizar el algoritmo PID que controlara al Robot. Ademas se puede notar que cuando los sensores estan posicionados en la linea negra, los valores de sensado unitario incrementan alrededor de 800 a 1000 y cuando están sobre superficie blanca los valores son 0. Para visualizar estos datos se tiene que Abrir el monitor serie de Arduino.

 funciones de la librería Qtr8a

  • qtra.calibrate();  
                   Primera función a ser llamada, antes de usar los sensores, hace calibración de sensores                       (debe usarse un tiempo adecuado)
  • qtra.read(sensorValues);
                    Hace lectura de cada sensor y los guarda en matriz “sensorValues[ ];”
                    Rango de lectura de cada sensor : 0 a 1000.
  • int position = qtra.readLine(sensorValues);
                     Esta función devolverá la posición de sensores (necesario  PID)


2. Manejando Motores 

La conexión es la siguiente:

Ya hice un post para manejar este tipo de driver con arduino pueden verlo aca:  http://aprendiendofacilelectronica.blogspot.pe/2016/11/control-de-motores-dc-con-modulo-driver.html

Simplemente lo que haremos aca es utilizar otros pines con arduino  definiendolos nuevamente y listo, el programa de control de motores para el velocista  esta aqui:

///////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define mi1        3
#define mi2        4
#define pwmi       6
#define md1        8
#define md2        7
#define pwmd       5

void setup() 
{
  pinMode(mi1,OUTPUT);
  pinMode(mi2,OUTPUT);
  pinMode(md1,OUTPUT);
  pinMode(md2,OUTPUT);
}

void loop()
{
  motores(100,100);
}

void motores(int motor_izq, int motor_der)
{
  if( motor_izq >=0)
    {
      digitalWrite (mi1,HIGH);
      digitalWrite (mi2,LOW);
      analogWrite (pwmi,motor_izq);
    }
  else
    {
      digitalWrite(mi1,LOW);
      digitalWrite(mi2,HIGH);
      motor_izq = motor_izq*(-1);
      analogWrite(pwmi,motor_izq); 
    }
  if(motor_der>=0)
    {
      digitalWrite(md1,HIGH);
      digitalWrite(md2,LOW);
      analogWrite(pwmd,motor_der);
  }
  else
     {
      digitalWrite(md1,LOW);
      digitalWrite(md2,HIGH);
      motor_der=motor_der*(-1);
      analogWrite(pwmd,motor_der);    
     }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////









Anterior post << Materiales
Siguiente post >> Programacion PID Robot

3 comentarios:

Excelente post, me ayudastes mucho

excelente amigo muy buena informacion me esta ayudando bastante con mi proyecto de mi seguidor

¿que color de cinta sigue este sensor?, es decir cinta negra o blanca, ¿funciona la programación con qtr8rc?

Publicar un comentario