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);
}
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.
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
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);
}
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);
}