Go Down

Topic: Xbee - lettura dal seriale (Read 3771 times) previous topic - next topic

lesto

il codice che hai usato legge 2 interi inviati usando la serrila.write, non la serial.print()
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sciorty


il codice che hai usato legge 2 interi inviati usando la serrila.write, non la serial.print()

Se lo sostituisco l'errore che ricevo è: sketch_oct02a:8: error: invalid conversion from 'int' to 'const uint8_t*'
Ma che differenza c'è tra write e print ?

lesto

Code: [Select]

Serial.write((byte)numero>>8);
Serial.write((byte)numero);

la print trasforma i dati in caratteri ascii, la write li mantiene inalterati.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sciorty


Code: [Select]

Serial.write((byte)numero>>8);
Serial.write((byte)numero);

la print trasforma i dati in caratteri ascii, la write li mantiene inalterati.


Ok, ho fatto un :
Code: [Select]
x=map(analogRead(A0),0,1023,0,255);
  y=map(analogRead(A1),0,1023,0,255);
  Serial.write((byte)255);
  Serial.write((byte)x);
  Serial.write((byte)254);
  Serial.write((byte)y);

Però i valori che ricevo sono sempre sballati T.T
Esempio: Collego tutti e  due gli ingressi analogici ad un solo potenziometro.
I valori che mi printo sul seriale tramite la ricevente con:
Code: [Select]
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 2
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte val,a,x,y;

void setup(){
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
}
void loop(){
  x = 0;
  y = 0;

        // Read first 2 bytes
        a = mySerial.read();
if(a == 255) // Next byte goes in x
   x = mySerial.read();
else if(a == 254) // Next byte goes in y
   y = mySerial.read();
else // Next byte gets ignored
   a = mySerial.read();

// Read next 2 bytes
a = mySerial.read();
if(a == 255) // Next byte goes in x
   x = mySerial.read();
else if(a == 254) // Next byte goes in y
   y = mySerial.read();
else // Next byte gets ignored
   a = mySerial.read();

      Serial.print(int(x));Serial.print(";");
      Serial.println(int(y));

}

sono:
255;0
255;0
..
Giro il pot e iniziano a sballare (i due valori dovrebbero essere uguali visto che provengono dalla stessa uscita del potenziometro) tipo:
0;0

0;0

222;0

220;0

0;222

e a volte si bloccano pure, facendo in modo che i valori mi arrivino a 10 a 10 con un delay di circa 10 secondi..
Non capisco tutto ciò.. mi sento strano perchè a quanto pare ho avuto solo io questo problema  !
Eppure la ricevente li legge bene gli ingressi analogici , c'è qualcosa che non va nell'invio o nella processazione dei dati ricevuti :\

lesto

scusa, ma usa un print e invia i "123456789". poi dall'altra parte leggi i dati in un loop e li stampi a video. dovrebbe arrivarti 1 2 3 4 5 6 7 8 9
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sciorty


scusa, ma usa un print e invia i "123456789". poi dall'altra parte leggi i dati in un loop e li stampi a video. dovrebbe arrivarti 1 2 3 4 5 6 7 8 9


Code: [Select]
void setup(){
  Serial.begin(9600);
}
void loop(){
  Serial.print("1234567");
}

Code: [Select]
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 2
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
char val;

void setup(){
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
}

void loop(){
  val = mySerial.read();
  Serial.print(int(val));
  Serial.println(";");
}

Ho provato così, magari(sicuramente) ho sbagliato a leggere i chat sulla ricevente. Comunque i risultati sono:
-79;

-106;

-106;

-74;

-74;

-75;

-76;

-77;

-78;

-79;

-73;

-74;

53;

-77;

-1;

Sempre tutti diversi e ad ondate di 15 alla volta ogni secondo circa.

lesto

togli il cast ad int in Serial.print(int(val));

se il problema persiste, è un errore di settaggio dei moduli xbee
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sciorty


togli il cast ad int in Serial.print(int(val));

se il problema persiste, è un errore di settaggio dei moduli xbee

Fatto, ma ricevo solo simboli:
´;

±;

µ;

²;

¶;

3;

·;

4;

1;

5;

²;

ÿ;

Comunque gli xbee sono settati bene perchè se i valori li leggo da xctu tramite un explorer, ricevo 1234567.. anche se con queste famose ondate con delay.
Sto impazzendo, ti ringrazio del supporto !

lesto

non usare la softwareserial, scariocati la newsoftwareserial
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sciorty


non usare la softwareserial, scariocati la newsoftwareserial

E allora, rieccomi qua.
Come vedrete posterò tante immagini per essere più chiaro possibile (non lo farei se non fossi disperato).
La situazione è questa: ho due arduini: uno in standalone con questo regolatore di voltaggio; ed uno attaccato ad una normale scheda arduino sui pin 2 e 3 (usando newsoftserial).
Ora,ho fatto diverse prove:
(le due entrate analogiche sono collegate al GND)
-inviando dallo standalone e ricevendo sulla scheda arduino il risultato è questo. Cioè una ricevuta disordinata e non costante.

-inviando dall'xbee attaccato al computer sulla scheda arduino il risultato è questo. Cioè normale, da aggiustare solo nel codice perchè la lettera viene printata di continuo.

-inviando dalla scheda arduino all'xbee sul computer il risultato è questo. Cioè normale, il "." in byte dovrebbe essere uno 0

E' chiaro che il problema sta nello standalone..ma non capisco dove !

Non prendetemi per scemo..disperato si, ma scemo non ancora.

Vi ringrazio tutti in anticipo e ringrazio lesto per la pazienza ed i consigli



lesto

manca la resistenza di pull-up sullo stand alone... da 10kohm sarebe l'ideale, vedi http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

Uhm. Mi pare tu stia sbagliando protocollo di trasmissione.

Se spedisci Serial.println(qualcosa) è normale che tu abbia tutto messo con i ritorni a capo.
Se spedisci una lettura numerica con Serial.println(valore, BYTE), è normale che ti arrivino caratteri senza senso.
Ad esempio, se spedisci Serial.println(map(AnalogRead(X), 0, 1023, 0, 255), BYTE) e ricevi un carattere casuale è normale perché tu non stai ad esempio spedendo il valore 123 (faccio un esempio) ma spedisci il byte che rappresenta quel valore, ossia il carattere ASCII corrispondente. Per ricevere un numero devi spedirlo come numero, ossia Serial.println(map(ecceccc), DEC).
Quando poi lo ricevi devi rimandarlo a video come lo hai ricevuto, ossia mettere:
while (my.available()) {
  Serial.print(my.read(), BYTE);
}

In questo modo ricostruisci ciò che ti arriva come lo hai ricevuto.
Riprendiamo l'esempio di prima. Mettiamo di spedire il numero 123.
Tu lo spedirai come "1"-"2"-"3"-"\n" (parte anche il carattere di ritorno a capo perché hai messo Serial.println)

Quando lo ricevi, leggerai il byte "1" e lo stamperai a video, poi il 2 a seguire, poi il 3 ed infine il ritorno a capo (CHR(13)->\n)

sciorty


manca la resistenza di pull-up sullo stand alone... da 10kohm sarebe l'ideale, vedi http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard

Le resistenze sono solo per i led e il reset.. dove la dovrei mettere io ?


Uhm. Mi pare tu stia sbagliando protocollo di trasmissione.

Se spedisci Serial.println(qualcosa) è normale che tu abbia tutto messo con i ritorni a capo.
Se spedisci una lettura numerica con Serial.println(valore, BYTE), è normale che ti arrivino caratteri senza senso.
Ad esempio, se spedisci Serial.println(map(AnalogRead(X), 0, 1023, 0, 255), BYTE) e ricevi un carattere casuale è normale perché tu non stai ad esempio spedendo il valore 123 (faccio un esempio) ma spedisci il byte che rappresenta quel valore, ossia il carattere ASCII corrispondente. Per ricevere un numero devi spedirlo come numero, ossia Serial.println(map(ecceccc), DEC).
Quando poi lo ricevi devi rimandarlo a video come lo hai ricevuto, ossia mettere:
while (my.available()) {
  Serial.print(my.read(), BYTE);
}

In questo modo ricostruisci ciò che ti arriva come lo hai ricevuto.
Riprendiamo l'esempio di prima. Mettiamo di spedire il numero 123.
Tu lo spedirai come "1"-"2"-"3"-"\n" (parte anche il carattere di ritorno a capo perché hai messo Serial.println)

Quando lo ricevi, leggerai il byte "1" e lo stamperai a video, poi il 2 a seguire, poi il 3 ed infine il ritorno a capo (CHR(13)->\n)



Io finora pensavo il contrario !
Cioè: stampo in byte sul trasmittente, leggo i byte dal ricevente e poi me li trasformo in decimali interi o caratteri..
ora provo !


Grazie mille :D

lesto



manca la resistenza di pull-up sullo stand alone... da 10kohm sarebe l'ideale, vedi http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard

Le resistenze sono solo per i led e il reset.. dove la dovrei mettere io ?


se non metti una pull-up sul pin reset (http://arduino.cc/en/Hacking/PinMapping168) per intenderci è il pin sopra TX, il micro continuerà a resettarsi. Le scritte che vedi sono probabilmente le richeste del boot-loader per un nuovo skecth o salti di tensione causati dal riavvio del micro
la resistenza è da 10kohm (ma se non ce l'hai per ora va bene la resistenza più grande che hai) tra il pin reset (che vedo chiamato col nome A6, sicuro sia un atmega 168 o 328P?) e vcc

p.s. il codice dello stand-alone, provalo prima con l'arduino... se funziona sull'arduino, (e non funziona la pull-up sul reset che comunque è obbligatoria se vuoi far funzionare qualcosa) allora il problema deriva da qualche collegamento, anche se non mi pare di vedere altri errori.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sciorty

#29
Oct 09, 2011, 10:48 am Last Edit: Oct 09, 2011, 11:00 am by sciorty Reason: 1

Uhm. Mi pare tu stia sbagliando protocollo di trasmissione.

Se spedisci Serial.println(qualcosa) è normale che tu abbia tutto messo con i ritorni a capo.
Se spedisci una lettura numerica con Serial.println(valore, BYTE), è normale che ti arrivino caratteri senza senso.
Ad esempio, se spedisci Serial.println(map(AnalogRead(X), 0, 1023, 0, 255), BYTE) e ricevi un carattere casuale è normale perché tu non stai ad esempio spedendo il valore 123 (faccio un esempio) ma spedisci il byte che rappresenta quel valore, ossia il carattere ASCII corrispondente. Per ricevere un numero devi spedirlo come numero, ossia Serial.println(map(ecceccc), DEC).
Quando poi lo ricevi devi rimandarlo a video come lo hai ricevuto, ossia mettere:
while (my.available()) {
 Serial.print(my.read(), BYTE);
}

In questo modo ricostruisci ciò che ti arriva come lo hai ricevuto.
Riprendiamo l'esempio di prima. Mettiamo di spedire il numero 123.
Tu lo spedirai come "1"-"2"-"3"-"\n" (parte anche il carattere di ritorno a capo perché hai messo Serial.println)

Quando lo ricevi, leggerai il byte "1" e lo stamperai a video, poi il 2 a seguire, poi il 3 ed infine il ritorno a capo (CHR(13)->\n)



Forse mi sono espresso male, però al momento il problema non è il tipo di dato che ricevo, ma il dato stesso.
Ho messo la pull up come nell'articolo mettendo anche il bottone di reset ed ho usato la newsoft anche per lo standalone. Ho usato questi due codici come da te consigliato:
Code: [Select]
#include <NewSoftSerial.h>
NewSoftSerial my (3,2);
byte val;
void setup(){
 Serial.begin(9600);
 my.begin(9600);
}
void loop(){
if(my.available())
 val= my.read();
 Serial.print(val, BYTE);
}


Code: [Select]
#include <NewSoftSerial.h>
NewSoftSerial my (3,2);

void setup(){
 Serial.begin(9600);
   my.begin(9600);
}
void loop(){
 my.print(map(analogRead(A0),0,1023,0,255),DEC);
 delay(10);  
 my.print(map(analogRead(A1),0,1023,0,255),DEC);
 delay(10);  
}



Adesso i problemi che avevo prima sono in parte risolti (i dati arrivano di continuo), ma ricevo una roba come 025555555555555550000000000000002550000000000000025555555555555000000000000000025555555555555,
che teoricamente sarebbe giusta perchè un'ingresso è sul gnd ed uno sui 5v ma evidentemente ci sono problemi di "tempo" o che so io..

EDIT: Ho tolto la variabile val mettendo Serial.print(my.read(), BYTE); ma, visto che ricevo 0-2-5-5-0-2-5-5-0, ho pensato che ci volesse un separatore in modo da identificare ed unire ciò che ricevo. Ma quando l'ho fatto, ahimè, i valori li ricevo di nuovo a tratti T,T

Go Up