Go Down

Topic: Dos arduinos comiunicados y motores paso a paso (Read 374 times) previous topic - next topic

zepjau


Hola.

Estoy probando la conexión entre dos arduinos nano y aparentemente funciona, retornándome el esclavo un texto definido por mi.

El problema viene que cuando le añado las conexiones para utilizar uno o dos motores paso a paso (28BYJ-48) al esclavo falla y no consigo

averiguar la razón.

Para ir descartando cual es la instrucción que podía provocarlo he ido añadiendo y quitando las que están

relacionadas con los comandos y configuración de los motores pap, utilizo la librería Stepper.h, y los motores los compré con

un kit que lleva su controladora unl2003. Estos motores funcionan cuando los utilizo sin que el arduino sea esclavo.

El master recibe datos por bluetooth de un teléfono móvil y el dato le llega bien y este lo envía al esclavo.

He descubierto que la sentencia que bloquea el proceso del esclavo es esta:

 

myStepper.step(x); // siendo x un valor predefinido, lo he probado con 5,6,60.

 

El codgio del maestro es:

 
Code: [Select]
#include <Wire.h>
char val;
char c;
String respuesta="";
bool findato = false;

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  if ( Serial.available() ) {
    val = Serial.read();
    if ( val != '99') {
     // Serial.println("Se ha recibido dato: ");
      Serial.print(val);
      Wire.beginTransmission(2);
      Wire.write(val);
      Wire.endTransmission(2);
    }
   
  Wire.requestFrom(2, 10);// Le pide 10 bytes al Esclavo 2
   Serial.print(" Dato recibido del:  ");
  while(Wire.available()) {
    c = Wire.read();   // Recibe byte a byte
    Serial.print(c);        // Presenta los caracteres en el Serial Monitor
  }
 }
  val == '99';
  delay(100);
}

void SerialEvent(){
  while ( Serial.available()) {
   char val = (char)Serial.read();
   if ( val =='\n'){
    findato = true;
   }
    if ( val != '99') {
     // Serial.println("Se ha recibido dato: ");
      Serial.print(val);
      Wire.beginTransmission(2);
      Wire.write(val);
      Wire.endTransmission(2);
    }   
  Wire.requestFrom(2, 10);    // Le pide 10 bytes al Esclavo 2
  while(Wire.available()) {
    char c = Wire.read();   // Recibe byte a byte
    respuesta += c;
  }
       
 }
  Serial.print("Dato recibido  ");
  Serial.println(respuesta);
  val == '99';
 
}

 

El codigo esclavo es:

 

 
Code: [Select]
#include <Wire.h>
#include <Stepper.h>
const int stepsPerRevolution = 64; //200;  //  this to fit the number of steps revolution for your motor
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
Stepper myStepper1(stepsPerRevolution, 2, 3, 4, 5);
char val;
char valor;

void setup() {
  //myStepper.setSpeed(6);
  Wire.begin(2);
  Wire.onRequest(requestEvent); // Cuando el Maestro le hace una petición,realiza el requestEvent
  Wire.onReceive(receiveEvent);
  myStepper.step(stepsPerRevolution);
  //myStepper.setSpeed(1.5);
  Serial.begin(9600);
}

void loop() {
  delay(100);
}
//  funcion que se ejecuta siempre que se recibe dato del maestro
void receiveEvent(char valor){
   val = Wire.read();
   if( val == '0' ) // Arriba-izquierda
   {
    myStepper.step(stepsPerRevolution);
    delay(500);
    myStepper.step(-stepsPerRevolution);
    //myStepper.step(5);
  }
  if( val == '1' ) // Arriba-izquierda
   {
    myStepper.step(-stepsPerRevolution);
  }
  if( val == '2' ) // Arriba-izquierda
   {
    myStepper.step(stepsPerRevolution);
  }
}
void requestEvent()
{
    Wire.write("Esclavo_2\n "); // Envía 10 bytes
    Wire.write(valor);
}



 

Cuando lo ejecuto sin dicha sentencia se encienden dos leds de los cuatro que lleva el controlador y me devuelve dato pero si lo ejecuto

la sentencia tengo que pulsar el botón de reset del arduino esclavo para que me devuelva el dato, parece que esa sentencia lo bloquea.
Las librerias viene con el ide (creo).
Los motores son28BYJ-48 y el controlador es ULN2003.

Agradeceria alguna idea del posible fallo.

Un saludo,
Javier.

surbyte

No puedes usar SerialEVent y delay dentro del loop.

Prueba de este modo

Code: [Select]
#include <Wire.h>
#include <Stepper.h>

const int stepsPerRevolution = 64; //200;  //  this to fit the number of steps revolution for your motor
Stepper myStepper1(stepsPerRevolution, 8, 9, 10, 11);
Stepper myStepper2(stepsPerRevolution, 2, 3,  4,  5);

char val;
char valor;
byte estado = 0;
unsigned long start;

void setup() {
  //myStepper1.setSpeed(6);
  Wire.begin(2);
  Wire.onRequest(requestEvent); // Cuando el Maestro le hace una petición,realiza el requestEvent
  Wire.onReceive(receiveEvent);
  myStepper1.step(stepsPerRevolution);
  //myStepper1.setSpeed(1.5);
  Serial.begin(9600);
}

void loop() {
  delay(100);
}
//  funcion que se ejecuta siempre que se recibe dato del maestro
void receiveEvent(char valor){

   val = Wire.read();
   if ( val == '0' ){    // Arriba-izquierda
        switch (estado) {
          case 0: myStepper1.step(stepsPerRevolution);
                  estado = 1;
                  start = milllis();
                  break;
          case 1: if (millis() - start > 500UL){
                      myStepper1.step(-stepsPerRevolution);
                      estado = 0;
                  }
                  break;
        }
        //myStepper1.step(5);
  }

  if(val == '1' )  { // Arriba-izquierda
     myStepper1.step(-stepsPerRevolution);
  }

  if (val == '2' )  { // Arriba-izquierda
     myStepper1.step(stepsPerRevolution);
  }
}

void requestEvent()
{
    Wire.write("Esclavo_2\n "); // Envía 10 bytes
    Wire.write(valor);
}

zepjau

Buenos dias.
Muchas gracias.
Lo pruebo y respondo.

Javier

zepjau

Gracias.
Pero sigue igual. Ejecuta todo menos el movimiento del motor.
He probado con la libreria accelstepper y si jo ejecuto como maestro va bien pero cuando lo ejecuto como esclavo no va.

Si se te ocurre otra cosa se agradece, yo por mi parte sigo probando y os cuento si saco algo en claro.

Un saludo,
Javier.

surbyte

Hola, te doy una buena noticia y una mala.
La buena es que logré avances e identifiqué el posible responsable. Logré que funcione incluso con stepper pero
la mala es que cuando incorporas el uso de la lectura por Serial. Deja de recibir datos el esclavo.

Cuando tenga algo lo postearé.

Go Up