Proyecto Final
FASE 5:
Robot Seguidor de Linea.
1. COMPETENCIA ESPECIFICA DE LA SESIÓN
2. MATERIALES Y EQUIPO
3. MARCO TEÓRICO:
El código completo :
4. EVIDENCIA DE TAREAS EN LABORATORIO:
5. RECOMENDACIONES:
6. CONCLUSIONES
7. FOTO GRUPAL
- Elaboración y programación de un robot velocista para competiciones.
- Aplicar los conocimientos obtenidos previamente
- Hacer uso de Arduino para la elaboracion del proyecto
2. MATERIALES Y EQUIPO
- QTR 8RC
- ARDUINO (nano, mini pro, micro, uno, mega)
- Micro Metal Gearmotor
- Driver de motor
- Solarbotics RW2
- Baterias
- BALL CASTER 3/8
- BRAKETS
- CAPACITORES
- PCB-CHASIS
- LEDS :
- PULSADORES
- RESISTENCIAS
- SWITCH
- POTENCIOMETRO
3. MARCO TEÓRICO:
1. Manejando Sensor QTR8A con la libreria
Uso de librería Qtr8a en Arduino
La conexión sera la siguiente:
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 :
/////////
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#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);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #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.
2. Manejando Motores
La conexión es la siguiente:
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #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); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
5. RECOMENDACIONES:
- Una recomendación que les podría dar es que pueden utilizar los pines ademas los analógicos (A0, A1, A2, A3, A4, A5) del arduino para las lecturas de los sensores, ya que estos no cuentan con módulos extras como el que traen los pines digitales como , pwm, interrupción, de comunicación serial , spi, etc.
- Para un robot velocista de competencias (que por lo general son muy livianos) es recomendable utilizar un arduino nano o mini pro.
- Previamente, para poder utilizar los sensores es necesario hacer una rutina de calibración
6. CONCLUSIONES
- En el caso del pines analógico A6 y A7 del arduino nano o minipro, no es posible configurarse como pines digitale, pues según el datasheet estos pines solo son bypasses analógico, por lo que solo es posible utilizarse para lecturas analógicas.
- Hasta la fecha no existe un microcontrolador que sea capas de entregar mas de 100mA, por lo que el driver de motor seguirá siendo una opción obligatoria.
- Se debe descargar la libreria del sensor QTR8A ya que no viene con el arduino por defecto.
7. FOTO GRUPAL
No hay comentarios.:
Publicar un comentario