Motor neuma 17 + Adafruit Motor Shield V2 + pulsador

Lo primero es felicitaros por toda la información que se puede encontrar aquí . GRACIAS.

Segundo no soy ningún experto en electrónica ni programación y me entero a medias de como va todo . PERO ARDUINO ME PARECE UNA GENIALIDAD! cada día me gusta mas y aprendo mas . Tengo 1.000 proyectos en marcha ( espero poder hacer 2 o 3 ) . De antemano os estoy muy agradecido de toda la ayuda o referencias que me facilitéis .

Estoy trabajando en un pequeño proyecto con el motor de neuma 17 y Adafruit Motor Shield V2 . Es tan simple como que quiero que ande uno numero determinado de pasos hacía delante y los mismo hacía detrás siempre y cuando yo se lo mande. Es decir al presionar un pulsador . También me gustaría poder parar el proceso de avance o retroceso en cualquier momento .

Entiendo que este sería un ejemplo de código para el motor.

void loop()
   {   uint8_t i;

       myMotor->run(FORWARD);
       for (i=0; i<255; i++)
          { myMotor->setSpeed(i);
            delay(10);
          }
      
       for (i=255; i!=0; i--)
          { myMotor->setSpeed(i);
            delay(10);
          }

       myMotor->run(BACKWARD);
       for (i=0; i<255; i++)
         {  myMotor->setSpeed(i);
            delay(10);
         }
       for (i=255; i!=0; i--)
          { myMotor->setSpeed(i);
            delay(10);
          }

       myMotor->run(RELEASE);
       delay(1000);
   }

Alguien puede ayudarme con el pulsador? No tengo ni la mas remota idea de como poder ajustar el circuito y las lineas de codigo.

He mirado en todo poderoso google , pero toda la información que encuentro es muy muy liosa.

MUCHAS GRACIAS A TODOS !

saludos.

Hola @ericybea, me da gusto que estes tan entusiasmado.

Cuando quieres interrumpir cosas como lo que pretendes debes olvidarte de usar delay()
Tu tienes ciclos de 0 a 255 o sea 256x10 mseg = 2560 mseg o 2.56 seg donde nadie puede hacer nada ni responder a nada.
Lo que debes usar es millis().
Claro que para usarlo la manera de como programas debe ser distinta. Ya que millis() no es reemplazo directo de delay().
millis() es un contador que se incrementa cada miliseg desde que se energíza el arduino.
De modo que imagina a alguien que dispara el cronometro y luego tu dices uhhh pero es el único cronómetro que hay en la pista.. y yo quiero saber cuanto tiempo le lleva a ese corredor dar la vuelta.
Entonces que harías: bueno cuando dar la señal de largada anotas el tiempo de inicio y cuando llegue el corredor el de llegada. La diferencia de tiempos será tu tiempo como si tu hubieras disparado el cronometro desde 0 y cuando llega al final.
Ahora como aplicas esto a tu caso?

Debes crear una máquina de estados. La misma permite que mientras no se cumpla una condicion no paso al siguiente estado.
En tu caso.. tu quieres demorar 10 mseg y luego incrementar i en un paso o decrementarlo.

millis() es un contador del tipo unsigned long asi que tus variables parciales deben ser de ese tipo.

si quieres un delay de 10 mseg haces esto

unsigned long t1 = 0;

if (millis()-t1 > 10) {
  myMotor->setSpeed(i++);  // incremento i con cada paso
   t1 = millis();
  // hago lo que debo hacer cada 10 mseg
}

Ahora que ocurre? Resulta que eso se ejecuta y permite ejecutar otras cosas
Entonces? uso una variable que me diga por ejemplo sentido si vale 1 es ascendente y si vale 0 descendente
Esto no es una máquina de estados. Es algo rápido que muestra como puedes ir haciéndolo.

bool velocidad = 1;   // empiezo con ascendente
bool AdelanteAtras = 1; // 1 adelante 0 atras
unsigned long t1 = 0;
void loop() {
 
 myMotor->run(FORWARD);
 if (millis()-t1 > 10) {
    if (velocidad) {
      myMotor->setSpeed(i++);  // incremento i con cada paso
      if (i>255) velocidad= 0;
   else {
      myMotor->setSpeed(i);
      if (i==0) velocidad= 1;
   }
    t1 = millis();
 }

HOla! nuevamente me ha pasado lo mismo , por lo que sea no me ha avisado de que tenia respuesta!

SIENTO MUCHO NO HABER CONTESTADO ANTES.

Veamos. lo primero es agradecerte 100% tu ayuda. Ahora creo que tenemos que ir mas despacio.

Veamos si podemos solucionar mis problemas paso por paso.

1- Necesito alimentar el shield V2 con corriente y para eso voy a utilizar una fuente ATX como se explica en el tutorial

http://www.prometec.net/fuentes-atx

2- Utilizar un pulsador para que el motor tengo un movimiento hacía delante y después vuelva a su posición inicial

Estoy utilizando ese esquema eléctrico

como lo ves?

saludos y muchas gracias por tu ayuda.

Hola,

bueno he estado trasteando un poco y he montado este borrador de codigo.

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

bool PowerON = false ;

int botonMovimiento = 2; // declarando el pin del boton . 

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2)

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Stepper test!");

  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  
  myMotor->setSpeed(10);  // 10 rpm   
}


void loop()
   {  bool boton = digitalRead(6) ;
      if (boton == LOW)
        {  PowerON = ! PowerON ;        // Ivertimos el estatus de la fuente
           delay(250);                  // Para evitar rebotes
           digitalWrite(13, PowerON);   // Encender o apagar el LED
         }
      if ( PowerON)
           digitalWrite(7, LOW);        // Enciende la fuente
      else
           digitalWrite(7, HIGH);       // Apaga la fuente
   }

bool velocidad = 1;   // empiezo con ascendente
bool AdelanteAtras = 1; // 1 adelante 0 atras
unsigned long t1 = 0;
void loop() {
 
 myMotor->run(FORWARD);
 if (millis()-t1 > 10) {
    if (velocidad) {
      myMotor->setSpeed(i++);  // incremento i con cada paso
      if (i>255) velocidad= 0;
   else {
      myMotor->setSpeed(i);
      if (i==0) velocidad= 1;
   }
    t1 = millis();
 }

No tengo ni idea de por donde puedo meterle mano :

Arduino:1.6.9 (Mac OS X), Tarjeta:“Arduino Nano, ATmega328”

ATENCIÓN: .github Espúrias carpetas en librería ‘Adafruit Motor Shield library’
motor1:12: error: expected ‘,’ or ‘;’ before ‘void’
void setup() {
^
/Users/… /Library/Containers/com.apple.mail/Data/Library/Mail Downloads/FBBAD3EA-2F6C-4725-B5BB-3B5DBB882D0D/motor1/motor1.ino: In function ‘void loop()’:
motor1:39: error: redefinition of ‘void loop()’
void loop() {
^
motor1:23: error: ‘void loop()’ previously defined here
void loop()
^
motor1:41: error: ‘class Adafruit_StepperMotor’ has no member named ‘run’
myMotor->run(FORWARD);
^
motor1:44: error: ‘i’ was not declared in this scope
myMotor->setSpeed(i++); // incremento i con cada paso
^
motor1:51: error: expected ‘}’ at end of input
}
^
motor1:51: error: expected ‘}’ at end of input
exit status 1
expected ‘,’ or ‘;’ before ‘void’

toda ayuda es agradecida!!

saludos.

Parece ser entre tantos errores que tienes dos archivos .ino en la misma carpeta del que quieres compilar.
Revisa eso para comenzar

HOla ! MUCHAS GRACIAS!

Vale… le he dado unas vueltas… que te parece así ?

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

bool PowerON = false ;

int botonMovimiento = 2; // declarando el pin del boton . 

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Stepper test!");

  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  
  myMotor->setSpeed(10);  // 10 rpm   
}


void loop()
   {  bool boton = digitalRead(6) ;
      if (boton == LOW)
        {  PowerON = ! PowerON ;        // Ivertimos el estatus de la fuente
           delay(250);                  // Para evitar rebotes
           digitalWrite(13, PowerON);   // Encender o apagar el LED
         }
      if ( PowerON)
           digitalWrite(7, LOW);        // Enciende la fuente
      else
           digitalWrite(7, HIGH);       // Apaga la fuente
   }

bool velocidad = 1;   // empiezo con ascendente
bool AdelanteAtras = 1; // 1 adelante 0 atras
unsigned long t1 = 0;

 myMotor->run(FORWARD);
  
 }
 if (millis()-t1 > 10) {
    if (velocidad) {
      myMotor->setSpeed(i++);  // incremento i con cada paso
      if (i>255) velocidad= 0;
   else {
      myMotor->setSpeed(i);
      if (i==0) velocidad= 1;
   }
    t1 = millis();
 }

Arduino:1.6.9 (Mac OS X), Tarjeta:“Arduino Nano, ATmega328”

motor1b:40: error: ‘myMotor’ does not name a type
myMotor->run(FORWARD);
^
motor1b:42: error: expected declaration before ‘}’ token
}
^
exit status 1
‘myMotor’ does not name a type

Este reporte podría tener más información con
“Mostrar salida detallada durante la compilación”
opción habilitada en Archivo → Preferencias.

muchas gracias.