Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INTRODUCCION
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
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
5. ESQUEMA