LABORATORIO 05 Robotica Encoder MotorPaP
LABORATORIO 05 Robotica Encoder MotorPaP
LABORATORIO 05 Robotica Encoder MotorPaP
L A B O R A T O R I O No. 05
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
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.
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)
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
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.
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:
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
}
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);
}
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.
10.