Go Down

Topic: Arduino + X-Bee + X-Bee Shield (problema comunicazione tra due moduli) (Read 675 times) previous topic - next topic

Cassandr@

Buongiorno e grazie a tutti per ogni consiglio,
Ho cercato invano di seguire un tutorial per arduino+x bee+gps per costruire un gps wireless. (il tutorial è disponibile qui http://www.cooking-hacks.com/index.php/blog/tutorial-arduino-deluxe-pack).
Visto che i due moduli x-bee non comunicavano ho provato qualcosa di più semplice (molto semplice) per testarli, seguendo un secondo tutorial per arduino+x bee, senza gps (il secondo tutorial è disponibile qui http://www.cooking-hacks.com/index.php/documentation/tutorials/arduino-xbee-shield).
Anche in questo caso non sono riuscito a far comunicare i due moduli x-bee, nonostante abbia provato ripetutamente anche invertendo i moduli (trasmettitore-ricevitore) e spostando i moduli in combinazioni diverse.

In generale ho:
- due moduli arduino (arduino Uno [R3] & Arduino Duemilanove ATmega168])
- due x-bee shields (non so se sono identiche, guardate in figura)
- due moduli x-bee serie 2 (XB24-z7PIT & XB24-BCIT)

prendendo il tutorial più semplice, proverò a riassumere cosa ho fatto:

1) ho programmato entrambi i moduli (Arduino + x-bee shield + x-bee) in modalità USB (jumpers montati sui piedini più esterni della scheda), con due differenti scretches: (a) codice trasmettitore, (b) codice ricevitore. (vedi sotto)
2) ho posizionato i due jumpers in modalità x-bee (piedini interni della scheda)
3) ho alimentato un modulo su USB (trasmettitore) ed uno con batteria 9v (ricevitore).

Ecco i codici:
1. codice ricevitore (è un esempio presente su arduino: file -> esempi -> communication -> PhisicalPixel):
(escludendo la parte commentata:
Code: [Select]

const int ledPin = 13; // the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into

void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    }
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    }
  }
}

2. codice trasmettitore:
Code: [Select]

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

   void loop()
   {
   Serial.print('H');
   delay(1000);
   Serial.print('L');
   delay(1000);
   }


Non capisco dove sia l'errore, i miei dubbi:
1. i moduli (non identici) potrebbero non comunicare tra loro per differenza di modello?
2. il modulo XB24-Z7PIT (acquisto recentissimo) non sembra avere antenna (vedi immagine), anche se nella descrizione è riportato: w/PCB ant (vedi descrizione)
3. le schede Arduino Duemilanove & Arduino Uno possono "lavorare insieme"?
4. le shield hanno differenze che impediscono l'utilizzo congiunto?

Anche se non avete consigli specifici, ma avete esperienza con x-bee+arduino, potreste indicarmi altri tutorial o guide che mi aiutino a capire meglio o partire da basi più solide.
vi ringrazio tantissimo per ogni aiuto.

in seguito lascio le specifiche dei moduli x-bee che sono i più complicati da recuperare (per le schede arduino non credo sia necessario).



Ecco una foto dei componenti:


ed infine uno zoom suli moduli x-bee:


Ancora un grazie a chiunque possa dedicare un pò di tempo al mio problema.
Cassandr@

Dario Gogliandolo

#1
Nov 28, 2012, 02:54 pm Last Edit: Nov 28, 2012, 02:59 pm by Dario Gogliandolo Reason: 1
Ciao, il Serial.read(); restituisce come valore un char quindi non puoi assegnarlo ad una variabile di tipo int.
cambia questo:
Code: [Select]

int incomingByte;      // a variable to read incoming serial data into


con

Code: [Select]

char incomingByte;      // a variable to read incoming serial data into


oppure (anche se non sono sicuro) se proprio vuoi usare la variabile int devi cambiare il test ovvero invece di:

Code: [Select]

    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    }


dovresti scrivere:

Code: [Select]

    if (incomingByte == 72) {
      digitalWrite(ledPin, HIGH);
    }


dove 72 è il valore ASCII del carattere H... noterai che essendo un valore intero non deve essere messo fra i singoli apici ' '...
Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

Cassandr@

grazie per la pronta risposta Dario,
ho provato quello che mi consigli, ma continuo a non ricevere alcuna trasmissione sul modulo ricevente. (nessun blink sul led pin 13).

il problema è ancora aperto..

Cassandr@

Aggiornamento dei progressi.

Sono riuscito a far comunicare le shield Xbee (primo modello: http://arduino.cc/en/Guide/ArduinoXbeeShield) tra di loro attraverso il tutorial offerto dal link in parentesi.

Sono anche riuscito a far funzionare il modulo GPS come nel tutorial del sito produttore (http://www.cooking-hacks.com/index.php/documentation/tutorials/arduino-gps)
(confermando il funzionamento del modulo e dell'antenna).

Non riesco invece a far funzionare il tutorial dul gps (vedi post seguente)


p.s.: X Dario Gogliandolo:
il suggerimento che mi hai dato si è rivelato non corretto.
come da esempio contenuto del software arduino, l'intestazione
Code: [Select]
int permette di valutare correttamente la lettera 'H'.
(ti ringrazio comunque per l'interessamento e il tempo dedicato).

Cassandr@

Ciò che non riesco a fare è far funzionare il GPS tramite shield Xbee, come da tutorial sul sito del produttore (http://www.cooking-hacks.com/index.php/blog/tutorial-arduino-deluxe-pack)

Il tutorial prevede due sketch, purtroppo, per il limite di caratteri nel post, non posso pubblicare gli sketch, che potete leggere nel link sopra.

1. codice TRASMETTITORE (con gps): (su arduino collegato a batteria)

NOTA: in questo codice viene usata la sentenza (deprecata):
Code: [Select]
Serial.print(GPS_RMC[h],BYTE);
che ho sostituito (come da suggerimento della stessa ide di Arduino) con:
Code: [Select]
Serial.write(GPS_RMC[h]);
(lasciando il resto inalterato)

2. codice RICEVITORE. (su arduino collegato a pc e in ascolto su monitor seriale)



Collegando il ricevitore al monitor seriale di Arduino, rilevo delle stringhe, ma alcuni caratteri sono decisamente non ASCII.
Inizialmente le stringhe configurano e sembra che tutto vada correttamente, ma i caratteri non ASCII non mi fanno capire nè cosa esattamente vada a buon fine, nè soprattutto la stringa del GPS (illeggibile).
Dopo una prima stringa gps il tutto si ferma.

Per completezza aggiungo che, in prove recenti in cui non funzionava il gps, la fase di calibrazione mi restituiva sul monitor seriale tutte le stringhe correttamente formattate.
In quel caso mi veniva scritto:
Code: [Select]

-------- Config device --------
+++++++++OK ATRE
OK ***** Device reset *****

-------- Reading device parameter --------

ATID
3332 ATCH
C ATMY
0 ATSH
13A200 ATSL
4080C1BD ATDH
0 ATDL
0 ATBD
3 -------- Config device parameter --------

ATID3329
OK ATCHD
OK -------- Reading device parameter --------

ATID
3329 ATCH
D ATMY
0 ATSH
13A200 ATSL
4080C1BD ATDH
0 ATDL
0 ATBD
3

------ Receiving data from GPS --------
ERROR


Adesso in tutte le righe compaiono caratteri non ascii.. ma non so se ciò comporta miglioramenti o peggioramenti nei miei passi avanti.


per favore, ringrazio chiunque possa aiutarmi a fare passi avanti...

Go Up