Cómo controlar motores paso a paso
Usando un Arduino (microcontrolador basado en Atmega8) entrada iniciada por brolín y kdag
Objetivo
Controlar la video camara de -medellinwireless- de manera remota, la imagen corresponde al video en stream que usamos durante el montaje del primer motor, recuperado de una impresora y comprado en la plaza minorista por $1.000 pesos oro.
I. Reconocer el tipo de motor que tenemos
Creamos una tabla como la siguiente donde los valores ahi mostrados son los obtenidos al medir la resistencia entre cada par de cables del motor (para nuestro caso un motor bipolar de 6 cables).
|
rojo |
amarillo |
azul |
blanco1 |
blanco2 |
café |
rojo |
--- |
--- |
--- |
--- |
1.5 |
3.5 |
amarillo |
--- |
--- |
3.5 |
1.8 |
--- |
--- |
azul |
--- |
3.5 |
--- |
1.5 |
--- |
--- |
blanco1 |
--- |
1.8 |
1.8 |
--- |
--- |
--- |
blanco2 |
1.5 |
--- |
--- |
--- |
--- |
1.5 |
café |
3.5 |
--- |
--- |
--- |
1.8 |
--- |
II. Identificar las terminales comunes del motor
Nos fijamos en la tabla y tratamos de dibujar 4 bobinas (todas 4 con aproximadamente el mismo valor de resistencia). Las bobinas obtenidas son
L1 -> rojo - blanco2
L2 -> cafe - blanco2
L3 -> azul - blanco1
L4 -> amarillo - blanco1
Vemos como blanco2 y blanco1 son comunes en dos bobinas. Estos(blancoX) son los que van a ir a la alimentación.
III. Código utilizado para flashear el atmega8 (tomado del proyecto arduino)
/* Stepper Unipolar Advanced
* -------------------------
*
* Program to drive a stepper motor coming from a 5'25 disk drive
* according to the documentation I found, this stepper: "[...] motor
* made by Copal Electronics, with 1.8 degrees per step and 96 ohms
* per winding, with center taps brought out to separate leads [...]"
* [http://www.cs.uiowa.edu/~jones/step/example.html]
*
* It is a unipolar stepper motor with 5 wires:
*
* - red: power connector, I have it at 5V and works fine
* - orange and black: coil 1
* - brown and yellow: coil 2
*
* (cleft) 2005 DojoDave for K3
* http://www.0j0.org | http://arduino.berlios.de
*
* @author: David Cuartielles
* @date: 20 Oct. 2005
*/
int motorPins[] = {8, 9, 10, 11};
int count = 0;
int count2 = 0;
int delayTime = 500;
int val = 0;
void setup() {
for (count = 0; count < 4; count++) {
pinMode(motorPins[count], OUTPUT);
}
}
void moveForward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;
}
count2>>=1;
for (count = 3; count >= 0; count--) {
digitalWrite(motorPins[count], count2>>count&0x01);
}
delay(delayTime);
}
void moveBackward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;
}
count2>>=1;
for (count = 3; count >= 0; count--) {
digitalWrite(motorPins[3 - count], count2>>count&0x01);
}
delay(delayTime);
}
void loop() {
val = analogRead(0);
if (val > 540) {
// move faster the higher the value from the potentiometer
delayTime = 2048 - 1024 * val / 512 + 1;
moveForward();
} else if (val < 480) {
// move faster the lower the value from the potentiometer
delayTime = 1024 * val / 512 + 1;
moveBackward();
} else {
delayTime = 1024;
}
}
IV. Controlando la camara
Este aparte continua en http://www.berebere.randomlab.net/berebere/BereBere/WebCam
