Go Down

Topic: RF Kit Link Obtener varias variables (Read 1 time) previous topic - next topic

roter45

Hola

Esto haciendo un robot usando unos kit rf (usando virtualwire)para controlar los motores con unos joysticks. Tras mucho buscar he conseguido enviar un valor (0 a 1024) y usando atoi convertirlo en int para poder mover hacia adelante y hacia atrás.

Mi objetivo ahora es poder enviar cuatro valores. He empezado con dos valores para ir haciendo pruebas. En el emisor envió una cadena string tal que asi: val1, val2.
Me lega perfectamente y la imprimo en el serial monitor sin problemas.

Ahora viene mi gran problema. En el receptor tengo que coger la cadena separarla en val1 y val2 y convertirlo en un int.

He buscado y he encontrado funciones como sscanf, atoi o strtok pero no he sido capaz de usarlas

Os dejo el código del receptor por si le quereis echar un vistazo y haber si alguno sabe como hacer esto

Code: [Select]




#include <VirtualWire.h>
#include <string.h>

#define MOTOR1_CTL1  8  // I1  
#define MOTOR1_CTL2  9  // I2  
#define MOTOR1_PWM   5 // EA  
 
#define MOTOR2_CTL1  6  // I3  
#define MOTOR2_CTL2  7  // I4  
#define MOTOR2_PWM   10 // EB  
 
#define MOTOR_DIR_FORWARD  0  
#define MOTOR_DIR_BACKWARD   1  
int ledPin = 13;



// Sensors
int Sensor1Data = 500;//para evitr que los motores se vuelvan locos
int Sensor2Data = 500;

// RF Transmission container

void setup() {
 Serial.begin(9600);
 
  pinMode(MOTOR1_CTL1,OUTPUT);  
  pinMode(MOTOR1_CTL2,OUTPUT);  
  pinMode(MOTOR1_PWM,OUTPUT);  
   
 // Setup pins for motor 2  
  pinMode(MOTOR2_CTL1,OUTPUT);  
  pinMode(MOTOR2_CTL2,OUTPUT);  
  pinMode(MOTOR2_PWM,OUTPUT);
 // sets the digital pin as output
 pinMode(ledPin, OUTPUT);      
   
   // VirtualWire
   // Initialise the IO and ISR
   // Required for DR3100

   // Bits per sec
   vw_setup(2000);
   vw_set_rx_pin(2);
   
   // Start the receiver PLL running
   vw_rx_start();      

} // END void setup

void loop(){
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
   
   // Non-blocking
   if (vw_get_message(buf, &buflen))
   {
int i;
       // Turn on a light to show received good message
       digitalWrite(13, true);

       // Message with a good checksum received, dump it.
       for (i = 0; i < buflen; i++)
{            
         // Fill Sensor1CharMsg Char array with corresponding
         // chars from buffer.  
         Sensor1CharMsg[i] = char(buf[i]);
}



       // DEBUG
       Serial.print (Sensor1CharMsg);
       Serial.print("    Sensor 1: ");
       Serial.print(Sensor1Data);
       Serial.print("   Sensor 2: ");
       Serial.println(Sensor2Data);
       
       
       // END DEBUG
     
       
       // Turn off light to and await next message
       digitalWrite(13, false);
   }

if (Sensor1Data > 700){
  int v1 = map(Sensor1Data,700,1024,150,250);
 motorStart(1, MOTOR_DIR_FORWARD);    
 setSpeed(1, v1);  
 motorStart(2, MOTOR_DIR_FORWARD);        
 setSpeed(2, v1);  
   
 delay(2);  }
 
 if (Sensor1Data < 300){
 int v2 = map(Sensor1Data,0,300,250,150);
 motorStart(1, MOTOR_DIR_BACKWARD);    
 setSpeed(1, v2);  
 motorStart(2, MOTOR_DIR_BACKWARD);        
 setSpeed(2, v2);  
   
 delay(2);  }
 if(300<Sensor1Data<700 && 300 < Sensor2Data < 700){
  motorStop(1);
  motorStop(2);}

if(300<Sensor1Data<700){
   if (Sensor2Data > 700){
  int v1 = map(Sensor1Data,700,1024,150,250);
 motorStart(1, MOTOR_DIR_FORWARD);    
 setSpeed(1, 200);  
 motorStart(2, MOTOR_DIR_FORWARD);        
 setSpeed(2, 200);  
   
 delay(2);  }
 
 if (Sensor2Data < 300){
 int v2 = map(Sensor1Data,0,300,250,150);
 motorStart(1, MOTOR_DIR_BACKWARD);    
 setSpeed(1, 200);  
 motorStart(2, MOTOR_DIR_BACKWARD);        
 setSpeed(2, 200);
delay(2);
 }
}
memset( Sensor1CharMsg, 0, sizeof( Sensor1CharMsg));
}
void setSpeed(char motor_num, char motor_speed)  
{  
  if (motor_num == 1)  
  {  
     analogWrite(MOTOR1_PWM, motor_speed);  
  }    
  else  
  {  
     analogWrite(MOTOR2_PWM, motor_speed);  
  }  
}  
 
void motorStart(char motor_num, byte direction)  
{  
   
  char pin_ctl1;  
  char pin_ctl2;  
   
  if (motor_num == 1)  
  {  
     pin_ctl1 = MOTOR1_CTL1;  
     pin_ctl2 = MOTOR1_CTL2;  
  }    
  else  
  {  
     pin_ctl1 = MOTOR2_CTL1;  
     pin_ctl2 = MOTOR2_CTL2;      
  }  
   
  switch (direction)  
  {  
    case MOTOR_DIR_FORWARD:  
    {  
      digitalWrite(pin_ctl1,LOW);  
      digitalWrite(pin_ctl2,HIGH);            
    }  
    break;  
           
    case MOTOR_DIR_BACKWARD:  
    {  
       digitalWrite(pin_ctl1,HIGH);  
       digitalWrite(pin_ctl2,LOW);            
    }  
    break;          
  }  
}  
 
void motorStop(char motor_num)  
{  
  setSpeed(motor_num, 0);  
  if (motor_num == 1)  
  {  
    digitalWrite(MOTOR1_CTL1,HIGH);  
    digitalWrite(MOTOR1_CTL2,HIGH);      
  }  
  else  
  {  
    digitalWrite(MOTOR2_CTL1,HIGH);  
    digitalWrite(MOTOR2_CTL2,HIGH);      
  }  
}  


Os dejo el transmisor tambien
Code: [Select]
#include <VirtualWire.h>


const int Sensor1Pin = A2;
const int Sensor2Pin = A3;
const int ledPin = 13;

int Sensor1Data;
int Sensor2Data;
char Sensor1CharMsg[10];

void setup() {

// LED
pinMode(ledPin,OUTPUT);

// Sensor(s)
pinMode(Sensor1Pin,INPUT);
pinMode(Sensor2Pin,INPUT);

// for debuggin
Serial.begin(9600);

// VirtualWire setup
vw_setup(2000); // Bits per sec


}

void loop() {
 
 // Read and store Sensor 1 data
 Sensor1Data = analogRead(Sensor1Pin);
 Sensor2Data = analogRead(Sensor2Pin);
 
 sprintf(Sensor1CharMsg, "%d,%d", Sensor1Data, Sensor2Data);

 // DEBUG
 Serial.print("Sensor1 Integer: ");
 Serial.print("X");
 Serial.print(Sensor1Data);
 Serial.print("Y");
 Serial.print(Sensor2Data);
 Serial.print("Sensor1Datamsg");
 Serial.println(Sensor1CharMsg);


 // END DEBUG

digitalWrite(13, true); // Turn on a light to show transmitting
vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false); // Turn off a light after transmission
delay(2);

} // END void loop...
Visit my blog and leave some comments
controlrobotics.rodrigomompo.com

roter45

Añado una pequeña corrección:

He encontrado ya la función que he de usar, parece ser que es sscanf().

Se usa de tal forma que sscanf(cadena, formato, diferentes variables donde se alamacenan los datos).

Dejo aqui un link donde los explica (estan en ingles):
http://liudr.wordpress.com/2012/01/30/sscanf/
http://www.cplusplus.com/reference/cstdio/sscanf/

Ahora tengo un problema usado esta función en mi codigo y me da el siguiente error " stray'/' in program"

Code: [Select]
result = sscanf(Sensor1CharMsg,"%d,%d",&Sensor1Data,&Sensor2Data);

Dejo el codigo completo, la linea anterior es la que me da problema, si se la quito lo compila sin problemas
Code: [Select]




#include <VirtualWire.h>
#include <string.h>

#define MOTOR1_CTL1  8  // I1 
#define MOTOR1_CTL2  9  // I2 
#define MOTOR1_PWM   5 // EA 
 
#define MOTOR2_CTL1  6  // I3 
#define MOTOR2_CTL2  7  // I4 
#define MOTOR2_PWM   10 // EB 
 
#define MOTOR_DIR_FORWARD  0 
#define MOTOR_DIR_BACKWARD   1


int ledPin = 13;
int result;

// Sensors
int Sensor1Data = 500;
int Sensor2Data = 500;

// RF Transmission container
char Sensor1CharMsg[10];
char Array1;
char Array2;
char Array3;

void setup() {
  Serial.begin(9600);
 
   pinMode(MOTOR1_CTL1,OUTPUT); 
   pinMode(MOTOR1_CTL2,OUTPUT); 
   pinMode(MOTOR1_PWM,OUTPUT); 
     
  // Setup pins for motor 2 
   pinMode(MOTOR2_CTL1,OUTPUT); 
   pinMode(MOTOR2_CTL2,OUTPUT); 
   pinMode(MOTOR2_PWM,OUTPUT);
  // sets the digital pin as output
  pinMode(ledPin, OUTPUT);     
   
    // VirtualWire
    // Initialise the IO and ISR
    // Required for DR3100

    // Bits per sec
    vw_setup(2000);
    vw_set_rx_pin(2);
   
    // Start the receiver PLL running
    vw_rx_start();       

} // END void setup

void loop(){
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
   
    // Non-blocking
    if (vw_get_message(buf, &buflen))
    {
int i;
        // Turn on a light to show received good message
        digitalWrite(13, true);

        // Message with a good checksum received, dump it.
        for (i = 0; i < buflen; i++)
{           
          // Fill Sensor1CharMsg Char array with corresponding
          // chars from buffer.   
          Sensor1CharMsg[i] = char(buf[i]);
}

        result = sscanf(Sensor1CharMsg,"%d,%d",&Sensor1Data,&Sensor2Data);
       
        // DEBUG
        Serial.print (Sensor1CharMsg);
        Serial.print("    Sensor 1: ");
        Serial.print(Sensor1Data);
        Serial.print("   Sensor 2: ");
        Serial.println(Sensor2Data);
       
       
        // END DEBUG
     
       
        // Turn off light to and await next message
        digitalWrite(13, false);
    }

if (Sensor1Data > 700){
   int v1 = map(Sensor1Data,700,1024,150,250);
  motorStart(1, MOTOR_DIR_FORWARD);   
  setSpeed(1, v1); 
  motorStart(2, MOTOR_DIR_FORWARD);       
  setSpeed(2, v1); 
   
  delay(2);  }
 
  if (Sensor1Data < 300){
  int v2 = map(Sensor1Data,0,300,250,150);
  motorStart(1, MOTOR_DIR_BACKWARD);   
  setSpeed(1, v2); 
  motorStart(2, MOTOR_DIR_BACKWARD);       
  setSpeed(2, v2); 
   
  delay(2);  }
  if(300<Sensor1Data<700 && 300 < Sensor2Data < 700){
   motorStop(1);
   motorStop(2);}

if(300<Sensor1Data<700){
    if (Sensor2Data > 700){
   int v1 = map(Sensor1Data,700,1024,150,250);
  motorStart(1, MOTOR_DIR_FORWARD);   
  setSpeed(1, 200); 
  motorStart(2, MOTOR_DIR_FORWARD);       
  setSpeed(2, 200); 
   
  delay(2);  }
 
  if (Sensor2Data < 300){
  int v2 = map(Sensor1Data,0,300,250,150);
  motorStart(1, MOTOR_DIR_BACKWARD);   
  setSpeed(1, 200); 
  motorStart(2, MOTOR_DIR_BACKWARD);       
  setSpeed(2, 200);
delay(2);
  }
}
memset( Sensor1CharMsg, 0, sizeof( Sensor1CharMsg));
}
void setSpeed(char motor_num, char motor_speed) 

   if (motor_num == 1) 
   { 
      analogWrite(MOTOR1_PWM, motor_speed); 
   }     
   else 
   { 
      analogWrite(MOTOR2_PWM, motor_speed); 
   } 

 
void motorStart(char motor_num, byte direction) 

   
   char pin_ctl1; 
   char pin_ctl2; 
     
   if (motor_num == 1) 
   { 
      pin_ctl1 = MOTOR1_CTL1; 
      pin_ctl2 = MOTOR1_CTL2; 
   }     
   else 
   { 
      pin_ctl1 = MOTOR2_CTL1; 
      pin_ctl2 = MOTOR2_CTL2;       
   } 
   
   switch (direction) 
   { 
     case MOTOR_DIR_FORWARD: 
     { 
       digitalWrite(pin_ctl1,LOW); 
       digitalWrite(pin_ctl2,HIGH);           
     } 
     break;   
           
     case MOTOR_DIR_BACKWARD: 
     { 
        digitalWrite(pin_ctl1,HIGH); 
        digitalWrite(pin_ctl2,LOW);           
     } 
     break;           
   } 

 
void motorStop(char motor_num) 

   setSpeed(motor_num, 0); 
   if (motor_num == 1) 
   { 
     digitalWrite(MOTOR1_CTL1,HIGH); 
     digitalWrite(MOTOR1_CTL2,HIGH);       
   } 
   else 
   { 
     digitalWrite(MOTOR2_CTL1,HIGH); 
     digitalWrite(MOTOR2_CTL2,HIGH);       
   } 
Visit my blog and leave some comments
controlrobotics.rodrigomompo.com

giltesa

No lo he puesto a prueba con módulos inalámbricos pero casi seguro que si usas una estructura struct y una union consigues enviar todos los datos de golpe y sin necesidad de mandarlos como texto.

Hace poco me entere de la existencia de la estructura Union así que lo explique en mi blog:
http://giltesa.com/2013/03/30/estructuras-union-de-carduino/

Y poco después la combine con una estructura struct:
http://giltesa.com/2013/03/31/combinacion-de-estructuras-struct-y-union/

Saludos!
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.

roter45

Estan muy bien los tutoriales, cuando tenga algo de tiempo y el bachillerato me deje, estudiare la función union para implementarla en el codigo.

Pero por ahora quiero ver como rematar lo que tengo. Por que teoricamente con sscarf() deberia funcionar. El unico problema al implementar la función es que me dice que le falta un "/" o algo asi.
Visit my blog and leave some comments
controlrobotics.rodrigomompo.com

nazgul

#4
May 04, 2013, 08:35 pm Last Edit: May 04, 2013, 08:48 pm by nazgul Reason: 1
Hola a todos.
Por mi parte estoy tambien peleándome para saver como mandar más de un dato obtenido analógicamente en un arduino, mandarlo por Radio Frecuencia con el conjunto emisor y receptor rf 343 MHz (http://www.bricogeek.com/shop/modulos-radiofrecuencia/47-emisor-rf-434mhz.html), y poder en un segundo arduino utilizar estos valores para mover unos servos y motores de corriente continua.

Con el siguiente ejemplo de la librería "virtualwire v1.5" he conseguido cargarlo "emisor" en uno y "receptor" en el otro Arduino, mandando así 4 datos digitales (4 pulsadores) y representarlos en diodos.

Pego el ejemplo:

Emisor:

Lee datos digitales de las entradas 8,9,10 y 11 digitales y las envia al emisor RF con la librería VirutalWire.
Code: [Select]

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);   // Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000); // Bits per sec
        vw_set_tx_pin(3);
       
        pinMode(8, INPUT);
        pinMode(9, INPUT);
        pinMode(10, INPUT);
        pinMode(11, INPUT);

digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);

}

void loop()
{
  char *msg;
 
  if(digitalRead(8) == LOW){
    char *msg = "1";
      digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);}
  if(digitalRead(9) == LOW){
    char *msg = "2";
      digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);}
  if(digitalRead(10) == LOW){
    char *msg = "3";
      digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);}
  if(digitalRead(11) == LOW){
    char *msg = "4";
      digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);}
}


Receptor:
Lee los datos recibidos por el receptor RF y enciende o apagar un diodo por cada salida digital 8, 9, 10 y 11, según que pulsador se a pulsado en el otro Arduino.

Code: [Select]

  #include <VirtualWire.h>

void setup()
{
    Serial.begin(9600); // Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000); // Bits per sec
    vw_set_rx_pin(2);
    vw_rx_start();       // Start the receiver PLL running

pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}

void loop()
{
 
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
 
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
int i;

        digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
    Serial.print(buf[i]);
        if(buf[i] == '1'){digitalWrite(8, HIGH);}
        if(buf[i] == '2'){digitalWrite(9, HIGH);}
        if(buf[i] == '3'){digitalWrite(10, HIGH);}
        if(buf[i] == '4'){digitalWrite(11, HIGH);}
    Serial.print(" ");
}
Serial.println("");
        digitalWrite(13, false);

   }
}



Funciona, lo he montado, pero no soy capaz de entender correctamente como usar la librería, sobre todo la sentencia de envio y lectura con ese unit8.

Acabo de leer los artículos de blog que se ha comentado, pero sigo sin entender como usarlo para tratar datos analógicos, casi lo entiendo, pero me quedo en casi.

Datos sobre la libreria virtualwire: http://www.airspayce.com/mikem/arduino/VirtualWire/index.html

American2020

Bueno, veo que de código entiendes. Te paso este que de seguro te dará una idea de lo que hace y como podrás aplicarlo.

Al enviar los datos, separas cada uno de ellos con algún divisor "raro" como % $ # @ etc.

El código busca donde está cada uno de ellos y luego va quedándose con el contenido que hay entre uno y el otro.

Lo de void serialEvent no hace falta, así lo tenía en un código de proccessing. La cadena la leerá hasta encontrar un "." (punto) que es lo que mando al final de cada serialPrint desde el Arduino.


Code: [Select]
void serialEvent (Serial port) {
  valor = port.readStringUntil('.');

  // Remover el punto
  valor = valor.substring(0, valor.length() - 1);

  //Buscamos los divisores
  index1 = valor.indexOf('#');
  index2 = valor.indexOf('@');
  index3 = valor.indexOf('*');
  index4 = valor.indexOf('%');
  index5 = valor.indexOf('&');
 

  p1boton = valor.substring(index1+1, index2);
  ypos1 = valor.substring(index2+1, index3);
  p1ypos = Integer.parseInt(ypos1);
 
  p2boton = valor.substring(index4+1, index5);
  ypos2 = valor.substring(index5+1, valor.length());
  p2ypos = Integer.parseInt(ypos2);
 

}


Lo que envío, luce así:

Code: [Select]
  //Send to Serial
 
  //PLAYER 1
  Serial.print("P1#");
  Serial.print(buttonP1);
  Serial.print("@");
  Serial.print(averageP1);
  Serial.print("*");
  //PLAYER 2
  Serial.print("P2%");
  Serial.print(buttonP2);
  Serial.print("&");
  Serial.print(averageP2);
  Serial.print(".");
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

nazgul

Gracias American2020.

No se si Rote45 le abra ayudado. Por mi parte sigo atascado. Gracias por la confianza de que entiendo de código  :smiley-sweat:, entiendo de lógica, luego hay que traducirla a código.  XD

El concepto que intentas trasmitir lo tengo en mente, lo que no consigo implementarlo por falta de algún dato básico que no tengo por falta de experiencia. el código que as colocado no se como utilizarlo.

Ya pense en mandar un "carácter bandera" al principio de la transmisión, otro al final y otros entre los valores, pero no soy capaz de "masticar" esos datos.

El problema de base es la falta de experiencia en programar.

Me rebolotea por la cabeza, utilizar un array en el que guardar los datos, pero aqui viene el problema. La naturaleza de los datos.
Estoy obteniendo datos de sensores analógicos (potenciometros 0 - 1023), y digitales (pulsadores 0 y 1). Estos datos son tipo "int", y por lo que he leido, por puerto serie se manda y leen datos de tipo "char", por lo que en la recepción de los datos, o en ambos estremos (emision y recepción) tendré que transformar los datos de "int" a "char" para luego utilizarlos con la librería "servo.h" o para utilizarlo en los drivers que utilizan los motores DC.

Creo que este es el problema que yo tengo.

El martes día 7 supuestamente me llegará el libro "Arduino curso practico de formación" http://www.amazon.es/Arduino-formacion-Oscar-Torrente-Artero/dp/8494072501 tiene 588 páginas en castellano y espero que me ayude a comprender conceptos básico como este de la manipulación de datos y su comunicación por puerto serie.

No os recomiendo el libro "Computación Física en Secundaria" por Marco Antonio Rodríguez Fernández. A parte de tener bastantes errores en la transcripción de texto y de parte de código, se queda muy por encima en muchas cosas y tienes que hacer un esfuerzo de fé para asimilar conceptos.

American2020 si crees que puedes poner un código ejemplo con el que leer dos potenciometros (valores analógicos "int"), enviarlos vía RF 434 MHz y hacer mover 2 servos independientes. yo podría montarlo, y pegar un video explicandolo, a parte de entender el código que es el objetivo final.  ;)

Ese es el video del ejemplo que he comentado con la librería "virtualwire". No he utilizado diodos, pero creo que se demuestra y entiende bien utilizando los diodos integrados.

http://www.youtube.com/watch?v=7U1bQTgrKjQ

Gracias.

American2020

Bueno, no se como mandarlos por RF.

Pero mi ejemplo lo tomé de un código que hace exactamente lo que decis. Lee 2 potenciómetros y 2 entradas digitales (Pulsadores)

Son 2 joystincks tipo Atari, que tienen 1 potenciómetro y 1 pulsador cada uno.

Te adjunto el código de Arduino que envía todo esto en una sola cadena, y te adjunto el código de processing que recibe y "mastica" estos datos, hasta pasarlos en limpio. (No hace falta que tengas processing para verlo, simplemente renombralo como .txt y abrilo)

Ojalá lo puedas adaptar a como envías y recibes por RF (eso no se yo, pero la "lógica" tras el código debe ser similar, cambiará lo que es SerialPrint por otra cosa, y lo mismo desde el lado que escucha)

¿Con el inglés como te llevas?
En este video hacen lo que querés, lo que si, no estoy convencido de que su método sea el mejor pero bueno, echale un vistazo. ¿Realmente funcionan así esas cosas?

http://www.youtube.com/watch?v=3Rs3SJBsiYE
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

roter45

Siento no haber podido escribir antes pero el bachillerato me ha dejado sin tiempo pero bueno con 8,4 de media en primero  :) :) creo que voy bien para estudiar ingenieria industrial en electronica y automatica y poder dedicarme profesionalmente a esto.

Bueno al grano, ya he conseguido que funcione sin problemas, aqui dejo el codigo para que lo veais(esta un poco sucio todavia). Si necesitais cualquier a cosa decirmelo, y si alguno lo ha podido solucionar tambien que cuelgue su solucion XD

Trasmisor

Code: [Select]
#include <VirtualWire.h>


const int Sensor1Pin = A1;
const int Sensor2Pin = A2;
const int Sensor3Pin = A3;
const int Sensor4Pin = A4;
const int ledPin = 13;

int Sensor1Data;
int Sensor2Data;
int Sensor3Data;
int Sensor4Data;
char Sensor1CharMsg[17];

void setup() {

// LED
pinMode(ledPin,OUTPUT);

// Sensor(s)
pinMode(Sensor1Pin,INPUT);
pinMode(Sensor2Pin,INPUT);
pinMode(Sensor3Pin,INPUT);
pinMode(Sensor4Pin,INPUT);

// for debuggin
Serial.begin(9600);

// VirtualWire setup
vw_setup(2000); // Bits per sec


}

void loop() {
 
  // Read and store Sensor 1 data
  Sensor1Data = analogRead(Sensor1Pin);
  Sensor2Data = analogRead(Sensor2Pin);
  Sensor3Data = analogRead(Sensor3Pin);
  Sensor4Data = analogRead(Sensor4Pin);
 
  sprintf(Sensor1CharMsg, "%d,%d,%d,%d", Sensor1Data, Sensor2Data, Sensor3Data, Sensor4Data);
// int message[] = (Sensor1Data, Sensor2Data);
  //message.toCharArray(Sensor1CharMsg,(Sensor1CharMsg.lenght()+1));
  // Convert integer data to Char array directly
  //itoa(Sensor1Data,Sensor2Data,Sensor1CharMsg,10);
 
  // DEBUG
  Serial.print("Sensor1 Integer: ");
  Serial.print("X");
  Serial.print(Sensor1Data);
  Serial.print("Y");
  Serial.print(Sensor2Data);
  Serial.print("X1");
  Serial.print(Sensor3Data);
  Serial.print("Y1");
  Serial.print(Sensor4Data);
  Serial.print("Sensor1Datamsg");
  Serial.println(Sensor1CharMsg);


  // END DEBUG

digitalWrite(13, true); // Turn on a light to show transmitting
vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg));
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false); // Turn off a light after transmission
delay(2);

} // END void loop...


Receptor
Code: [Select]
#include <VirtualWire.h>


// This code have extracts from differents tutorials on the web that I used long time ago, so I can remmeber the authors
#define MOTOR1_CTL1  4  // I1 
#define MOTOR1_CTL2  3  // I2 
#define MOTOR1_PWM   2 // EA 
 
#define MOTOR2_CTL1  7  // I3 
#define MOTOR2_CTL2  6// I4 
#define MOTOR2_PWM   5 // EB 
 
#define MOTOR_DIR_FORWARD  0 
#define MOTOR_DIR_BACKWARD   1






// Sensors
int Sensor1Data;
int Sensor2Data;
int Servo1;
int Servo2;
// RF Transmission container
char Sensor1CharMsg[17];



void setup() {
  Serial.begin(9600);
 
   pinMode(MOTOR1_CTL1,OUTPUT); 
   pinMode(MOTOR1_CTL2,OUTPUT); 
   pinMode(MOTOR1_PWM,OUTPUT); 
     
  // Setup pins for motor 2 
   pinMode(MOTOR2_CTL1,OUTPUT); 
   pinMode(MOTOR2_CTL2,OUTPUT); 
   pinMode(MOTOR2_PWM,OUTPUT);
  // sets the digital pin as output
  pinMode(13, OUTPUT);

   
    // VirtualWire
    // Initialise the IO and ISR
    // Required for DR3100

    // Bits per sec
    vw_setup(2000);
    vw_set_rx_pin(11);
   
    // Start the receiver PLL running
    vw_rx_start();       

} // END void setup

void loop(){
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
   
//Taking the data from the control base
    if (vw_get_message(buf, &buflen))
    {
int i;
        // Turn on a light to show received good message
        digitalWrite(13, true);

        // Message with a good checksum received, dump it.
        for (i = 0; i < buflen; i++)
{           
          // Fill Sensor1CharMsg Char array with corresponding
          // chars from buffer.   
          Sensor1CharMsg[i] = char(buf[i]);
}

      sscanf(Sensor1CharMsg, "%d,%d,%d,%d",&Sensor2Data, &Sensor1Data,&Servo1,&Servo2); // Convierte un string en un array
       
        // Turn off light to and await next message
        digitalWrite(13, false);
    }

// Control the motors
if (Sensor1Data > 700){
   int v1 = 255;//map(Sensor1Data,700,1024,150,250);
  motorStart(1, MOTOR_DIR_FORWARD);   
  setSpeed(1, v1); 
  motorStart(2, MOTOR_DIR_FORWARD);       
  setSpeed(2, v1); 
  delay(2);
  }
 
if (Sensor1Data < 300){
   int v2 = 255;//
   map(Sensor1Data,0,300,250,150);
   motorStart(1, MOTOR_DIR_BACKWARD);   
   setSpeed(1, v2); 
   motorStart(2, MOTOR_DIR_BACKWARD);       
   setSpeed(2, v2); 
   delay(2);
    }
if(300<Sensor1Data<700 && 300 < Sensor2Data < 700){
    motorStop(1);
    motorStop(2);
    }

if(300<Sensor1Data<700){
    if (Sensor2Data > 700){
       int v1 = map(Sensor1Data,700,1024,150,250);
       motorStart(2, MOTOR_DIR_FORWARD);   
       setSpeed(1, 255); 
       motorStart(1, MOTOR_DIR_BACKWARD);       
       setSpeed(2, 255); 
       delay(2);
       }
 
    if (Sensor2Data < 300){
       int v2 = map(Sensor1Data,0,300,250,150);
       motorStart(2, MOTOR_DIR_BACKWARD);     
       setSpeed(1, 255); 
       motorStart(1, MOTOR_DIR_FORWARD);       
       setSpeed(2, 255);
       delay(2);
       }
     }
//End controling the motors
//cabezamovil();
memset( Sensor1CharMsg, 0, sizeof( Sensor1CharMsg));// This line is for reset the Sensor1CharMsg
}


Pestaña 2 del receptor ( lo hago asi pa que quede mas limpio, esta pestaña es para que funcione el doble puente en h)
Code: [Select]
void setSpeed(char motor_num, char motor_speed) 

   if (motor_num == 1) 
   { 
      analogWrite(MOTOR1_PWM, motor_speed); 
   }     
   else 
   { 
      analogWrite(MOTOR2_PWM, motor_speed); 
   } 

 
void motorStart(char motor_num, byte direction) 

   
   char pin_ctl1; 
   char pin_ctl2; 
     
   if (motor_num == 1) 
   { 
      pin_ctl1 = MOTOR1_CTL1; 
      pin_ctl2 = MOTOR1_CTL2; 
   }     
   else 
   { 
      pin_ctl1 = MOTOR2_CTL1; 
      pin_ctl2 = MOTOR2_CTL2;       
   } 
   
   switch (direction) 
   { 
     case MOTOR_DIR_FORWARD: 
     { 
       digitalWrite(pin_ctl1,LOW); 
       digitalWrite(pin_ctl2,HIGH);           
     } 
     break;   
           
     case MOTOR_DIR_BACKWARD: 
     { 
        digitalWrite(pin_ctl1,HIGH); 
        digitalWrite(pin_ctl2,LOW);           
     } 
     break;           
   } 

 
void motorStop(char motor_num) 

   setSpeed(motor_num, 0); 
   if (motor_num == 1) 
   { 
     digitalWrite(MOTOR1_CTL1,HIGH); 
     digitalWrite(MOTOR1_CTL2,HIGH);       
   } 
   else 
   { 
     digitalWrite(MOTOR2_CTL1,HIGH); 
     digitalWrite(MOTOR2_CTL2,HIGH);       
   } 
Visit my blog and leave some comments
controlrobotics.rodrigomompo.com

maxid

ya lo puse en otro post que preguntaban lo mismo, lo mejor para enviar varios valores en usar un entero con potencia de 2.
2,4,8,16,32,128..... y asi.
si 2 es izquierda, 4 es derecha, 8 es arriba y |6 es abajo, puedes combinar izquierda + arriba = 2+32.
Con una simple operacion and obtienes el valor que llega:
34 & 2 = 2 obtengo el valor buscado
34 & 32 = 32
34 & 16 = 0 no existe ese valor dentro de 34
me explico?
El que pregunta aprende, el que responde aprende a responder.

Go Up