Está en la página 1de 7

PRACTICA 2

ENCODER CON ARDUINO

OBJETIVO:
Controlar el movimiento de un motor utilizando un encoder por medio de
interrupciones utilizando Arduino.

INTRODUCCIÓN:
Existen diferentes tipos de encoders, su función principal es generar pulsos para que
sean la señal de control para un sistema digital.

EL ALUMNO DEBE AMPLIAR LA INTRODUCCIÓN REFERENTE AL TEMA

TRABAJO PREVIO.
1. Investigar la relación de engranaje en un motorreductor con encoder
2. Investigar como se puede calcular las revoluciones por minuto (rpm) utilizando
las señales del encoder
3. Analizar los programas que están en la tabla 2.1, 2.2 y 2.3

4. MATERIAL Y EQUIPO A UTILIZAR:


MATERIAL:
Cantidad Descripción
1 Arduino
1 Cable usb
8 Conectores
1 Módulo L298
1 Potenciómetro de 10 K

1 Motorreductor con encoder


1 pinzas de punta y corte
1 Protoboard

EQUIPO DE LABORATORIO
1 Fuente
1 osciloscopio
DESARROLLO:
1. Realice las conexiones del encoder del motor al Arduino (figura 2.1) conforme a las
hojas de datos de los motores, puede guiarse por los colores de los cables

Figura 2.1 Conexiones del encoder del motorreductor con Arduino

2. Cargue el programa que se muestra en la tabla 2.1


Tabla 2.1 Programa
#define ENCA 2 // Yellow
#define ENCB 3 // White

void setup() {
Serial.begin(9600);
pinMode(ENCA,INPUT);
pinMode(ENCB,INPUT);
}

void loop() {
int a = digitalRead(ENCA);
int b = digitalRead(ENCB);
Serial.print(a*5);
Serial.print(" ");
Serial.print(b*5);
Serial.println();
delay(10);
}

3. Abra en Arduino la herramienta de serial plotter, ubique el disco magnético en el


motor y manualmente gire el disco de manera lenta y continua en un sentido y
verifique las señales, después gire en sentido contrario, obtenga evidencias
4. Aplique un voltaje de 9 volts y obtenga las señales de las salidas del encoder con el
osciloscopio, obtenga evidencias.
5. A Cuantas revoluciones por minuto esta funcionando el motor = ________
6. Cargue el programa que se muestra en la tabla 2.2
#include <util/atomic.h>
#define ENCA 2 // YELLOW
#define ENCB 3 // WHITE
volatile int posi = 0;
//configuración del micro
void setup() {
Serial.begin(9600);
pinMode(ENCA,INPUT);
pinMode(ENCB,INPUT);
attachInterrupt(digitalPinToInterrupt(ENCA),readEncoder,RISING);
}
//inicia programa principal
void loop() {
int pos = 0;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
pos = posi;
}

Serial.println(pos);
//delay(500);
}

void readEncoder(){
int b = digitalRead(ENCB);
if(b > 0){
posi++;
}
else{
posi--;
}
}

7. Abra el monitor serial, mueva el disco magnético en un sentido y verifique que aumenta
el contador o disminuye si se mueve en sentido contrario, obtenga evidencias
8. Realice las conexiones del encoder del motor al Arduino (figura 2.2) conforme a las
hojas de datos de los motores, puede guiarse por los colores de los cables
Figura 2.2 Conexiones del encoder del motorreductor con Arduino

9. Cargue el programa que se muestra en la tabla 2.3


Tabla 2.3 Programa
#include <util/atomic.h> // For the ATOMIC_BLOCK macro
#define ENCA 2 // YELLOW
#define ENCB 3 // WHITE
#define PWM 5
#define IN2 11
#define IN1 10

volatile int posi = 0; //


long prevT = 0;
float eprev = 0;
float eintegral = 0;

void setup() {
Serial.begin(9600);
pinMode(ENCA,INPUT);
pinMode(ENCB,INPUT);
attachInterrupt(digitalPinToInterrupt(ENCA),readEncoder,RISING);

pinMode(PWM,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);

Serial.println("target pos");
}

void loop() {

// set target position


//int target = 600;
//int target = 250*sin(prevT/1e6);
int target=analogRead(A1);
// PID constants
float kp = 1;
float kd = 0.025;
float ki = 0.01;

// time difference
long currT = micros();
float deltaT = ((float) (currT - prevT))/( 1.0e6 );
prevT = currT;

// Read the position in an atomic block to avoid a potential


// misread if the interrupt coincides with this code running
// see:
https://www.arduino.cc/reference/en/language/variables/variable-
//scope-qualifiers/volatile/
int pos = 0;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
pos = posi;
}

// error
int e = pos - target;

// derivative
float dedt = (e-eprev)/(deltaT);

// integral
eintegral = eintegral + e*deltaT;

// control signal
float u = kp*e + kd*dedt + ki*eintegral;

// motor power
float pwr = fabs(u);
if( pwr > 255 ){
pwr = 255;
}

// motor direction
int dir = 1;
if(u<0){
dir = -1;
}

// signal the motor


setMotor(dir,pwr,PWM,IN1,IN2);

// store previous error


eprev = e;

Serial.print(target);
Serial.print(" ");
Serial.print(pos);
Serial.println();
//delay(100);
}

void setMotor(int dir, int pwmVal, int pwm, int in1, int in2){
analogWrite(pwm,pwmVal);
if(dir == 1){
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
}
else if(dir == -1){
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
}
else{
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
}
}

void readEncoder(){
int b = digitalRead(ENCB);
if(b > 0){
posi++;
}
else{
posi--;
}
}
10. Identifique cual es el setpoint en el programa, para modificar el valor de pulsos donde
se desea que motor se mantenga en una posición, obtenga evidencias, trate de
realizar una perturbación para modificar la posición y compruebe que regresa a la
posición deseada, obtenga evidencias
11. Abra la herramienta serial plotter, compruebe funcionamiento
12. Realice un reset al Arduino (presione el botón de reset) y obtenga la gráfica de la
respuesta a un escalón, mida el tiempo de establecimiento.

COMENTARIOS:
REFERENCIAS
Requerida
• Manual Arduino.

También podría gustarte