Programa para controlar un motor paso a paso bipolar con Arduino:
Puedes bajarte el programa pinchando aquí, o bien copiar el código y pegarlo en el entorno de programación de Arduino. Como se puede observar el programa es bastante sencillo basta con ir modificando la secuencia de alimentación de las bobinas del motor, tal y como se expone en el tutorial, dando un tiempo (mSecPaso) entre cada secuencia con objeto de que se produzca la desmagnetización y magnetización de los polos correspondientes, variando este tiempo variamos la velocidad del motor; si se utiliza un motor diferente al referenciado, sera necesario comprobar mediante tanteo el valor mínimo y máximo de este parámetro, en nuestro caso esta entre 750 y 2350 aproximadamente. Como se observa en el bucle loop() el programa lo que hace es que el motor gire una vuelta completa en una dirección y otra en sentido contrario, de forma continua. Observese que el motor es de 0,9 grados por paso, luego una vuelta la completara en 360/0,9=400 pasos. /*CONTROL DE UN MOTOR PASO A PASO BIPOLAR, DE UN DISCO DURO VIEJO TYPE KP4GM1-001 0,9 DEG/STEP NO 4Z28 US PATENT Nº 4.347457 JAPAN SERVO CO.LTD */ #include <SoftwareSerial.h> //PARA COMUNICACIÓN CON EL PC //DEFINICION DE VARIABLES //pines del motor paso a paso mA y mB devanado 1, mC y mD devanado 2 int mA=3; int mB=4; int mC=5; int mD=6; int mSecPaso=1500;/*tiempo en microsegundos entre paso y paso la velocidad sera: velocidad=1000000/mSecPaso en vueltas/segundo. Valor minimo 750 maximo 2350 con menos de 750 no arranca con mas de 2350 se salta pasos.*/ void setup() { pinMode(mA, OUTPUT); pinMode(mB, OUTPUT); pinMode(mC, OUTPUT); pinMode(mD, OUTPUT); pinMode(mD, OUTPUT); //INICIAR EN PARO digitalWrite(mA, LOW); digitalWrite(mB, LOW); digitalWrite(mC, LOW); digitalWrite(mD, LOW); Serial.begin(9600); } void izquierda(){ //paso 1 digitalWrite(mA, LOW); digitalWrite(mB, HIGH); digitalWrite(mC, HIGH); digitalWrite(mD, LOW); delayMicroseconds(mSecPaso); //paso 2 digitalWrite(mC, LOW); digitalWrite(mD, HIGH); delayMicroseconds(mSecPaso); //paso 3 digitalWrite(mA, HIGH); digitalWrite(mB, LOW); delayMicroseconds(mSecPaso); //paso 4 digitalWrite(mC, HIGH); digitalWrite(mD, LOW); delayMicroseconds(mSecPaso); }//FIN izquierda void derecha(){ //paso 1 digitalWrite(mA, HIGH); digitalWrite(mB, LOW); digitalWrite(mC, HIGH); digitalWrite(mD, LOW); delayMicroseconds(mSecPaso); //paso 2 digitalWrite(mC, LOW); digitalWrite(mD, HIGH); delayMicroseconds(mSecPaso); //paso 3 digitalWrite(mA, LOW); digitalWrite(mB, HIGH); delayMicroseconds(mSecPaso); //paso 4 digitalWrite(mC, HIGH); digitalWrite(mD, LOW); delayMicroseconds(mSecPaso); }//FIN derecha void loop() { for(int i=0; i<100; i++) derecha(); delay (1000); for(int i=0; i<100; i++) izquierda(); Serial.print("mSecPaso ="); Serial.println(mSecPaso, DEC); //Muestra el valor de mSecPaso en la pantalla del ordenador delay (1000); //Si se quiere ver la variación de velocidad en el motor en función de mSecPaso, quitar // en la linea siguiente. //mSecPaso+=50; } Esquema eléctrico: Los pines mA, mB, mC y mD van a la placa de Arduino a los pines 3, 4, 5, y 6 respectivamente, en este motor concretamente puede sustituirse la fuente de 12 V por otra de 9V, si este trabaja en vacío o con poca carga. Los diodos son para proteger el integrado L293B de las fuerzas contra electromotrices de autoinducción en el motor, parece ser que el modelo L293Dya los lleva incorporados, por lo que podríamos prescindir de ellos.