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