Connessione due arduino+Xbee

Buonasera, oggi mi sono arrivati due moduli xbee serie 1, due xbee shield e la piattaforma per interfacciare i moduli xbee alla porta usb del pc...ho seguito una guida per configurare i due moduli per comunicare tra loro però quando vado a caricare il programma della guida (che ho adattato alle mie esigenze) non succede nulla..preciso che la mia idea è quella di far ruotare la leva del servo di un certo angolo in corrispondenza del valore ottenuto dal sensore di flessione...
ecco il programma del ricevente

//Include Servo Library
#include <Servo.h>

//Define Pins
int servoPin = 9;

//Create Servo Object
Servo myServo;

void setup()
{
 //Start Serial
 Serial.begin(9600);
  
  //Attaches the Servo to our object
  myServo.attach(servoPin);
  
  delay(500);
}

void loop()
{  

  while( Serial.available() > 0) Serial.read();
  int degrees = Serial.read() -'0';

  int degrees1 = map(degrees, 0, 90, 180, 0);
  degrees1 = constrain(degrees, 0, 180);

  //Turn the servo
  Serial.println(degrees);
  myServo.write(degrees1);

  
  
}

e questo il trasmittente

//Define Pins
int SensorPin = A0;

void setup()
{
  //Create Serial Object (9600 Baud)
  Serial.begin(9600);
}

void loop()
{
  int sensor, degrees;
  sensor = analogRead(0); 
  degrees = map(sensor, 254, 153, 0, 90); 
   
  Serial.println(degrees);
  delay(50);
  
}

Mi spiegate cosa non va??

La trasmissione seriale avviene byte per byte. Inoltre la funzione println serve per "stampare", cioè scrivere, sulla seriale i dati in formato "umano", ossia i numeri vengono convertiti in stringhe di cifre, a seguire mette poi il carattere di invio.
Quindi il valore 50, faccio un esempio, diventa "5"+"0"+"\n"

Se vuoi spedire un byte proprio come byte, usa il metodo Serial.write.

Ovviamente se devi spedire un valore più grande di quello contenibile in un byte (255), devi usare 2 o più byte, scomponendo il numero e poi ricostruendolo in fase di lettura sull'Arduino slave.

ho introdotto la funzione Serial.write nel programma trasmittente

//Define Pins
int SensorPin = A0;

void setup()
{
  //Create Serial Object (9600 Baud)
  Serial.begin(9600);
}

void loop()
{
  int sensor, degrees;
  sensor = analogRead(0); 
  degrees = map(sensor, 254, 153, 0, 90); 
  Serial.write(degrees);
  
   
  Serial.println(degrees);
  delay(50);
  
}

ma ancora niente...sulla porta seriale del ricevente mi arriva sempre il numero 49 non capisco perché e non varia nemmeno se piego il sensore...

alla fine ho risolto quel problema, ma adesso mi servirebbe un altro aiutino...in pratica io ho bisogno di pilotare due servo (con angolazione differente) in base al movimento di due sensori diversi...come devono essere impostate le due funzioni Serial.write() e Serial.read() per far corrispondere alla flessione del sensore il movimento del proprio unico servo??

Cioè ad ogni sensore è "collegato" un servo?
Tu devi spedire sulla stessa seriale le impostazioni per i 2 servo?

Puoi aggiungere un carattere arbitrario che indica a quale dei 2 servo si riferisce il dato in arrivo, il programma ricevente non deve fare altro che prendere il dato in arrivo e poi usarlo per impostare il servo corrispondente.

Grazie mille per la risposta, per fare tutto ciò secondo te potrei fare in questo modo: inviare una stringa che contenga un numero identificativo iniziale per ogni sensore dal trasmettitore e, poi, far leggere dal ricevente il primo valore e, se corrisponde ad esempio ad 1 (primo sensore) far muovere il primo servomotore? E se si potresti dirmi come posso far leggere all'arduino ricevente solo il primo valore della stringa? Comunque questi sono i due nuovi codici, grazie ancora per l'aiuto che mi stai dando :slight_smile:
Trasmettitore

void setup()
{
  // inizializza la comunicazione seriale
  Serial.begin(9600);
}

void loop()
{
  int sensor, degrees;
  int sensor2, degrees2;
  
  // read the voltage from the voltage divider (sensor plus resistor)
  sensor = analogRead(A0);
  sensor2 = analogRead(A1);
  //conversione dei valori ottenuti dalle porte analogiche
  //primo sensore
  degrees = map(sensor, 235, 122, 0, 90);
 //Proporzione per l'angolo da far raggiungere al primo servomotore
  int degrees1 = map(degrees, 0, 90, 0, 180);
  //secondo sensore
  degrees2 = map( sensor, 235, 122, 0, 90);
 //Proporzione per l'angolo da far raggiungere al secondo servomotore
  int degrees3 = map(degrees2, 0, 90, 0, 180); 
 
  //scrive i valori
  //Per il primo servomotore
  Serial.write(degrees1);
  //Per il secondo servomotore
  Serial.write(degrees3);  
  
  
  delay(100);                     
}

Ricevente

#include <Servo.h> 
Servo myservo;
Servo myservo1;

void setup() {
  Serial.begin(9600);
  myservo.attach(9);
  myservo1.attach(11);
}
void loop() {
  if(Serial.available() > 0) {
    myservo.write(Serial.read());
    myservo1.write(Serial.read());
    Serial.println(Serial.read());
  }
}

Ecco il nuovo codice, ho cercato di svilupparlo per conto mio, ma sono ad un punto morto adesso =( (ho dovuto utilizzare nuovamente la funzione serialprintln al posto della serial.write per "stampare" la stringa...adesso il problema è sull'arduino ricevente in quanto ho provato ad utilizzare la Serial.readBytesUntil(), ma mi da sempre errore e non capisco dove sbaglio dato che vorrei che il punto costituisse il carattere terminatore...inoltre come posso far assumere al servo il valore ricevuto fino al punto? Grazie ancora per l'aiuto...
ecco i due codici

void setup()
{
  // inizializza la comunicazione seriale
  Serial.begin(9600);
}

void loop()
{
  int sensor, degrees;
  int sensor2, degrees2;
  
  // read the voltage from the voltage divider (sensor plus resistor)
  sensor = analogRead(A0);
  sensor2 = analogRead(A1);
  //conversione dei valori ottenuti dalle porte analogiche
  //primo sensore
  degrees = map(sensor, 232, 97, 0, 90);
  int degrees1 = map(degrees, 0, 90, 0, 180);
  //secondo sensore
  degrees2 = map( sensor2, 253, 131, 0, 90);
  int degrees3 = map(degrees2, 0, 90, 0, 180); 
 
  //scrive i valori
  String str = "";
  str += "1";
  str += int(degrees1);
  str += ".";
  Serial.println(str);
  
  String str1 ="";
  str1 += "2";
  str1 += int(degrees3);
  str1 += ".";
  Serial.println(str1);
   
  delay(100);                     
}
#include <Servo.h> 
Servo myservo;
Servo myservo1;

void setup() {
  Serial.begin(9600);
  myservo.attach(9);
  myservo1.attach(11);
}
void loop() {
  Serial.flush();
   String string = "";
   string += Serial.read();
   if(Serial.available() > 0) {
    if (string.startsWith("49")); {
      Serial.readBytesUntil("46");    
      myservo.write();
    }
    if(string.startsWith("50")); {
    myservo1.write();
    }
  }  
}