xbee non comunicano

ciao
ho iniziato a fare delle prove con i moduli xbee ma non riesco a ricevere quello che trasmetto
gli arduino montano entrambi un xbee shield, uno genera correttamente su serial monitor ma l'altro non riceve
chi mi può almeno dire se c'è un errore?

questo trasmette

void setup()
{
  Serial.begin(9600);
}

void loop()
{
   for (int i=0; i <= 255; i++)
   {
     Serial.print(i); 
      delay(500);
   } 
}

questo riceve

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins
int incomingByte=0;      // a variable to read incoming serial data into

void setup() 
{
  lcd.begin(16, 2);  // set up the LCD's number of columns and rows: 
  Serial.begin(9600); // initialize serial communication:
  lcd.clear();
  lcd.setCursor(1,1); 
}

void loop() 
{
 if (Serial.available() > 0)  // see if there's incoming serial data:
  {
     incomingByte = Serial.read();  // read the oldest byte in the serial buffer:

  lcd.print(incomingByte,DEC);
  }
}

grazie
stefano

probabilmente quello che trasmette lo fa prima che l'altro sia pronto a ricevere, a causa dell'inizializzazione dell'LCD. metti una delay nel setup della trasmittente di un secondo e tutto dovrebbe funzionare

ciao
grazie lesto

ho fatto adesso vedo qualcosa, ma non ancora tutti i dati trasmessi ho provato anche con lcd.write,

continuo a fare prove
grazie
stefano

stefa24:
ciao
grazie lesto

ho fatto adesso vedo qualcosa, ma non ancora tutti i dati trasmessi ho provato anche con lcd.write,

continuo a fare prove
grazie
stefano

aumenta ancora un po' il delay :slight_smile:

TX

void setup()
{
  Serial.begin(9600);
  delay(1000);  //aggiunto anche questo
}

void loop()
{
   for (int i=0; i <= 255; i++)
   {
     Serial.println(i); 
      delay(1000);   //ho aumentato questo delay
   } 
}

RX

// include the library code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins
//int incomingByte=0;      // a variable to read incoming serial data into

void setup() 
{
  lcd.begin(16, 2);  // set up the LCD's number of columns and rows:
  Serial.begin(9600); // initialize serial communication:
}

void loop() 
{
 if (Serial.available() > 0)  // see if there's incoming serial data:
  {
    delay(1000);// wait a bit for the entire message to arrive  anche questo aggiunto
    lcd.clear();// clear the screen
  //  incomingByte = Serial.read();  // read the oldest byte in the serial buffer:
 
  lcd.print(Serial.available());
 
  }
}

con questo ricevitore funziona ma compaiono dei caratteri strani "|||" a sx dei numeri, comunque meglio di niente
adesso proseguo con lo sviluppo della applicazione, vi tengo aggiornati

grazie
stefano

stefa24:
TX

void setup()

{
  Serial.begin(9600);
  delay(1000);  //aggiunto anche questo
}

void loop()
{
   for (int i=0; i <= 255; i++)
   {
     Serial.println(i);
      delay(1000);   //ho aumentato questo delay
   }
}





RX


// include the library code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins
//int incomingByte=0;      // a variable to read incoming serial data into

void setup()
{
  lcd.begin(16, 2);  // set up the LCD's number of columns and rows:
  Serial.begin(9600); // initialize serial communication:
}

void loop()
{
if (Serial.available() > 0)  // see if there's incoming serial data:
  {
    delay(1000);// wait a bit for the entire message to arrive  anche questo aggiunto
    lcd.clear();// clear the screen
  //  incomingByte = Serial.read();  // read the oldest byte in the serial buffer:

lcd.print(Serial.available());

}
}




con questo ricevitore funziona ma compaiono dei caratteri strani "|||" a sx dei numeri, comunque meglio di niente
adesso proseguo con lo sviluppo della applicazione, vi tengo aggiornati

grazie
stefano

si, stai usando la println quella LN final vuol dire che aggiunge il vai a capo... che lcd non sa gestire e stampa roba strana.

Scusa, ma ti serve nel TX mettere Serial.println? Non puoi mettere Serial.print e basta? Così eviti che ti invii anche i ritorni a capo.

ciao
grazie per il supporto
il println lo avevo messo solo per verificare con il serial monitor del tx cosa stavo trasmettendo stasera lo tolgo

grazie
stefano

ciao
ci sono sviluppi negativi ieri sera nonostante ...printLN funzionava e c'era corrispondenza frà TX e RX
ho tolto LN e funzionava mentre ora, dopo varie prove per provare la mia applicazione definitiva, a 127 si ferma, inoltre non ho + corrispondenza tra quello che vedo con il serial monitor del TX e quello che vedo sul display, suggerimenti

grazie
stefano

ma è il codice del TX che si blocca a 127 o il codice dell'RX che non va avanti?

e quale non corrispondenza ti ritrovi? puoi postare gli output?

ciao
quello che si blocca a 127 è RX e non c'è corrispondenza/sincronismo tra il valore letto con serial monitor di TX e quello visualizzato dal display del RX
come faccio a postare l'output?
su serial monitor di RX ho una fila di numeri non spaziati che vanno da dx a sx
mentre sul display ho un numero che cambia nella posizione 0,0

grazie
stefano

il coportamento mi pare corretto

ciao
cosa significa?
è corretto che si comporti così perchè il programma del RX non è corretto

grazie
stefano

secondo il codice che hai postato è corretto che funzioni così.
spero che tu non usi contemporaneamente serial monitor che xbee sugli stessi pin, se usi uno stacchi l'altro.

se mi spieghi cosa vuoi ottenere ti spiego cosa sbagli.

ciao
provo a spiegarmi ho 2 arduini collegati al pc su 2 diverse porte usb

TX con xbee shield
RX con xbee shield

seguo le istruzioni che mi dicono di spostare i jumper su usb quando faccio l'upload e su xbee quando devono comunicare
scegliendo la porta corretta nell'ide di volta in volta

in posizione entrambi su xbee
TX trasmette e visualizzo i dati del ciclo for con serial monitor che dovrebbero essere quelli trasmessi 0-255 0-255 eccetera
RX ricevo dati diversi da quelli visualizzati e inoltre arrivato a 127 e si ferma

progetto:
montare TX su una macchina fissa e tramite un interrupt cogliere lo stato HIGH di un sensore induttivo quando il dente di un ingranaggio gli passa davanti, incrementare quindi una variabile (ad es cont++) e trasmettere questo dato

ad RX che intanto si allontana trascinando un tubo avvolto su una ruota che fa girare l'ingranaggio nominato prima

in pratica noto il numero di giri al metro dell'ingranaggio, quindi il numero di denti contati, ottengo il numero di metri di tubo srotolato che visualizzo sul display di RX per potermi fermare al momento opportuno, prima di arrivare a svolgere tutto il tubo rischiando di rompere la macchina, parliamo di quasi 400 mt, a questa distanza faccio fatica a cogliere il momento in cui finisce il tubo, soprattutto quando devo fare questa operazione di notte

grazie
stefano

puoi fare copia incolla di ciò che visualizzi nel monitor seriale della RX?

comunque se usi ancora il codice che hai postato,

 lcd.print(Serial.available());

vuol dire che nell'LCD stampi il numero di caratteri arrivati a destinazione, non questi caratteri (notare che ogni cifra è un carattere, quindi 127 è 3 caratteri)

ciao
questo è il codice che sto provando:

TX

void setup()
{
  Serial.begin(9600);
  delay(1000);
}

void loop()
{
   for (int i=0; i <= 255; i++)
   {
     Serial.print(i);
    Serial.print("\t"); 
      delay(1000);
   } 
}

RX

int incomingByte = 0;	// for incoming serial data

void setup() {
	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
}

void loop() {

	// send data only when you receive data:
	if (Serial.available() > 0) {
		// read the incoming byte:
		incomingByte = Serial.read();

		// say what you got:
		Serial.print("I received: ");
		Serial.println(incomingByte, BYTE);
	}
}

questo l'output su serial monitor:

I received: 6
I received: 2
I received: 	
I received: 6
I received: 3
I received: 	
I received: 6
I received: 4
I received: 	
I received: 6
I received: 5
I received: 	
I received: 6
I received: 6
I received: 	
I received: 6
I received: 7
I received: 	
I received: 6
I received: 8
I received: 	
I received: 6
I received: 9
I received: 	
I received: 7
I received: 0
I received: 	
I received: 7
I received: 1
I received: 	
I received: 7
I received: 2
I received:

questi numeri che ricevo corrispondono a ciò che trasmetto ma li devo mettere insieme, comunque mi rendo conto di essere + ignorante di quello che immaginavo

grazie
stefano

per leggerli è semplice: li raccogli finchè non ricevi lo "\t" che invii... e quando arriva sai che il dato arrivato è completo & utilizzabile. Si blocca ancora a 127, o altri problemi?

ciao
no, su serial monitor va bene, meno male che mi dici questo, stavo appunto pensando a come mettere insieme i numeri

grazie
stefano

ciao
questo è il codice con interrupt che proverò nei prossimi giorni per:

TX

int statosensore1=LOW;  //stato iniziale del sensore
int count=0;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(0,sensore1,RISING); //sensore induttivo collegato al pin 2
}

void loop()
{
   if (statosensore1==HIGH)
   {
    count++;
     Serial.print(count); //trasmesso attraverso xbee
     Serial.print("\t"); //trasmesso attraverso xbee
   }
  statosensore1=LOW; 
}


void sensore1() //sul pin 2
{
  statosensore1=HIGH;
}