Xbee - lettura dal seriale

Salve, ormai mi conoscete.. purtroppo :D Sono stato costretto ad aprire un'altro topic per evitare di fare confusione con i problemi del precedente. Una volta che ho settato gli xbee, riesco ad inviare dati, ma non a leggerli ! Es: Potenziometro wireless Sull'arduino trasmettitore ho:

int val;
void setup(){
  Serial.begin(9600);
}
void loop(){
    val=analogRead(A0);
    Serial.println(val);
    delay(100);
}

Mentre sul ricevente:

int val;
void setup(){
  Serial.begin(9600);
}
void loop(){
    if(Serial.available()>0){
      val=Serial.read();
      Serial.println(map(val,0,1023,0,255));
      analogWrite(11,map(val,0,1023,0,255));
      delay(100);
    }
}

Sul seriale in ricevente ho : 3 2 11 Che non so quanti siano in hex e che variano in base alla posizione del potenziometro. Mi confondo sempre di più.. ho cercato in rete ma gli esempi per cose del genere avevano solo gli sketch per la trasmissione, dando per scontata la ricezione :\

Il map devi faarlo sul trasmettitore perchè quando leggi la seriale ricevi delle stringhe e non dei numeri.... vedrai che poi funziona ;)

come dice Ratto se mandi i valori ADC direttamente mandi 2 numeri che insieme sarebbero un valore da 0 a 1023, Se li leggi singolarmente ricevi numeri abbastanza insignificativi se sono sopra 255. Ciao Uwe

ratto93: Il map devi faarlo sul trasmettitore perchè quando leggi la seriale ricevi delle stringhe e non dei numeri.... vedrai che poi funziona ;)

Ho provato a printarli e basta senza lato ricevitore ma non funziona lo stesso.. Comunque stavo ricordando che in alcuni casi sul seriale passano valori in HEX. Nel senso: arduino legge i valori con un Serial.read() e quando li printa li trasforma in seriale, può essere ?

aspetta te hai un altro problema.... dal lato ricevitore hai un arduino connesso ad un xbee e al pc... giusto ? l'xbee dove l'hai attaccato a livello di pin ?

ratto93: aspetta te hai un altro problema.... dal lato ricevitore hai un arduino connesso ad un xbee e al pc... giusto ? l'xbee dove l'hai attaccato a livello di pin ?

Si, uso questa board per metterci il modulo e lato ricevente ho una scheda arduino 2009 collegata in TX->TX RX->RX (invertendoli non funziona, forse la serigrafia dei pin è sbagliata) e lato trasmittente uno standalone con lo stesso collegamento della scheda

Allora.... il problema è il seguente: sulla trasmittente devi solo cambiare il codice come ti ho detto prima... sulla ricevente devi usare la NewSoftwareSerial e collegare quel adattatore in una altra coppia di pin (li scegli te nella dicharazione), collegandoli al Tx ed Rx di arduino come stai facendo ora quando lo colleghi alla seriale il convertitore Usb-seriale va in conflitto con L'xbee perchè può essere collegato ad una sola periferica per volta te come lo colleghi ne colleghi 2 Atmega ed Xbee

Se usi la SwSerial sposti l'xbee di pin leggi su quei pin e stampi sulla seriale "Standard"

ratto93:
Allora…
il problema è il seguente:
sulla trasmittente devi solo cambiare il codice come ti ho detto prima…
sulla ricevente devi usare la NewSoftwareSerial e collegare quel adattatore in una altra coppia di pin (li scegli te nella dicharazione), collegandoli al Tx ed Rx di arduino come stai facendo ora quando lo colleghi alla seriale il convertitore Usb-seriale va in conflitto con L’xbee perchè può essere collegato ad una sola periferica per volta te come lo colleghi ne colleghi 2 Atmega ed Xbee

Se usi la SwSerial sposti l’xbee di pin leggi su quei pin e stampi sulla seriale “Standard”

OK, ci siamo quasi. Ho fatto un codice del genere ma le letture del mySerial sono comunque sbagliate (o sono valori hex oppure variano ad muzzum):

#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 2
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
int val;

void setup(){
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
}
void loop(){
  val=mySerial.read();
  Serial.println(val);
  analogWrite(11,val);
  delay(100);
}

Sul trasmettitore sempre:

int val;
void setup(){
  Serial.begin(9600);
}
void loop(){
  val=map(analogRead(A0),0,1023,0,255);
  Serial.println(val);
  delay(100);
}

L’ho provato al volo, mancava una cosa… non me ne ero accoro:sweat_smile:
prova così :

int val;
void setup(){
  Serial.begin(9600);
}
void loop(){
  val=map(analogRead(A0),0,1023,0,255);
  Serial.println(val,DEC);
  delay(100);
}

ratto93: L'ho provato al volo, mancava una cosa... non me ne ero accoro:sweat_smile: prova così :

int val;
void setup(){
  Serial.begin(9600);
}
void loop(){
  val=map(analogRead(A0),0,1023,0,255);
  Serial.println(val,DEC);
  delay(100);
}

Provato, sempre uguale. Comunque il problema è nel codice molto probabilmente, infatti se la scheda ricevente la collego in usb ed apro il terminale di xctu i dati arrivano puliti come dovrebbero (anche se con un "." davanti, ma credo sia perchè va a capo con il println).

Se li leggi correttamente con x-ctu vuol dire che il problema non è il codice perchè sennù li leggeresti sballati anche li, probabilemte ora il problema sta nel codice della ricevente...

ratto93: Se li leggi correttamente con x-ctu vuol dire che il problema non è il codice perchè sennù li leggeresti sballati anche li, probabilemte ora il problema sta nel codice della ricevente...

certo, ricevente era sottinteso. Però aspetta.. io ho usato la libreria SoftwareSerial, non NewSoftwareSerial

Sono riuscito (diciamo) a leggere questi benedetti valori !
Sul trasmittente ho cambiato solo il Serial.print in Serial.print(valore,BYTE).
Sul ricevitore invece :

#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 2
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

byte incomingByte;

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

void loop(){
  incomingByte = mySerial.read();
  Serial.println(int(incomingByte));
  analogWrite(11,int(incomingByte));
  
}

Solo che a volte mi compare un 128 di mezzo. Ho pensato fosse per un ritardo dell’invio, anche perchè il mySerial non ha la proprietà “available” !
Però può anche non centrare niente perchè il 128 si presenta solo quando ricevo valori bassi(0), mentre quando ricevo 255 i valori sono tutti puliti…

Mi correggo, non è solo un numero che compare ma sono tanti valori casuali che compaiono quando la value in byte che invio è sotto i 200-170.
Sto impazzendo, senza di questo non vado avanti :open_mouth:

Ragazzi, non vi seccate ma qui mi sa che il problema sta alla base di qualcosa. Ho provato anche a ricevere sul seriale "standard" e qindi ad utilizzare altri codici di altri post come:

byte a,x,y;

void setup(){
  Serial.begin(9600);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
}

void loop(){
  x = 0;
  y = 0;

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

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

      analogWrite(10,int(x));
      analogWrite(11,int(y));

}

Sul tx:

Serial.print (255, BYTE);
  Serial.print (x, BYTE);
  Serial.print (254, BYTE);
  Serial.print (y, BYTE);

Ma niente,niente,niente ! Il peggio è che ricevendo sul seriale standard non posso stampare sullo stesso per visualizzare i valori, perchè andrebbe in confusione,come detto da un utente. Quindi uso i led per vedere i valori ma non corrispondono ai valori che mando. Uno viene da un pot e l'altro (non avendo un altro pot) proviene dai 5v fissi. Ci tolgo mano ? :|

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

lesto: 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 ?

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

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

lesto:

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 :

 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:

#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 :\

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