Cambio de sentido motor pap

Tengo un motor de una impresora, pero desgraciamente no he encontrado mas información de la que suministra la propia etiqueta del motor:
Mitsumi Modelo M42 SP3
DC 22V
7,5º Step
45 Ohmios y 4 Phases
la primera duda que me surge es que cuando conecto el motor a arduino solo funciona si la alimento entre 6 y 7 voltios, en lugar de los 22v. que indica la etiqueta y me gustaría conocer cual es el motivo para esto.
Por otra parte utilizo este código para probar su funcionamiento pero no consigo que cambio de sentido el giro del motor.
El conexionado lo he conseguido midiendo la resistencia de las bobinas internas, pero tambien he realizado pruebas intercambiando los cables, sin conseguir nada.

/*
 Stepper Motor Controller
 language: Wiring/Arduino

 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 and 9 of the Arduino.

 The motor moves 100 steps in one direction, then 100 in the other.

 Created 11 Mar. 2007
 Modified 7 Apr. 2007
 by Tom Igoe

 */

// define the pins that the motor is attached to. You can use
// any digital I/O pins.

#include <Stepper.h>

#define motorSteps 48     // (360/7,5)change this depending on the number of steps
                           // per revolution of your motor
#define motorPin1 8
#define motorPin2 9
#define ledPin 13

// initialize of the Stepper library:
Stepper myStepper(motorSteps,motorPin1,motorPin2); 

void setup() {
  // set the motor speed at 60 RPMS:
  myStepper.setSpeed(200);

  // Initialize the Serial port:
  Serial.begin(9600);

  // set up the LED pin:
  pinMode(ledPin, OUTPUT);
  // blink the LED:
  blink(3);
}

void loop() {
  // Step forward 100 steps:
  Serial.println("Adelante");
  myStepper.step(48);
  delay(500);

  // Step backward 100 steps:
  Serial.println("Atras");
  myStepper.step(-48);
  delay(500); 

}

// Blink the reset LED:
void blink(int howManyTimes) {
  int i;
  for (i=0; i< howManyTimes; i++) {
    digitalWrite(ledPin, HIGH);
    delay(200);
    digitalWrite(ledPin, LOW);
    delay(200);
  }
}

Hola AntonioT
Vamos por partes......
1º ¿estas conectando el motor directamente al arduino? Si la respuesta es afirmativa, eso no esta bien, los motores paso a paso se conectan mediante circuitos pues la potencia que suministran las salidas de arduino no es suficiente, asi como los voltajes.
2º el programa segun lo tienes es para controlar el motor con 2 salidas, con lo cual el motor que segun el datasheet es UNIPOLAR lo tienes que conectar con un Darlintong (uln2003 o uln2004) y sus respectivos componentes.
3º pueba con menos velocidad de pasos los 200 rpm en algunos motores es demasiado, empieza probando con 50 rpm
Si comentas un poco como lo conectas pues podemos ayudarte algo mas

Un Saludo

David Pousada

Gracias por tu respuesta.
Ha sido un dato que se me olvidó incluir, el motor está conectado a una controladora EasyDriver.
Tanto los pasos como las revoluciones las he ido variando para probar si mejoraba el resultado, el movimiento es mas constante con esas 200 rpm que he puesto, lo mismo ha ocurrido con el voltaje que he ido variando desde los 5 voltios; pero aún así esto no explica porqué no se produce el cambio de giro del motor y tampoco el porqué de un voltaje tan distinto al que teóricamente necesitaría.

Hola de nuevo AntonioT

Si no me equivoco la controladora EasyDriver no se controla con la libreria stepper de arduino, sino que se controla mediante dos pines indicando direccion y pasos, con lo cual con tu programa no creo que funcione muy bien......
Mirate esto:
http://lusorobotica.com/index.php/topic,106.0.html
En la web tienes un ejemplo para probar tu motor a ver si reaccionas bien.

Un Saludo

David Pousada

Muchas gracias he probado el código sin que funcionara inicialmente, pero curiosamente tras modificar los valores delayMicroseconds he conseguido que funcionara.

Sin embargo de nuevo me surge la duda de cual es el método según este código para cambiar el sentido de giro?

/***************************************************************
**    More info about the project at:                     **
**   by TigPT  at  http://www.LusoRobotica.com **
****************************************************************/
int dirPin = 8;
int stepperPin = 9;

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
}

void step(boolean dir,int steps){
  digitalWrite(dirPin,dir);
  delay(100);
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(5000);  //a valores mas altos el motor gira mas despacio (valor minimo admitido por el motor 140)
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(200); //valor minimo 150 - a mayor número mayor velocidad
  }
}

void loop(){
  step(true,1600); //valor inicial 1600
  delay(500);
  step(false,1600*5);
  delay(500);
}

Hola de nuevo....
Pues el sentido de giro se controla con el pin 8 en este caso.
Ellos le llaman al pin 8 dirPin, y mas abajo en "void steep" declaran una variable booleana llamada dir, que es la cual lee a continuacion dirPin para darle valor a la salida. Dependiendo de si la variable dir sea 0 o 1 el motor girara para un lado o para el otro.

No se si me explique bien....

Experimenta a cambiar esta linea digitalWrite(dirPin,dir); modificando la variable dir por HIGH o LOW y veras que cambia de direccion el motor.

Un Saludo

David Pousada

He realizado ambos cambios es decir:

digitalWrite(dirPin, LOW); y posteriormente
digitalWrite(dirPin,HIGH);
pero em ambos casos el motor sigue siempre el mismo sentido de giro.
Posteriormente, si no he interpretado mal, la instrucción step dice que modificando su valor a negativo, el giro debería cambiar de sentido, pero tampoco he conseguido nada.

Edito:
He realizado la siguiente prueba:
Desconecto el pin 8 de arduino y el motor sigue girando.
Llevo la conexión desde el pin dirección del easy driver a +5v y en ese caso sí que cambia de sentido.
Vuelvo a colocar el cable en su posición inicial y ahora parece que todo funciona, es decir que los giros se realizan a ambos lados.
No le encuentro explicación a todo esto. ¿porqué funciona ahora?

tambien observo lo siguiente:

Si modifico step con valor 1 da unos poquitos pasos y se para, si el valor es 5 comienza a dar pasos, pero no todos tienen el mismo grado, si ese valor lo subo a 10, los movimientos son mas precisos, pero de vez en cuando da un salto mayor o menor y la vuelta la completa en algo menos de 50 pasos.
Subiendo el valor a 15 con 25 pasos completa la vuelta. Son valores que ni coinciden con el número de pasos del motor, pero se aproximan a los valores de ángulos.
Es decir que si como valor escrito 48 en teoría debería dar salto de 7,5º, pero lo he comprobado y unas veces son 6 como 8, es algo variable.
Es posible que esto sea falta de precisión del motor, o tal vez aquí esté la respuesta del problema con el voltaje?

Hola AntonioT

Creo que DavidPousada tiene razón.
Estás usando la librería stepper con un driver que no lo necesita.
No tienes que usar la función step de la librería Stepper, sino crear una función similar al que te indica DavisPousada en el programa de ejemplo, que también se llama "step" (quizás eso te haya confundido).

Saludos

Las últimas pruebas que comento están realizadas basándose en el código de LusoRobotica, que no utiliza librería alguna, pero supongo que el uso de un código u otro no afecta al voltaje que se suministra al motor.
Por otra parte lo que no llego a entender muy bien como funciona la parte contenida dentro de la sección void step, no entiendo como actua sobre el motor, según he comprobado la línea delayMicroseconds(5000) si aumento este valor lo que ocurre que el motor gira mas despacio, pero hasta un cierto valor, , sin embargo la siguiente línea delayMicroseconds(200); ocurre todo lo contrario, es decir si aumento su valor lo que ocurre es que baja la velocidad. No llego a entender la relación entre una y otra línea ¿porque actua de este modo?

Hola AntonioT

Lo que haces con los dos delays dentro de la función step es definir la anchura de pulso de control (STEP) al driver. Es decir, definir el tiempo que está la señal alta y el tiempo que está la señal baja.
Tienes que mirar las características de easy driver, o en su defecto la datasheet del chip:
http://www.allegromicro.com/en/Products/Part_Numbers/3967/3967.pdf

Como actúa por flanco de subida (página 7 del datasheet) , si aumentas cualquiera de los dos valores el motor irá más despacio hasta que llegue un momento que pierda el sincronismo (que la inercia del motor impida ir a tanta velocidad)

Saludos

Inizul:
, si aumentas cualquiera de los dos valores el motor irá más despacio hasta que llegue un momento que pierda el sincronismo (que la inercia del motor impida ir a tanta velocidad)

Saludos


Txapuzas electronicas

Por lo que entiendo el valor optimo se conseguiria igualando ambos valores, pero hay alguna forma de calcular que valores son los idoneos para conseguir la mayor y menor velocidad del motor manteniendo su máxima potencia?

Hola de nuevo

Perdona, la frase anterior es incorrecta, debería ser:

si disminuyes cualquiera de los dos valores el motor irá más rápido hasta que llegue un momento que pierda el sincronismo (que la inercia del motor impida ir a tanta velocidad)

Con respecto a tu afirmación:
"Por lo que entiendo el valor optimo se conseguiria igualando ambos valores,"

No conozco mucho el modo de funcionamiento de este chip, pero creo que no tiene nada que ver. La señal de STEP no controla directamente las bobinas, Leyendo las hojas de características se ve:

The current in each of the two output full bridges is regulated with fixed off time pulse-width modulated  (PWM) control circuitry.
The internal PWM current-control circuitry uses a one shot to control the time the driver(s) remain(s) off. 
The one shot off-time, toff, is determined by the selection of an external resistor (RT) and capacitor (CT) connected from the RC timing terminal to ground.

Es decir, si lo entiendo bien:
Cada vez que mandamos un pulso en la patilla SETP, cuando la señal llega a 2,5v (instantáneo) manda corriente a la bobina durante un tiempo que se regula mediante unas Resistencias y un condensadores conectados a las patillas 2 y 23.

Por otra parte la velocidad máxima del motor, así como su par máximo son diferentes para cada modelo.
En principio, cuanta más intensidad suministres más potencia generarás. Es decir habría que modificar las resistencias de "Sense" y las de "RC1" y "RC2".
Y para la velocidad máxima, puedes aumentarla si creas "rampas de aceleración y deceleración" (arranque y parada gradual del motor) modificando los valores del delay.

Creo que deberías "googlear" algún manual de uso de ese driver.

Saludos

Tras darle muchas vueltas (y no solo al motor) he conseguido estabilizar mas o menos el sistema el problema está en cambiar el sentido al motor cuando yo presiono un botón.
El efecto que tiene con el siguiente código es que solo cambia de sentido si presiono el botón justo en el momento que el motor está haciendo una pausa, esto es relativamente fácil tal y cmo está ahora con una pausa de medio segundo, pero en el momento que reduzco la pausa unas veces acierto y otras no. ¿hay alguna forma de cambiar el sentido de giro sin esperar a esa pausa?

/********************************************************
**      Codigo basado en                               **
**  http://lusorobotica.com/viewtopic.php?t=103&f=106  **
*********************************************************/


boolean sentido_giro = true;
int    dirPin = 8;      //pin para controlar la dirección
int    stepperPin = 9;  //pin para controlar los pasos del motor
int    pulsador = 10;       // PIN para el pulsador pulsador

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
  pinMode (pulsador, INPUT);
}

  void loop(){
     //tecla();
      boolean a=sentido_giro; // asigna el sentido de giro a la variable a
      
      do {
        tecla();
        Giro(sentido_giro);
      } while (sentido_giro==a);
 }
 
 void Giro(boolean dir){
   step(dir,360);
   delay(500);
  }

  //Giro_A
  /*
  void Giro_A(){
    step(true,360); 
    delay(500);
 }
 
  //Giro_B
  void Giro_B(){
    step(false,360); //Cambia el sentido de giro del motor
    delay(500);    //realiza una pausa antes de dar el siguiente paso
  }
*/
 void step(boolean dir,int steps){
   digitalWrite(dirPin,dir); 
   delay(100);
   for(int i=0;i<steps;i++){
   digitalWrite(stepperPin, HIGH);
   delayMicroseconds(5000);  
   digitalWrite(stepperPin, LOW);
   delayMicroseconds(200); 
  
} 
 }

void tecla(){
   unsigned long time = millis();  
    if (digitalRead(pulsador) == HIGH) { // si se pulsa....
      while(digitalRead(pulsador)) {     // mientras se mantiene presionado...
        if (millis()-time >= 30) { sentido_giro=!sentido_giro; }// Si la pulsación > 30 ms., cambia el valor de dir 
      }
    }
}

Hola AntonioT
Creo que deberías meter la función Tecla también dentro de la función Step, para que cada vez que vaya a mandar un pulso compruebe antes si se ha pulsado el botón de giro. Pero sin antirebotes, simplemente comprobando que la entrada está activa.
Si no, antes de comprobar el pulsador, el programa tiene que esperar 360 pulsos+una temporización de 0,5seg

Poco a poco el sistema comienza a avanzar, pero se me plantea una duda:
He comprobado que al indicarle al motor que gire, no siempre los pasos tienen el mismo ángulo. El método que he seguido ha sido el siguiente:
Le digo al motor que comience a girar sin realizar pausas de forma constante y he observado que no siempre las pausas (está puesto para que avance paso a paso) se detienen en el mismo lugar. Si le indico que dé un giro completo al iniciar el giro realizo una marca y cuando termina no se para en el mismo lugar.
La duda que tengo es si esto puede ser debido a un problema del motor o puede estar en la programación.
¿cual es vuestra opinión? Gracias.

yo en mi caso personal, para hacer funcionar un paso a paso he seguido este pequeño manual, he montado el circuito en una protoboard y va de muerte, Txapuzas electrónicas: PaperStepper(L298N): Driver de potencia para motor paso a paso bipolar
Además para la libreria de stepper para el cambio de giro con poner el símbolo negativo funciona,
Mi problema viene, en que, si uso los 5v que suministra arduino el motor funciona correctamente, pero si lo alimento con una fuente de alimentación que tengo, que también da 5v, el motor no va ni para atrás, y se me calienta, Decir que la fuente funciona correctamente con otros circuitos, puede ser que haya un corto en el motor???

Gracias, pero estoy utilizando una controladora que no necesita esa libreria, la controladora es la easydriver y el problema que veo no es en el giro sino en su precisión.
El motor que estoy usando tiene 7,5º por paso, pero tal y como está construido el código uno de los problemas está en que debería dar una vuelta completa indicándole 48 pasos, sin embargo esto no ocurre, lo mas próximo a una vuelta (y tampoco coincide) está entre el valor 360 y 380.

Santiago.lopez a mi tambien me paso la primera vez q lo probe, luego como con lo 5v de arduino funcionaba no le di mas importancia, postealo en el hilo de txapuzas y seguro q te dan. una respuesta.

riscking:
Santiago.lopez a mi tambien me paso la primera vez q lo probe, luego como con lo 5v de arduino funcionaba no le di mas importancia, postealo en el hilo de txapuzas y seguro q te dan. una respuesta.

Es curioso, pero si alimento el L239 con los 5v de arduino, pero el motor paso a paso con la fuente de alimentación externa, funcioa correctamente, no sé por que será, igual la Fuente no me da suficiente intensidad.. pero me extraña...

Hola Santiago.lopez
Los motores paso a paso suelen ser grandes consumidores de corriente.
Si el motor te funciona con la alimentación de arduino y con la otra no, parece en principio, que el problema es de la fuente.
¿No puedes medir con un tester la intensidad que suministra cada una de las fuentes?
¿Puedes dar algún dato de las fuentes y del motor (V,I,R)?

Saludos