analogInput+ A4988

Hola, tengo un problema. Estoy comenzando con arduino y lo que busco con este proyecto es que el Motor Paso a Paso controlado por un a4988 "copie" el movimiento del potenciometro que esta en el emisor.

Con esta programación la idea toma forma pero el motor tiene mucho ruido.
En que le estaré errando?
Adjunto códigos.
Saludos, desde ya muchas gracias.

Este es el RECEPTOR

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
 
//Declaremos los pines CE y el CSN
#define CE_PIN 9
#define CSN_PIN 10
int Z = 0;
//Variable con la dirección del canal que se va a leer
byte direccion[5] ={'c','a','n','a','l'}; 

//creamos el objeto radio (NRF24L01)
RF24 radio(CE_PIN, CSN_PIN);

//vector para los datos recibidos
float datos[3];

void setup()
{
 //inicializamos el NRF24L01 
  radio.begin();
  //inicializamos el puerto serie
  Serial.begin(9600); 
  
  //Abrimos el canal de Lectura
  radio.openReadingPipe(1, direccion);
  
    //empezamos a escuchar por el canal
  radio.startListening();
 
}
 
void loop() {
 uint8_t numero_canal;
 //if ( radio.available(&numero_canal) )
 if ( radio.available() )
 {    
     //Leemos los datos y los guardamos en la variable datos[]
     radio.read(datos,sizeof(datos));
     
     //reportamos por el puerto serial los datos recibidos
     Serial.print("Dato0= " );
     Serial.print(datos[0]);
     Serial.print(" V, ");
     Serial.print("Dato1= " );
     Serial.print(datos[1]);
     Serial.print(" ms, ");
     Serial.print("Dato2= " );
     Serial.println(datos[2]);
      if (datos[0] > datos[1]) digitalWrite(5, HIGH);
      else digitalWrite (5,LOW);
      for(Z = 0; Z < ((datos[0] - datos[1])); Z++);
      {
    digitalWrite(8,HIGH);
    delayMicroseconds(500);
    digitalWrite(8,LOW);
    delayMicroseconds(500);
  }//comparacion para determinar la direccion
 
  for(Z = 1; Z < ((datos[1] - datos[0])); Z++);
  {
    digitalWrite(8,HIGH);
    delayMicroseconds(500);
    digitalWrite(8,LOW);
    delayMicroseconds(500);
  }

 }
 else
 {
     Serial.println("No hay datos de radio disponibles");
 }
 
}

Este es el TRANSMISOR

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>


//Declaremos los pines CE y el CSN
#define CE_PIN 9
#define CSN_PIN 10
 
//Variable con la dirección del canal por donde se va a transmitir
byte direccion[5] ={'c','a','n','a','l'};

//creamos el objeto radio (NRF24L01)
RF24 radio(CE_PIN, CSN_PIN);

//vector con los datos a enviar
float datos[3];

void setup()
{
  //inicializamos el NRF24L01 
  radio.begin();
  //inicializamos el puerto serie
  Serial.begin(9600); 
 
//Abrimos un canal de escritura
 radio.openWritingPipe(direccion);
 
}
 
void loop()
{ 
  
 
 //cargamos los datos en la variable datos[]
 datos[0]=analogRead(A0);
 delay (10);
 datos[1]=analogRead (A0);
 datos[2]= digitalRead (8);
 //enviamos los datos
 bool ok = radio.write(datos, sizeof(datos));
  //reportamos por el puerto serial los datos enviados 
  if(ok)
  {
     Serial.print("Datos enviados: "); 
     Serial.print(datos[0]); 
     Serial.print(" , "); 
     Serial.print(datos[1]); 
     Serial.print(" , "); 
     Serial.println(datos[2]); 
  }
  else
  {
     Serial.println("no se ha podido enviar");
  }
  
}

Y esto ara que ?

float datos[3];                          //Suficiente con int porque serán valores enteros 0~1024
datos[0] = analogRead(A0);

Gracias por responder

Estuve construyendo la comunicacion en base a ejemplos de internet. Tenes razón. no es necesario que sea float.

Ahora bien esta parte es toda mi y es la que probablemente este fallando jajaja
El PIN 5 esta destinado a la Direccion en el a4988 y el PIN 8 a los pasos.

Mi idea es que cuando el valor de A0 crezca el motor gire y cuando decrezca gire hacia el sentido contrario.

y el problema es que no estoy seguro de que la solución que propuse de resultados

Tomo los datos de a0 con diferencia de 10ms y los comparo si es mayo o menos... Eso me daría la dirección

Luego resto los valores y me daria los pasos de diferencia a corregir

 if (datos[0] > datos[1]) digitalWrite(5, HIGH);
      else digitalWrite (5,LOW);
      for(Z = 0; Z < ((datos[0] - datos[1])); Z++);
      {
    digitalWrite(8,HIGH);
    delayMicroseconds(500);
    digitalWrite(8,LOW);
    delayMicroseconds(500);
  }//comparacion para determinar la direccion
 
  for(Z = 1; Z < ((datos[1] - datos[0])); Z++);
  {
    digitalWrite(8,HIGH);
    delayMicroseconds(500);
    digitalWrite(8,LOW);
    delayMicroseconds(500);
  }

Problema con motor? Se resuelve aislando el problema.

Toma un código del a4988 y lo ensayas por por separado, sin nada de lo que estas mostrando arriba con el nRF24 y fallas de programación que veo.

Funciona, ok entonces integra al nRF24.
Pero trababjar con todo sin saber donde esta el probelma no es adecuado.

Tal vez lo hiciste asi, entonces mi pregunta es: Antes hacie ese ruido?

Hola, gracias por responder, si, no lo aclare. El problema estaba ya desde antes...

Si esta desde antes entonces haz como dije. Olvida el nRF24 y veamos que pasa con el motor y su driver.

Con que lo alimentas?

Gracias por responder.
Lo estoy alimentando con una fuente de 12v y la parte lógica del driver con los 5v que entrega arduino.

Testie los motores y el driver con un programa básico y funciona correctamente.
Creo yo que el problema radica en la programación

Bueno ves.. eso es aislar el problema
Tu motor funciona bien y no tiene ningun ruido.

Lo que esta mal es tu código.
Ahora trabaja con el nRF24 y haz que envie datos y solo eso.. y leelos correctamente, coloca el monitor serie y mira a ver si cada vez que le das una orden que es lo que hace.

A veces uno cree que lo hace bien y le esta diciendo al motor, arranca/para o cosas asi... y termina funcionando para el diablo.

Por eso coloca indicaciones con Serial.print y asegurate que cuando le dices algo al motor sea una vez.. por el tiempo que determines y no ordenes enfrentadas.

Bien genial, o sea, testeo la programación con unos delay lo suficientemente largos para que me muestre que todo se este cumpliendo o no? Es buena idea?

Aprenda a no usar delay(), usa millils().

Todo lo que deba refrezcarse con delay() no lo hará.

Tienes un código que debe consultar algo cada 1 minuto
Si pones delay(60000); tienes un stop de 1 minuto pero si usas millis() y haces esto

if (millis() - start > 60000UL) {
   start = millis();
}

En este segundo caso cada 1 minuto haras algo pero inmediatamente el código esta listo por ejemplo para recibir datos del nRF24.

Se ve la diferencia?