Ejercicio 25: Limpiaparabrisas

Un motor paso a paso hace avanzar y retroceder un mecanismo entre dos finales de carrera.

Novedades hardwareNovedades software
Motor paso a paso 

Requisitos:

  • 2 finales de carrera, 2 resistencias de 1Kohmio .
  • Un motor unipolar paso a paso.

Planteamiento:

Presentación de: Control de un motor unipolar paso a paso.

Lo primero es identificar las conexiones del motor: con un polímetro se registrará continuidad entre los extremos de cada bobinado. Luego hay que encontrar el orden correcto, para ello, conviene identificar cada terminal con un color. Unas cuantas permutaciones probando cada vez y ya está.

Una vez conocida la secuencia de pulsos que hace girar al motor, todo es muy sencillo.

Hay varias posibles secuencias, la que hemos elegido usa los dos bobinados y produce un torque mayor que la que usa uno solo.

Empaquetamos las secuencias en dos procedimientos, dejando la anchura del pulso como una variable que nos permite regular la velocidad, de forma que a menor valor, mayor velocidad.

Conviene probar diversos valores hasta encontrar la velocidad adecuada.

Si el motor ha de trabajar con una carga considerable, la intensidad que proporcionan las salidas digitales no será suficiente y tendremos que usar un driver. Distintos drivers para motores se estudian en detalle en el Apéndice 3?.

Para identificar el momento de la inversión de giro asociamos un cambio en la variable c a que haya tocado uno u otro de los finales de carrera. De esta forma c es 1 cuando ha tocado el segundo final de carrera y 0 cuando ha tocado el primero. En el primer caso avanza hasta tocar el segundo fin de carrera y en el primero retrocede hasta tocar el primero.

Variantes:

  • Cambia la variable que regula la velocidad para que cuando aumente su valor aumente la velocidad y viceversa.

VIDEO DEL EJERCICIO 25

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int vel=10;                             //variable que guarda la duración de los pulsos y controla la velocidad de giro del motor
 int unoa=3;                             //variables que guardan los números de los PINes a los que se conectan
 int unob=4;                             //los extremos de los dos bobinados del motor unipolar
 int dosa=5;                             //variable que guarda el sentido del giro
 int dosb=6;
 int c=0;                                                            
 int findecarrera1=8;
 int findecarrera2=9;
 void setup() {
   pinMode(unoa,OUTPUT);
   pinMode(unob,OUTPUT);
   pinMode(dosa,OUTPUT);
   pinMode(dosb,OUTPUT);
   pinMode(findecarrera1, INPUT); 
   pinMode(findecarrera2, INPUT);
 }
 void avanza(){                          //procedimiento que envía la secuencia de pulsos para que el motor                                            
   digitalWrite(unoa,HIGH);              //gire en un sentido
   digitalWrite(unob,LOW);
   digitalWrite(dosa,HIGH);
   digitalWrite(dosb,LOW);
   delay(vel);
   digitalWrite(unoa,LOW);
   digitalWrite(unob,HIGH);
   delay(vel);
   digitalWrite(dosa,LOW); 
   digitalWrite(dosb,HIGH);
   delay(vel);
   digitalWrite(unoa,HIGH);  
   digitalWrite(unob,LOW);
   delay(vel);
 }       
 void retrocede(){                       //procedimiento que envía la secuencia de pulsos para que el motor 
   digitalWrite(unoa,LOW);               //gire en sentido contrario
   digitalWrite(unob,HIGH);
   digitalWrite(dosa,LOW);
   digitalWrite(dosb,HIGH);
   delay(vel);
   digitalWrite(dosa,HIGH);
   digitalWrite(dosb,LOW);
   delay(vel);
   digitalWrite(unoa,HIGH); 
   digitalWrite(unob,LOW);
   delay(vel);
   digitalWrite(dosa,LOW);  
   digitalWrite(dosb,HIGH);
   delay(vel);
 } 
 void loop(){
   if(digitalRead(findecarrera1)==HIGH){ //si toca el primer fin de carrera
     c=0;
   }
   if(digitalRead(findecarrera2)==HIGH){ //si toca el segundo fin de carrera
     c=1;
   }
   if(c==0){
     avanza();
   }   
   if(c==1){
     retrocede();
   }
 }

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.