pregunta básica de arduino - ¿Necesito un temporizador 555?

5

Tengo un Arduino (duemilanove) conectado a una disquetera y con gusto puedo controlar el motor paso a paso usando tres pines en el cable plano a tres pines digitales de mi Arduino (¡pozo 2 + el suelo!).

Me gustaría controlar varios motores a la vez, pero usar un Arduino por motor va a ser costoso. He leído un poco acerca de 555 temporizadores. Si quisiera controlar dos motores al mismo tiempo que los motores de forma independiente uno de otro de mi Arduino, ¿podría hacerse con un IC de temporizador 555 para cada motor?

El Arduino es "de rosca única", por lo que quiero una forma, supongo, de empujar los "comandos" (señales) para impulsar los motores paso a paso en otro chip. De esta manera, el único hilo del Arduino puede hacer un bucle alrededor de cada chip entregando comandos para su motor conectado (¿o tal vez un método para hacer cola?)

También he leído un poco sobre las interrupciones en el Arduino, pero no creo que sean de ninguna utilidad, ¿verdad?

    
pregunta jwbensley

4 respuestas

9

Se puede hacer con interrupciones. Adjunte una interrupción a un temporizador, para que se dispare regularmente (digamos una vez en milisegundos), y use esa interrupción para quitar el siguiente comando de la parte superior de la cola (podría ser una matriz).

Tu bucle principal solo agrega comandos a esta matriz.

Un solo Arduino tiene 14 líneas IO, por lo que la cantidad de motores que puedes controlar depende únicamente de la cantidad de cables necesarios para cada motor.

Hay IC de controlador de motor paso a paso dedicados que son mucho mejores y más simples que usar un temporizador 555. La unidad de disquete utilizará una (tal vez incrustada dentro de otro chip). Por lo general, aceptan señales simples de paso arriba / abajo y las convierten en la secuencia correcta de pulsos.

Editar

Código de ejemplo, que utiliza la biblioteca Timer1 :

#include <TimerOne.h>

void test()
{
  digitalWrite(5,HIGH);
  delayMicroseconds(100);
  digitalWrite(5,LOW);
}

void setup()
{
  Timer1.attachInterrupt(&test,100000);
}

void loop()
{
}

Esto hará que el pin 5 digital se ponga alto y luego bajo una vez cada 100,000µS; verá que no hay nada en el bucle principal. Simplemente reemplace las dos llamadas de digitalWrite () con el código para hacer que sus motores una vez . No es necesario que especifique ningún retardo entre pasos en esa parte del código; ese retardo se establece con el valor de 100000 en la función Timer1.attachInterrupt (). Para cambiar la velocidad de los pasos, cambia ese valor.

    
respondido por el Majenko
2

Siempre que use 2 pines de salida por motor, puede controlar hasta ((pines GPIO) / 2) usando un mecanismo de software simple llamado programador.

Si eres un principiante, te sugiero que intentes implementar un planificador cooperativo, probablemente sea el más fácil de abordar. Si tiene problemas con eso, debe buscar ayuda En este libro . Es un libro gratuito muy bonito y muy completo llamado "Patrones para sistemas integrados disparados por el tiempo". Está bien escrito y contiene gran información desde lo básico hasta cosas bastante avanzadas.

Se recomienda un buen conocimiento del lenguaje C, pero si tiene problemas con "punteros de función" similares, no se dé por vencido. Consulte algunos tutoriales. Una vez que haya captado la tendencia, es realmente fácil. :)

También, en mi opinión, sería mucho más beneficioso para usted aprender estos patrones de software que utilizar 555 o multiplexores para lograr su propósito. Estas herramientas de software son mucho más versátiles y flexibles.

    
respondido por el Dan
1

Puede controlar alrededor de 6 motores de bajo voltaje a menos de 5 voltios con este código y puede ajustar la sincronización para cada uno de ellos cambiando el código, o puede usar el led como salida para señalar a otros 6 relés para la sincronización que desee. Para una mayor potencia, es posible que desees otra fuente de alimentación además de eso, bastante simple de hacerlo de esta manera, espero que funcione para ti.

/*
  Switch statement  with serial input

 Demonstrates the use of a switch statement.  The switch
 statement allows you to choose from among a set of discrete values
 of a variable.  It's like a series of if statements.

 To see this sketch in action, open the Serial monitor and send any character.
 The characters a, b, c, d, and e, will turn on LEDs.  Any other character will turn
 the LEDs off.

 The circuit:
 * 5 LEDs attached to digital pins 2 through 6 through 220-ohm resistors

 created 1 Jul 2009
 by Tom Igoe 

This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/SwitchCase2
 */

void setup() {
  // initialize serial communication:
  Serial.begin(9600); 
   // initialize the LED pins:
      for (int thisPin = 2; thisPin < 7; thisPin++) {
        pinMode(thisPin, OUTPUT);
      } 
}

void loop() {
  // read the sensor:
  if (Serial.available() > 0) {
    int inByte = Serial.read();
    // do something different depending on the character received.  
    // The switch statement expects single number values for each case;
    // in this exmaple, though, you're using single quotes to tell
    // the controller to get the ASCII value for the character.  For 
    // example 'a' = 97, 'b' = 98, and so forth:

    switch (inByte) {
    case 'a':    
      digitalWrite(2, HIGH);
      break;
    case 'b':    
      digitalWrite(3, HIGH);
      break;
    case 'c':    
      digitalWrite(4, HIGH);
      break;
    case 'd':    
      digitalWrite(5, HIGH);
      break;
    case 'e':    
      digitalWrite(6, HIGH);
      break;
    default:
      // turn all the LEDs off:
      for (int thisPin = 2; thisPin < 7; thisPin++) {
        digitalWrite(thisPin, LOW);
      }
    } 
  }
}
    
respondido por el Hello40
0

Dependiendo de lo que planee hacer con el microcontrolador, una alternativa podría ser reemplazar el Arduino con múltiples chips ATTiny85. Cuestan alrededor de $ 2.50 cada uno y se pueden programar a través del Arduino usando su IDE. Consulte las siguientes URL para obtener instrucciones.
enlace
enlace

    
respondido por el Fred

Lea otras preguntas en las etiquetas