Swift Dragon F4


Universidad del Valle

Introducción a la ingeniería electrónica

Julio Hernán Flores Acosta - 2170357

Fase 4: Robot seguidor de línea Swift Dragon (control de motores)


Puente H TB6612FNG:

Este driver permite controlar dos motores de manera independiente con una corriente constante de 1.2A (3.2A pico),al ser tan compacto es apto para el desarrollo de proyectos pequeños y que cuentan con poco  espacio, posee dos señales de entrada (IN1 y IN2) pueden ser usadas para controlar el motor en uno de cuatro modos posibles: CW(giro en sentido de las manecillas del reloj), CCW (en contra de las manecillas), short-brake y stop.la velocidad de cada motor es controlada mediante una señal PWM con una frecuencia de hasta 100kHz.



Características:


  • Chip: TB6612FNG (Toshiba)

  • Canales: 2 (soporta 2 motores DC o 1 motor PAP)

  • Voltaje de Potencia (VMOT): 5V - 15V

  • Voltaje Operación (VCC): 2.7V - 5.5V

  • Capacidad de corriente: 1.2A (picos de hasta 3A)
  • Potencia máxima disipada: 1W
  • Posee diodos internos de protección




Esquema puente HTB6612FNG

Diagrama de conexiones finales entre los diferentes componentes:


Código de programación Arduino para funcionamiento de motores de acuerdo con los valores censados.

Demostración funcionamiento del robot:


con la programación de este código en la placa de Arduino el robot ya es capaz de seguir una linea negra sobre una superficie blanca, aplicando los valores dados por los sensores y coordinando los motores con el driver lo que les permitiría ir adelante, girar a la derecha, izquierda según sea el caso,, generalmente realiza el recorrido sin problema, solo presentando alguna alteración cuando las curvas en la pista son cerradas o las líneas son discontinuas.

#include <QTRSensors.h> //PUENTE H int PWMA=5; int AIN2=6; int AIN1=7; int PWMB=11; int BIN2=10; int BIN1=9; int STANDBY=8; int LED=13; int P=0; int I=0; int D=0; int LAST=0; float vel; //VELOCIDAD int VelMax =57;

//sensores:

#define NUM_SENSORS 8 // number of sensors used #define TIMEOUT 2500 // waits for 2500 microseconds for sensor outputs to go low #define EMITTER_PIN 12 // emitter is controlled by digital pin 2 // ENTRADAS SENSORES QTRSensorsRC qtra((unsigned char[]) {A7, A6, A5, A4, A3, A2, A1, A0}, NUM_SENSORS, TIMEOUT, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS]; unsigned int position=0;


void setup() { pinMode(PWMA,OUTPUT); pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(PWMB,OUTPUT); pinMode(BIN1,OUTPUT); pinMode(BIN2,OUTPUT); pinMode(LED,OUTPUT); pinMode(STANDBY,OUTPUT); delay(1500); for (int j = 0; j <150; j++) { digitalWrite(LED, HIGH); delay(20); qtra.calibrate(); // reads all sensors 10 times at 2.5 ms (8 sensores) digitalWrite(LED, LOW); // turn off LED delay(20); } //APAGAMOS EL LED digitalWrite(LED, LOW); // ARANQUE DE LOS MOTORES digitalWrite(AIN1,LOW); digitalWrite(AIN2,HIGH); digitalWrite(BIN1,HIGH); digitalWrite(BIN2,LOW); analogWrite(PWMA,0); analogWrite(PWMB,0);


//HABILITA EL PUENTE H PARA SU FUNCIONAMIENTO

digitalWrite(STANDBY, HIGH); delay(4000); //IMPRIMIR VALORES 1 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() { //IMPRIMIR VALORES unsigned int position = qtra.readLine(sensorValues); 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(250); //LEEMOS LA SEÑAL DE LOS SENSORES qtra.read(sensorValues); position = qtra.readLine(sensorValues, QTR_EMITTERS_ON, 0); P = ((position)-(3500)); /// ERROR /////FRENOS//// if(P<-3500){ analogWrite(PWMA,200); // V MOTOR DERECHO analogWrite(PWMB,255); // V MOTOR IZQUIERDO digitalWrite(AIN1,LOW); ///DISMINUCION DEV, RETROCEDE digitalWrite(AIN2,HIGH); digitalWrite(BIN1,LOW); ///RETROCEDE digitalWrite(BIN2,HIGH); } else if (P>3500){ analogWrite(PWMA,255); // VMOTOR DERECHO analogWrite(PWMB,200); // V MOTOR IZQUIERDO digitalWrite(AIN1,HIGH); ///DISMINUCION DE V, RETROCEDE digitalWrite(AIN2,LOW); digitalWrite(BIN1,HIGH); ///FRENTE digitalWrite(BIN2,LOW); } ///////////////////////// else{ D= (P - LAST); /// ERROR MENOS EL ERROR ANTERIOR I=(P+ LAST); //INTEGRAL vel=(P*0.02)+(D*1.20)+(I*0.0052); if(vel >VelMax) vel=VelMax; if(vel<-VelMax) vel=-VelMax; analogWrite(PWMA,VelMax-vel); // VELOCIDAD MOTOR DERECHO analogWrite(PWMB,VelMax+vel); // VELOCIDAD MOTOR IZQUIERDO digitalWrite(AIN1,LOW); ///FRENTE digitalWrite(AIN2,HIGH); digitalWrite(BIN1,HIGH); ///FRENTE digitalWrite(BIN2,LOW); LAST=P; } }

















Comentarios

Entradas populares de este blog

Robot laberinto Kastelean

Fase 4 Robot seguidor de linea

FASE 2 ROBOT SEGUIDOR DE LINEA