Está en la página 1de 7

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERA (FAIN)

ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y SISTEMAS (ESIS)


CURSO : ROBOTICA
AO DE ESTUDIOS : QUINTO SEMESTRE : II

L A B O R A T O R I O No. 05

POSICIONAMIENTO ANGULAR DE MOTOR PASO A PASO


UNIPOLAR MEDIANTE ENCODER ROTATIVO
I. OBJETIVOS:
Realizar el posicionamiento angular del motor paso a paso mediante el Encoder.
Conocer cmo se desplaza la articulacin, la maquina CNC y la mquina de Torno.

II. MATERIALES Y EQUIPO


1 Computador con programa Arduino ver 1.6.7 para Windows 7 (para
win8 usar versin actual)
1 Tarjeta Arduino Uno o Arduino Mega + 1 cable de conexin USB
1 Encoder rotativo mecnico con sus 3 pines con cables soldados de
aprox 20 cm
1 Motor paso a Paso Unipolar de 5 o 6 cables (28BYJ-48) + tarjeta
driver ULN2003
4 Transistores 2N2222 o su equivalente BD135 (no es necesario si
tiene el driver ULN2003)
4 resistencias de 1K (no es necesario si tiene el driver ULN2003)
2 Resistencias de 1K (para polarizar el Encoder)
1 Pulsador de 4 contactos + 1 resistencia de 10 K
1 Protoboard + cables de conexionado + un alicate pequeo o
cortacables (de ser necesario)

III. PROCEDIMIENTO:

1. Realizar el siguiente esquema en Arduino, Motor paso a paso Unipolar, driver ULN2003 y
Codificador giratorio (Encoder).

Pulsador SW1

A
B
C

MSc. Alberto E. Cohaila Barrios. 1/7 Fecha: 20-10-17


Acadmico
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERA (FAIN)
ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y SISTEMAS (ESIS)
CURSO : ROBOTICA
AO DE ESTUDIOS : QUINTO SEMESTRE : II

2. Se est utilizando 4 pines para controlar el motor paso a paso y 3 pines para el mdulo del
codificador rotativo. Los pines del 8 al 11 est controlando el motor paso a paso y los pines 2, 3 y 4
est recibiendo informacin del codificador giratorio.

Conectamos 5V y tierra del Arduino UNO al codificador giratorio y al Motor paso a paso. Tambin
como medida de precaucin, se puede usar una fuente de alimentacin externa para alimentar el
motor paso a paso, ya que puede tener ms consumo cuando esta con carga que Arduino UNO
puede proporcionar. Tambin se debe conectar la GND (Tierra) del Arduino UNO al protoboard
para que sirva de referencia.

3. Para el caso que se utilic transistores como driver, el esquema es el siguiente:

VCC
Pulsador Comn del Motor
+5 V
(conectara +5V)
Motor PaP Unipolar
Color rojo
ARD1
10k A B
SW1 Caracteristicas:
- 1.8 grados/paso
SW-SPST D C
+88.8
Grados (0-360)
AREF
13
PB5/SCK
12 R4
PB4/MISO
RESET 11
~PB3/MOSI/OC2A
10
~ PB2/SS/OC1B 1k
9
~ PB1/OC1A 1k
8 1k
PB0/ICP1/CLKO
ATMEGA328P-PU
1121

1k
DIGITAL (~PWM)

7
ANALOG IN

PD7/AIN1
6
A0 ~ PD6/AIN0
A1
PC0/ADC0
~ PD5/T1
5 B Q1 Q2 Q3 Q4
PC1/ADC1 4 2N2222 2N2222 2N2222 2N2222
A2 PD4/T0/XCK
+88.8

A3
PC2/ADC2
~ PD3/INT1
3 C
PC3/ADC3 2
A4 PD2/INT0
A5
PC4/ADC4/SDA
TX PD1/TXD
1 A
PC5/ADC5/SCL 0
RX PD0/RXD

ARDUINO UNO R3 1k 1k
VCC

Encoder

4. El motor 28BYJ-48 no es muy rpido o muy fuerte, pero es genial para comenzar a experimentar
con el control de un motor paso a paso con un Arduino. Escribiremos el cdigo para que el motor
se mueva en la direccin en que giramos el codificador giratorio y tambin haremos un
seguimiento de cuntos pasos hemos tomado para que podamos hacer que el motor vuelva a la
posicin inicial presionando el Switch o pulsador SW1.

5. El programa es el siguiente:
OPCION 1:

#include "Stepper.h"
#define STEPS 32 // Number of steps for one revolution of Internal shaft (Nmero de pasos
para una revolucin de eje Interno)
// 2048 steps for one revolution of External shaft (2048 pasos para una revolucin de eje
Externo)

volatile boolean TurnDetected; // need volatile for Interrupts


volatile boolean rotationdirection; // CW or CCW rotation

const int PinCLK = 2; // Generating interrupts using CLK signal (A encoder)


const int PinDT = 3; // Reading DT signal (B encoder)
const int PinSW = 4; // Reading Push Button switch (Pulsador)

MSc. Alberto E. Cohaila Barrios. 2/7 Fecha: 20-10-17


Acadmico
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERA (FAIN)
ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y SISTEMAS (ESIS)
CURSO : ROBOTICA
AO DE ESTUDIOS : QUINTO SEMESTRE : II

int RotaryPosition = 0; // To store Stepper Motor Position

int PrevPosition; // Previous Rotary position Value to check accuracy


int StepsToTake; // How much to move Stepper

// Setup of proper sequencing for Motor Driver Pins


// In1, In2, In3, In4 in the sequence 1-3-2-4
Stepper small_stepper(STEPS, 8, 10, 9, 11);

// Interrupt routine runs if CLK goes from HIGH to LOW


void isr () {
delay(4); // delay for Debouncing
if (digitalRead(PinCLK))
rotationdirection = digitalRead(PinDT);
else
rotationdirection = !digitalRead(PinDT);
TurnDetected = true;
}

void setup () {

pinMode(PinCLK, INPUT);
pinMode(PinDT, INPUT);
pinMode(PinSW, INPUT);
digitalWrite(PinSW, HIGH); // Pull-Up resistor for switch
attachInterrupt (0, isr, FALLING); // interrupt 0 always connected to pin 2 on Arduino UNO
Serial.begin(9600);
}

void loop () {
small_stepper.setSpeed(600); //Max seems to be 700
if (!(digitalRead(PinSW))) { // check if button is pressed
if (RotaryPosition == 0) { // check if button was already pressed
} else {
small_stepper.step(-(RotaryPosition * 50)); // 50
RotaryPosition = 0; // Reset position to ZERO
}
}
// Runs if rotation was detected
if (TurnDetected) {
PrevPosition = RotaryPosition; // Save previous position in variable
if (rotationdirection) {
RotaryPosition = RotaryPosition - 1;

} // decrase Position by 1
else {
RotaryPosition = RotaryPosition + 1;

} // increase Position by 1

Serial.println(RotaryPosition);
TurnDetected = false; // do NOT repeat IF loop until new rotation detected
// Which direction to move Stepper motor
if ((PrevPosition + 1) == RotaryPosition) { // Move motor CW

MSc. Alberto E. Cohaila Barrios. 3/7 Fecha: 20-10-17


Acadmico
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERA (FAIN)
ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y SISTEMAS (ESIS)
CURSO : ROBOTICA
AO DE ESTUDIOS : QUINTO SEMESTRE : II

StepsToTake = 50; // 50 24*2=48 48=15 ; 24=7.5 ( StepsToTake=Pasos a seguir o


tomar)
small_stepper.step(StepsToTake);
}

if ((RotaryPosition + 1) == PrevPosition) { // Move motor CCW


StepsToTake = -50; // 50
small_stepper.step(StepsToTake);
}
}
}

6. Suba el programa al Arduino, luego abrir el Monitor Serie, que se encuentra en


Herramientas>>Monitor Serie. Deber visualizar el conteo de rotacin del Encoder. Si gira el
Encoder en sentido horario (CW) contara los pulsos en forma ascendente, si gira el encoder en
sentido antihorario (CCW) contara los pulsos en forma descendente

7. Mueva el Encoder a la derecha o izquierda y vea como responde el motor paso a paso. Para
regresar a la posicin de inicio (referencia) presione el pulsados SW1.

Posicin angular de 0, 45 y 90 controlador por el Encoder

MSc. Alberto E. Cohaila Barrios. 4/7 Fecha: 20-10-17


Acadmico
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERA (FAIN)
ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y SISTEMAS (ESIS)
CURSO : ROBOTICA
AO DE ESTUDIOS : QUINTO SEMESTRE : II

8. Otra alternativa seria mover el motor paso a paso mediante la rotacin angular ingresado desde la
consola de Arduino. El programa es el siguiente:
OPCION 2:

int retardo = 5; // Tiempo de retardo en milisegundos (Velocidad del Motor)


int dato_rx; // valor recibido en grados
int numero_pasos = 0; // Valor en grados donde se encuentra el motor
String leeCadena; // Almacena la cadena de datos recibida

void setup() {
Serial.begin(9600); // inicializamos el puerto serie a 9600 baudios
pinMode(11, OUTPUT); // Pin 11 conectar a IN4
pinMode(10, OUTPUT); // Pin 10 conectar a IN3
pinMode(9, OUTPUT); // Pin 9 conectar a IN2
pinMode(8, OUTPUT); // Pin 8 conectar a IN1
}

void loop() {
while (Serial.available()) { // Leer el valor enviado por el Puerto serial
delay(retardo);
char c = Serial.read(); // Lee los caracteres
leeCadena += c; // Convierte Caracteres a cadena de caracteres
}
if (leeCadena.length() > 0) {
dato_rx = leeCadena.toInt(); // Convierte Cadena de caracteres a Enteros
Serial.print(dato_rx); // Envia valor en Grados
Serial.println(" Grados");
delay(retardo);
dato_rx = (dato_rx * 1.4222222222); // Ajuste de 512 vueltas a los 360 grados
}

while (dato_rx > numero_pasos) { // Girohacia la izquierda en grados


paso_izq();
numero_pasos = numero_pasos + 1;
}
while (dato_rx < numero_pasos) { // Giro hacia la derecha en grados
paso_der();
numero_pasos = numero_pasos - 1;
}
leeCadena = ""; // Inicializamos la cadena de caracteres recibidos
apagado(); // Apagado del Motor para que no se caliente
} ///////////////////// Fin del Loop ///////////////////////////

void paso_der() { // Pasos a la derecha


digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, HIGH);
delay(retardo);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
delay(retardo);
digitalWrite(11, HIGH);

MSc. Alberto E. Cohaila Barrios. 5/7 Fecha: 20-10-17


Acadmico
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERA (FAIN)
ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y SISTEMAS (ESIS)
CURSO : ROBOTICA
AO DE ESTUDIOS : QUINTO SEMESTRE : II

digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
delay(retardo);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
delay(retardo);
}

void paso_izq() { // Pasos a la izquierda


digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
delay(retardo);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
delay(retardo);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, HIGH);
delay(retardo);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
delay(retardo);
}

void apagado() { // Apagado del Motor


digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
}

9. Mediante el monitor serial, en la lnea de consola coloque los grados 60, 120 y 180 grados. Luego
regrese a la posicin de referencia 0.

MSc. Alberto E. Cohaila Barrios. 6/7 Fecha: 20-10-17


Acadmico
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERA (FAIN)
ESCUELA PROFESIONAL DE INGENIERIA INFORMATICA Y SISTEMAS (ESIS)
CURSO : ROBOTICA
AO DE ESTUDIOS : QUINTO SEMESTRE : II

Referencia 0 y rotacin angular a 60

Rotacin angular de 120 y 180

10.

IV. INFORME FINAL:

1. Realizar todos los pasos del presente laboratorio


2. Que utilidades le puede dar al presente laboratorio en Ing. su especialidad Ing. Informtica y
Sistemas
3. Modifique los programas (o realice uno nuevo) de forma que el desplazamiento angular se
realice mediante lnea de consola y el Encoder.
4. Revise en YouTube el video siguiente:
https://www.youtube.com/watch?v=qcGI9nyx7Ds
De su opinin y comentarios
5. Revise en YouTube el video siguiente. Qu utilidad le puede dar en la vida diaria?
https://www.youtube.com/watch?v=YZiwhuKb8Ek
6. Revise en YouTube el video siguiente:
https://www.youtube.com/watch?v=39pvbYEIru0
De su opinin y comentarios
7. Que es un Servomotor. Cul es la diferencia entre el servo y el motor paso a paso. Ventajas y
desventajas.
8. Qu diferencias hay entre un motor paso a paso Bipolar y uno Unipolar
9. De 3 observaciones del presente laboratorio
10. De 3 conclusiones del presente laboratorio.

MSc. Alberto E. Cohaila Barrios. 7/7 Fecha: 20-10-17


Acadmico

También podría gustarte