Comunicazione nRF24

Buongiorno a tutti,

devo inviare da Arduino Mega (RX) a Arduino UNO (TX) una risposta composta da in insieme di variabili che possono essere sia alfabetiche sia numeriche; la stringa risultante verrebbe poi scomposta nelle singole parti da Visual basic.

Nessun problema sulla parte ricevente, riesco ad ottenere una stringa dei valori desiderati da tramettere in risposta al Mega (ad es. “10-115-24-abc-”) che visualizzo senza problemi sulla seriale. I singoli valori sono di lunghezza variabile e vengono separati dal carattere “-” (ma posso utilizzare qualsiasi carattere).

La difficoltà è sul trasmettitore, in quanto mi “arrivano” sulla porta seriale i dati richiesti, questi sono simboli indecifrabili. Ho provato a cercare una soluzione in rete, ma non sono riuscito a trovare esempi alla mia portata (sono decisamente ignorante nel settore!). I singoli caratteri, inoltre, non mi pare abbiano corrispondenza nella tabella ASCII.

Allego i file relativo all’Arduino Uno; questa è la parte che gli viene trasmessa dall’Arduino Mega:

void Trasmetti() {
 radio.stopListening();

 String invio = "";

 invio = String(v_i) + "-" +  String(v_Sem) + "-" + String(v_turni) + "-" +  String(v_TrVolee);

 radio.write(&invio, sizeof(invio));
 Serial.println(invio);
 radio.startListening();
}

PS: scusate ma non sono riuscito a capire come devono essere allegate le parti di file; ho fatto un volgarissimo copia/incolla!

TX_Gara_Prova_07.ino (1009 Bytes)

enrico24:
PS: scusate ma non sono riuscito a capire come devono essere allegate le parti di file; ho fatto un volgarissimo copia/incolla!

… ma … lo devi racchiudere tra i tag CODE … quindi:

in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

Ma hai letto quello che ho scritto ? ? ? :o :o :o

quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post

Ho quindi cancellato il tuo post e ... DEVI CORREGGERE il post iniziale.

Guglielmo

Spero che l'ultima correzione da me fatta sia accettabile; mi scuso comunque in anticipo per eventuali ulteriori inesattezze, vi garantisco che sono del tutto involontarie.

Mi chiedo però se oltre a richiedere il rispetto "formale" (uso il virgolettato in quanto ritengo il grassetto assimilabile al maiuscolo) del regolamento riuscite a fornire anche un aiuto a quanti, come il sottoscritto, sono ignoranti nel settore.

Scusate ancora lo sfogo, che non è da ritenersi conseguenziale agli appunti giustamente ricevuti, ma al fatto che questi sono stati gli unici riscontri (con una gradita eccezione) alle mie richieste di chiarimento.

Cordiali saluti

enrico24:
Mi chiedo però se oltre a richiedere il rispetto "formale" (uso il virgolettato in quanto ritengo il grassetto assimilabile al maiuscolo) del regolamento riuscite a fornire anche un aiuto a quanti, come il sottoscritto, sono ignoranti nel settore.

Solo per chiarire e, ti assicuro, senza fare alcuna polemica ...

Io come moderatore, ho il compito di far applicare il regolamento, inoltre, dato che personlmente NON uso gli nRF24, normalmente non do risposte in merito se non, eventualmente, sull'uso di librerie obsolete (es. la vecchia VirtualWire ormai sostituita dalla RadioHead) o su evidenti errori di programmazione.

Non solo, ricorda che qui è tutta gente volontaria che fa quello che fa per passione, nel tempo libero (che spesso sottrae alla famiglia) e "gratuitamente", quindi ... nessuno ha l'obbligo di risponderti (... mentre tu, ovviamnete, hai l'obbligo di rispettare il regolamento del luogo dove ti trovi).

Se qualcuno vede il tuo thread, conosce il problema ed ha tempo di indicarti una risposta, stai tranquillo che lo fa, altrimenti ... beh, si deve attendere con pazienza una risposta che magari non arriverà mai e non ci si può comunque lamentare :slight_smile:

Guglielmo

... detto questo ... non è che quello che ti arriva sulla seriale sono valori "binari" che magari non hanno corrispondenza con il set ASCII ?

Hai provato ad usare, invece del monitor seriale, che è molto semplice, un emulatore di terminale in grado di farti vedere i valori anche in HEX ? ... magari riesci a capire quello che ricevi ::slight_smile:

Guglielmo

Edit: Io suggersico Coolterm .. è multipiattaforma, è gratuito ed ha tante belle funzionalità, inclusa la cattura su file di ciò che riceve.

Aggiungo un’altra cosa, nel tuo pezzo di programma, nel post iniziale, vedo un uso, anzi, un vero abuso della classe String …

… ti ricordo che NON sei su un PC dove c’è un sistema operativo ed un “garbage collector”, sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe “String”, a causa dell’allocazione e riallocazione dinamica della memoria, porta quasi sempre … a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Impara ad usare le stringhe classiche del C … ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (… che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>.

Guglielmo

Buonasera,
grazie dei consigli, e, scusa, rispetto il lavoro di tutti ed in particolare del moderatore che i questi forum è necessario; a mio personale parere (e non è una critica) ritengo però troppo "pesante" il "regolamento"; probabilmente è però stato necessario svilupparlo così per evitare usi, abusi ed inesattezze. Vista la mia inesperienza nel forum non sono in grado (e non voglio!) criticarlo ma cercherò di seguirlo.

Veniamo a noi.

Sono pienamente d'accordo sul fatto che arrivino valori ASCII fuori campo, proverò a studiare su come fare un emulatore di terminale (cosa per me completamente nuova).

Ho in programma anche di provare a sostituire le stringhe con gli array (grazie degli indirizzi ... spero non siano in inglese).

Sto inoltre provando ad inviare valori numerici.

Grazie + saluti.

enrico24:
Sono pienamente d'accordo sul fatto che arrivino valori ASCII fuori campo, proverò a studiare su come fare un emulatore di terminale (cosa per me completamente nuova).

Non devi farlo tu ... ti ho messo il link di un prodotto che puoi scaricare :wink:

Guglielmo

Grazie.

Al momento ho risolto con un array al posto delle stringhe come consigliato. GRAZIE.

In pratica il programma funziona così:

TX

void Trasmetti() {
  int invia[4];
  invia[1] = 3;
  invia[2] = 0;
  invia[3] = 0;
  invia[0] = v_i;
  radio.stopListening();
  radio.write(&invia, sizeof(invia));

  radio.startListening();
}

RX

int ricevuto[4];

void Ricevi() {

  radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      radio.read(&ricevuto, sizeof(ricevuto));
      int x = ricevuto[1];
      int y = ricevuto[0];
      int z = ricevuto [2];
      int h = ricevuto [3];
      Serial.println(x);
      Serial.println(y);
      Serial.println(z);
      Serial.println(h);
    }
    radio.stopListening();
    Serial.println();
  }
}

Appena avrò finito il programma con la parte VB, darò un’occhiata più approfondita a coolterm; potrebbe essere interessante per un’ulteriore evoluzione del programma che sto sviluppando.

Ancora grazie + saluti.