Está en la página 1de 3

1.

INTRODUCCION

En este proyecto se realizara el control de posición de un motor dc utilizando un encoder de tipo


incremental como un sensor de posición e insertando valores (grados) desde el monitor serial del
programa de arduino, este proyecto podrá utilizarse como un servo motor aunque no tendrá la misma
precisión ,para esto será necesario la implementación de de dos engranajes de iguales diámetros y por
ultimo se utilizara un controlador para el sentido de giro del motor.

2. MATERIALES

• Arduino UNO
•Encoder KY-040
• Motor DC
• Engranajes 2
•Conectores
• Fuente de alimentación
• Puente H (L298N)

3. OBJETIVOS GENERALES
Realizar el control de posición de un motor DC utilizando encoder incremental y monitor serial

3.1 OBJETIVOS ESPECÍFICOS

• Realizar el armado del circuito


• Realizar el conexionado del circuito
• Realizar el código de control en el programa Arduino
•Realizar la prueba del funcionamiento

4. CODIGO
int x = 3; //para controlar la rotacion izq
int y = 4; //para controlar la rotacion der
int angulo_deseado,ang;
int pwm=6;
boolean LECT = true; //verdadero intenta leer la serie
int A =2 ; //variable A a pin digital 2 (DT en modulo)
int B =5 ; //variable B a pin digital 4 (CLK en modulo)
int ANT = 0; // almacena valor anterior de la variable contador
volatile int contador = 0;

void setup() {
Serial.begin(9600);
pinMode(x, OUTPUT); //conectado al pin IN1 del controlador del motor
pinMode(y, OUTPUT); //conectado al pin IN2 del controlador del motor
pinMode(A, INPUT); //canal A como entrada
pinMode(B, INPUT); //canal B como entrada
Serial.print("INGRESE GRADOS ");
attachInterrupt(digitalPinToInterrupt(A), encoder, LOW);// interrupcion sobre pin A con funcion ISR
encoder y modo LOW

}
void giroDER() {
digitalWrite(x, LOW);
digitalWrite(y, HIGH);
}
void giroIZQ() {
digitalWrite(x, HIGH);
digitalWrite(y, LOW);
}
void APAGAR() {
digitalWrite(x, LOW);
digitalWrite(y, LOW);
}
void loop() {
if (contador != ANT){
ANT=contador;
}
analogWrite(pwm,210);

if (LECT) {
if (Serial.available() > 0) {
angulo_deseado = -1;
angulo_deseado =Serial.parseInt();
if(angulo_deseado != (-1))
{
LECT = false;
}
}
} else {
Serial.print("Angulo deseado : ");
Serial.print(angulo_deseado);
Serial.print(" VALOR DEL ENCODER.: ");
Serial.println(ang);

if(ang>angulo_deseado){
giroDER();
}else
if (ang<angulo_deseado)
{
giroIZQ();
}else{
APAGAR();
LECT=true;
}
}
}
void encoder() {
static unsigned long ultimaInterrupcion = 0; // variable static con ultimo valor de
// tiempo de interrupcion
unsigned long tiempoInterrupcion = millis(); // variable almacena valor de func. millis

if (tiempoInterrupcion - ultimaInterrupcion > 5) { // rutina antirebote desestima


// pulsos menores a 5 mseg.
if (digitalRead(B) == HIGH) // si B es HIGH, sentido horario
{
contador++ ; // incrementa POSICION en 1
}
else { // si B es LOW, senti anti horario
contador--; // decrementa POSICION en 1
}
contador= min(20, max(0, contador)); // establece limite inferior de 0 y
// superior de 20 para contador
ang=map(contador,0,20,0,360);
ultimaInterrupcion = tiempoInterrupcion; // guarda valor actualizado del tiempo
} // de la interrupcion
}

5. ESQUEMA

También podría gustarte