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
#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
#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...