Go Down

Topic: 28byj-48 y motor shield L293 (Read 1 time) previous topic - next topic

pepepotero

Hola,

Pregunto en el foro porque ha buscado y rebuscado pero sigo teniendo un problema con el motor y el shield.

Tengo montado en un shield de 2 controladores L293 (AF motor shield V1) sobre un UNO, para probar he conectado un 28byj-48 al puerto 1 (M1 yM2) de la siguiente manera:

Cable rosa al M1-A
Cable naranja al M1-B
Cable rojo al GND
Cable azul al M2-A
Cable amarillo al M2-B



Y con el siguiente codigo se supone que debe funcionar:

Code: [Select]
#include <AFMotor.h>
AF_Stepper motor(256, 1);              // A la puerta M1 M2

void setup()
   {
      Serial.begin(9600);
      Serial.println("Stepper test!");
      motor.setSpeed(50); // 50 rpm
   }

void loop()
   { 
     Serial.println("Single coil steps");
     motor.step(2000, FORWARD, SINGLE);
     motor.step(1000, BACKWARD, SINGLE);
     delay(1000);

     Serial.println("Double coil steps");
     motor.step(2000, FORWARD, DOUBLE);
     motor.step(1000, BACKWARD, DOUBLE);
     delay(1000);
 
     Serial.println("Interleave coil steps");
     motor.step(2000, FORWARD, INTERLEAVE);
     motor.step(1000, BACKWARD, INTERLEAVE);
     delay(1000);

     Serial.println("Micrsostep steps");
     motor.step(2000, FORWARD, MICROSTEP);
     motor.step(1000, BACKWARD, MICROSTEP);
     delay(1000);
   }


Y no funciona, el motor se queda temblando y no gira.

He buscado y rebuscado, he probado muchos códigos de ejemplos.
He cambiado los parámetros de "AF_Stepper motor(...,1);" a por 128, 64, 2048 como he visto en otras páginas.
He cambiado "motor.setSpeed(50);" por muchos valores.

He probado con los 3 shields que tengo y con 5 motores, y nada, el motor tiembla (unas veces más rápido y otras más lento), pero no se mueve.
También he probado con todas las versiones del AFMotor library que he descagado.
Al shield le he quitado el puente que lleva y la alimentación es externa (5V 1A), por lo que tiene que tener corriente de sobra.

Los motores probados con el driver ULN2003 que traen, funcionan perfectamente, y no creo que los 3 shields estén mal, ya que con todos hace lo mismo.

El shield con motores de continua parecen funcionar bien.

No sé ya que probar más, voy a quemar el UNO de tanto subirle skechts. ¿alguien me puede dar alguna idea de que estoy haciendo mal?.

Muchas gracias de antemano.

Javitolo

Algo estas haciendo mal, acabo de hacer una prueba conectando un solo motor y con el código que tu pusiste y funciona perfecto.La librería de Adafruit es la versión 1. La alimentación del motor la saque del propio Arduino con el jumper de la Shield puesto.
Salu2

pepepotero

Muchísimas gracias por la prueba.

Imagino que el orden de colores que he puesto está bien. He visto alguna página que el azul y el amarillo del motor con el shield están intercambiados, pero ni con esas...

Sinceramente no se que puedo estar haciendo mal, he repasado todo mil veces y el motor se queda temblando pero no gira. Y como dije, he probado 5 motores y 3 shields que tengo.

Los shields me los ha casi regalado un amiguete que ni siquiera los había sacado del plástico (los he abierto yo) y van marcados con "MH electronic".

Ya no se me ocurre mas que probar con la librería que comentas. ¿puedes poner un enlace? Tengo tantas descargadas que ya no se cual es cual..

Un saludo

 

surbyte

A ver si esto ayuda o trae luz, seguro lo viste pero repasemos

Observa el jumper, esta puesto en tu caso, este ejemplo es con 12V y jumper puesto.




En esta imagen se ve el ULN2003 y los colores con mas detalle.


En otro dicen :

Quote
Remove the jumper from the motor driver board L293D and supply 5V to the board this worked for me
Que para alimentar con 5V hay que quitar el jumper

Acá el mejor tuto en portugues, si estas con chrome podes cambiar el idioma y te lo traduce bastante bien.


pepepotero

Muchas gracias Surbyte, vaya currada de post.

En primer lugar me parece que el jumper que lleva es para alimentacion interna (5V arduino si está puesto) o externa (hasta 36V creo si está quitado).

He seguido tus indicaciones y el tutorial en portugues. Nada, los motores siguen vibrando pero no giran. De nuevo he probado con los 3 shields, y 5 motores. He cambiado incluso los cables.
Cambiaré de Arduino a ver si eso y comprobaré las conexiones con un L293D suelto que estoy esperando. Y he pedido prestado otros motores paso a paso.
Ahora voy a estar un tiempo sin venir al garaje done tengo montado mi hobby.
A la vuelta haré más comprobaciones.

Entraré en el foro de vez en cuando a ver si hay alguna idea más.

Muchas gracias por la ayuda



pepepotero

Buenas
Me rindo, no consigo que funcionen.
Cambio de idea. Como sí me funcionan con los motores DC, he pensado en utilizarlos, pero tengo que solucionar el problema del posicionado.
Lo que necesito sería equivalente a lo que hace una rueda de una slot machine, es decir, que gira y después de un número de vueltas para en una posición controlada.
He pensado en utilizar un encoder para medir las vueltas y otro con un solo detector para medir la posición, es decir, una rueda con radios para medir la velocidad y otra con un solo radio para medir la posición, de manera que cuando el de un solo radio pase por el sensor, se sabe cuál es la posición de la rueda y se ajusta como 0, luego se mide el paso de los otros radios y se podría saber el ángulo y parar cuando se necesite.
El problema que veo es que para que sea fiable, necesito de las 2 interrupciones y no sé si se podrían solapar (las 2 no pueden saltar a la vez). He buscado bastante y sólo he encontrado un código que no necesita interrupciones, pero podría presentar problemas de rebotes y de pérdida de lectura de algún radio ya que lee los sensores constantemente. También he pensado que como la velocidad sería cuasiconstante podría sincronizar el código para que esto no ocurriese. Pero bueno... son sólo ideas.
¿conocéis alguna manera de realizar lo que necesito?
Muchas gracias de antemano

pepepotero

#6
Jan 07, 2018, 10:15 pm Last Edit: Jan 07, 2018, 10:21 pm by pepepotero
Saludos y feliz año 2018 a tod@s.

Al final he desmontado dos TCRT5000 y con una impresora 3D he imprimido un encoder con el soporte para enfrentar los diodos IR y los fototransistores. El encoder lleva 7 palas cortas y una larga, de manera que las cortas cortan la lectura de un sensor y la larga lo hace con los 2 sensores, con lo cual se pueden contar 8 pasos por cada vuelta a partir de una posición conocida (paso por pala larga). El encoder lo he acoplado al eje del motor.
Haciendo una función exclusiva con "while", es decir que no hace otra cosa que leer los sensores. He logrado coordinar las lecturas directas del fototransistor para que cuente los pasos a través de los pines analógicos y así poder controlar 4 motores (prescindiendo de las interrupciones pines 2 y 3).

Por si a alguien le sirviera, este es el código de la función para leer el encoder:


Code: [Select]

// post edit: El motor ya está debe estar funcionando a máxima velocidad con  "analogWrite(pinMotor, 255);" previo
void cuentaPasos(byte pasos, byte pinEnc, byte pinMotor) {
  //pasos=numero de pasos que tiene que moverse el motor
  //motor = pin del motor correspondiente
  int umbral = 950; //Valor mínimo leido con el encoder cerrado (paso de pala)
  int previousState = 0;
  int currentState = 0;
  byte vueltas = 0;
  while (vueltas < pasos) {
    currentState = analogRead(pinEnc) >= umbral ? 1 : 0 ; //lee el estado del encoder
    delay(20); //retraso para sincronización de lectura
    if (currentState == 1 && previousState == 0) {
      vueltas++;
    }
    previousState = currentState; //cambia el estado anterior
    
  }
  analogWrite(pinMotor, 0); //Para el motor que está funcionando
}



¿Por qué no he usado las interrupciones?
Primero porque necesito controlar 4 motores y el pro mini sólo tiene 2 pines y porque con estos sensores, leyéndolos por los pines de interrupción se saltaba aleatoriamente palas del encoder, ya que para que salte la interrupción el valor debería ser, cuando el fototransistor está tapado por una pala, 1024 (es decir +5V) y algunas veces leía 1010, por lo que no saltaba la interrupción.
Se podría solucionar con un encoder comercial con su electrónica y ajuste de disparo (umbral), pero son más grandes y no tengo espacio para colocarlos.


Querría controlar los 4 motores con un solo L293D por falta de espacio para colocar un shield. He buscado y leído información y casi todo es para controlar sólo 2 motores con cambio de sentido de giro, pero no me queda claro si lo podría hacer colocando las 4 OUT del L293D a un polo de cada motor y el otro a GND, ya que no necesito cambiar el sentido de giro. ¿sería posible hacer esto?

Muchas gracias por vuestra ayuda.


Go Up