Go Down

Topic: PJON - Protocollo di comunicazione opensource TEST/COMMENTI/CRITICHE (Read 12890 times) previous topic - next topic

gbm

Ciao, qualsiasi costante di configurazione con #define va messa prima dell' #include PJON.h cosi' da permettere a PJON di trovare definite quelle costanti. PJON_INCLUDE_NONE non include alcuna strategia, e ti permette potenzialmente di definirne una ad hoc e testarla passandola a PJON<tuaStrategia> se definita prima di PJON ovviamente. Se vuoi solo una strategia per esempio SWBB definisci PJON_INCLUDE_SWBB prima di #include PJON.h

bus.set_shared_network(bool) ti permette di decidere se vuoi includere nei pacchetti il nome gli id dei bus, quindi se hai configurato per esempio piu' gruppi di device (gruppo 0.0.0.1 e 0.0.0.2), passando true o se includere solo l'id del device nel pacchetto. Se non ti servono i gruppi puoi risparmiare 4 byte di overhead + 4 se includi le info dell'inviante.

bus.set_communication_mode ti permette di settare se vuoi poter trasmettere bidirezionalmente o monodirezionalmente, se PJON_SIMPLEX monodirezionale, se PJON_HALF_DUPLEX bidirezionale

L'acknowledge quindi la conferma di corretta ricezione e' disponibile in due varianti, un meccanismo sincrono, dove il trasmettitore aspetta (blocking) che un singolo carattere (6 ACK o 21 NAK) venga spedito dal ricevitore dopo la computazione del pacchetto. La versione asincrona invia un intero pacchetto contenente un id (che permette di riconoscere a quale pacchetto si riferisce la conferma) che permette al trasmettitore di inviare (non-blocking) fare altro e aspettare la conferma in un tempo futuro. Questo meccanismo per esempio permette a una conferma di poter fare piu di un hop, cosa che un ACK sincrono non puo' fare per ovvi motivi. La cosa interessante e' che possono essere usati assieme, vedi recursive acknowledgment pattern nella specifica di PJON.


Se setti router true puoi fare in modo che la funzione di ricezione venga chiamata in ogni caso alla ricezione di qualsiasi pacchetto e quindi per esempio rispedirlo su un altra linea PJON.

set_packet_auto_deletion se settato false (di default true) ti permette di poter evitare che i pacchetti vengano eliminati quando spediti o ricevuta conferma di ricezione, per eventualmente poter gestire a basso livello la libreria per usi particolari
Community robotica / programmazione Arduino
www.gioblu.com
PJON multimaster communications bus system for Arduino and IOT https://github.com/gioblu/PJON

Franchelli

Ciao,
stavo leggendo gli esempi riguardanti la strategia "Serial" e mi sono chiesto se è possibile utilizzare invece che la seriale hw a bordo, una seriale emulata tramite libreria SoftwareSerial.

In caso affermativo potresti postare lo spezzone di codice modificato allo scopo ?
Grazie mille

gbm

Ciao Franchelli, istanzia SoftwareSerial, chiama begin al baudrate che preferisci e passa l'oggetto a set_serial esattamente come fai con Serial standard, dovrebbe funzionare in maniera totalmente agnostica.
Community robotica / programmazione Arduino
www.gioblu.com
PJON multimaster communications bus system for Arduino and IOT https://github.com/gioblu/PJON

Franchelli

Qualche post fa avevo segnalato che alla compilazione di uno sketch preso
tra i tuoi esempi mi esce un errore per la mancanza nello stesso di due librerie (SPI ed ETHERNET).
Volevo sapere se sono gli esempi da aggiornare oppure c'è qualche dettaglio che mi sfugge...
Io uso le librerie alla ultima versione disponibile così come l'IDE Arduino.

gbm

ciao Franchelli!

Rileggendo dici che aggiungendo alla libreria Pjon.h anche

le seguenti librerie
#include <Ethernet.h>
#include <SPI.h>

il tutto funziona.

Dove aggiungi queste due righe?
Strano, non capisco come sia possibile io non riesco a replicare questo problema, anche se un utente russo ha riportato lo stesso problema (ma senza proporre come hai fatto tu una soluzione). Sarebbe di certo carino inquadrare perche' succede.
Community robotica / programmazione Arduino
www.gioblu.com
PJON multimaster communications bus system for Arduino and IOT https://github.com/gioblu/PJON

Franchelli

Le aggiungo all'inizio dello sketch dove dichiaro la libreria PJON.h


---------------------------------------------------------------

Oggi ho perso praticamente tutta la giornata per capire come far funzionare una comunicazione tra 3 arduino ora mi spiego :

2 trasmettitori ed un ricevitore in modalità Local  utilizzando la strategia SoftwareBitBang unifilare

ho provato ad utilizzare gli esempi allegati ( BlinkTest) caricando due trasmettitori ed un ricevitore sui 3 Arduino.
Configurato tutto in maniera opportuna la comunicazione avviene correttamente tra i tre attori. Il problema inizia quando voglio inviare dati non in maniera ripetitiva
Code: [Select]
bus.send_repeatedly(44, "B", 1, 1000000); // Send B to device 44 every second
ma in maniera "comandata" .  Volendo utilizzare solo
Code: [Select]
bus.send(44, "B", 1, 1000000); // Send B to device 44 every second

non riesco proprio a far andare nulla. La comunicazione non avviene .Cortesemente potresti indicarmi dove inserire questo comando e soprattutto se utilizzare o meno nel loop
Code: [Select]
bus.update();

Vedo che i dati inviati sono trattati come Stringhe  (racchiusi tra doppio apice) : l'invio dei dati è sempre trattato come stringa? Cioè quasiasi tipo di informazione da inviare deve essere preventivamente convertita in stringa?

Se posso darti un consiglio da super profano:

gli esempi sono molti ma sono molto simili. Sarebbe molto utile ai non esperti come me, realizzare delle semplici funzioni che aiutino a capire i meccanismi basilari come per esempio creare una stringa da un valore numerico sommarla ad un prefisso(o suffisso) ed inviarla nella modalità più semplice ad un ricevitore che la salva in una costante facendola stampare su seriale.

Insomma cercare di creare tanti piccoli esempi base che spieghino uno alla volta le principali funzioni.
Scusa se mi sono permesso ma cotanta sofisticazione è inutilizzabile (almeno a chi è principiante) se non accompagnata da abbondante documentazione. Grazie ancora per il lavoro che stai facendo.

gbm

Ciao Frankelli, qui trovi la documentazione: https://github.com/gioblu/PJON/blob/master/documentation/data-transmission.md

il comando .update() serve per inviare i pacchetti inseriti nella coda (cosa che avviene chiamando send o send_repeatedly) e va chiamato ogni loop cycle. Invece chiamando send_packet e send_packet_blocking l'invio avviene istantaneamente e non e' necessario chiamare update.

send o send_repeatedly vanno usati se si vuole avere la certezza di invio, ricezione, retry in caso di mancata risposta e il log degli errori ad alto livello.

send_packet puo' essere utilizzato nel caso in cui ti interessa inviare un pacchetto una volta sola (per esempio nel cavo vuoi inviare un BROADCAST) oppure nel caso in cui stai lavorando a basso livello, cioe' inviando il pacchetto, controllando il risultato della funzione e agendo di conseguenza.

send_packet_blocking esegue la stessa trafila di invio, retry fino a max tentativi come send, ma in maniera blocking, quindi non ritornando fino alla corretta ricezione o errore e in questo caso non serve chiamare update.

Community robotica / programmazione Arduino
www.gioblu.com
PJON multimaster communications bus system for Arduino and IOT https://github.com/gioblu/PJON

gbm

Per la funzione invio dati vedi: https://github.com/gioblu/PJON/blob/master/examples/Local/SendArbitraryValues/Transmitter/Transmitter.ino
Questo esempio di un voltage tester device che invia V + voltaggio in formato integer rilevato da porta analogica.
Community robotica / programmazione Arduino
www.gioblu.com
PJON multimaster communications bus system for Arduino and IOT https://github.com/gioblu/PJON

Franchelli

Ciao Giovanni,
facendo dei test di trasmissione tra 3 arduino ho notato che uno, inviando una stringa di valori, mi restituisce un errore di comunicazione PJON_PACKETS_BUFFER_FULL

Mi puoi spiegare cosa vuol dire, da cosa è dovuto e come posso risolvere ?
Il pacchetto ha in tutto 11 caratteri.

gbm

Ciao Franchelli!
Allora, utilizzando la funzione
Code: [Select]
send, se chiedi a PJON di inviare piu' pacchetti di quanti possano essere fisicamente inviati (i.e. in ogni giro di loop chiedi di inviare un pacchetto), puoi riempire il buffer dei pacchetti e ottenere l'errore che riporti. Se invece stai cercando di inviare piu' di 5 pacchetti alla volta, definisci
Code: [Select]
PJON_MAX_PACKETS con il valore che preferisci.

Vedi linea 18 e 43 di questo esempio: https://github.com/gioblu/PJON/blob/master/examples/Local/SendAndReceive/Device1/Device1.ino

come puoi vedere,
Code: [Select]
send ritorna la posizione del pacchetto all'interno del buffer, in questo esempio viene creata una catena di invii a pin-pong tra due device, prima di inviare una risposta a un eventuale pacchetto ricevuto e quindi continuare il ping-pong, entrambi i device controllano di non avere ancora un pacchetto di risposta rimasto da inviare da cicli precedenti per qualsiasi motivo (errore, canale occupato, interferenza).

Questa cosa puo' essere fatta in maniera piu' semplice anche con la funzione
Code: [Select]
send_packet_blocking che non ritorna finche' il pacchetto non e' stato inviato o il tempo massimo di back-off e' stato raggiunto, e ritorna il risultato della trasmissione, sicuramente piu' facile da utilizzare, ma meno performante per natura essendo blocking e perche' durante il periodo di trasmissione e delay non effettua alcuna ricezione, ma per la maggior parte dei casi puo' essere la via piu' semplice da capire ed implementare non necessitando l'uso del gestore dei pacchetti (quindi non e' necessario chiamare update()):

Code: [Select]

if(bus.send_packet_blocking(10, "All is ok?!", 11) == PJON_ACK)
  Serial.println("10 is ok!");


Se la funzione ritorna PJON_ACK la comunicazione e' andata a buon fine dopo uno o piu' retry, il CRC e' stato computato correttamente lato ricevitore e l'acknowledge e' stato ricevuto lato trasmettitore!

Community robotica / programmazione Arduino
www.gioblu.com
PJON multimaster communications bus system for Arduino and IOT https://github.com/gioblu/PJON

Franchelli

Tanto per capire meglio:

per ..."se chiedi a PJON di inviare piu' pacchetti di quanti possano essere fisicamente inviati (i.e. in ogni giro di loop chiedi di inviare un pacchetto)"

 intendi per pacchetto quanto contenuto in una riga di codice simile:

Code: [Select]
bus.send(45, "B", 1); dove il pacchetto è in pratica "B" ma potrebbe essere anche una stringa più lunga tipo  "ABCDEFG".

Non capisco come si possano inviare più pacchetti alla volta se ogni riga di codice ne invia uno.


Ho trovato nel tuo esempio questo codice

bus.reply("B", 1);
come funziona?

(bus.packets[packet].state)
invece cosa ti restituisce?



gbm

Ciao Franchelli, buon inizio settimana.
Allora un modo per riempire il buffer puo' essere di chiamare send piu volte senza chiamare update:
Code: [Select]

bus.send(12, "ciao", 4);
bus.send(13, "ciao", 4);
bus.send(14, "ciao", 4);
bus.send(15, "ciao", 4);
bus.send(16, "ciao", 4);
bus.send(17, "ciao", 4);

bus.update();

Se chiami send (senza effettuare update) un numero uguale o superiore a PJON_MAX_PACKETS otterrai l'errore PJON_PACKETS_BUFFER_FULL, perche' stai accumulando nella memoria tanti pacchetti quanti lo spazio a disposizione. Dovresti provare a inviarli ogni volta che ne inserisci uno (chiamando update() ogni ciclo, come consigliato dalla documentazione).

Se ricevi un pacchetto da parte di un device che ha incluso anche le informazioni di chi ha inviato nei metadati del pacchetto (di default sono inclusi) e' possibile chiamare reply dall'interno della funzione callback di ricezione per rispondere a un eventuale messaggio, senza dover inserire i dati del destinatario.

bus.packets[packet].state puo' valere PJON_TO_BE_SENT, o 0 se 0 vuol dire che il pacchetto e' stato inviato con successo e cancellato. Ovviamente se prima di questo controllo, viene chiamata update e effettuato un eventuale inserimento di un nuovo pacchetto, questo potrebbe prendere il posto del pacchetto precedentemente consegnato, quindi il controllo dello stato del pacchetto va fatto solo nel caso in cui il ciclo di invio e ricezione e' noto, considerato e coordinato da te.
Community robotica / programmazione Arduino
www.gioblu.com
PJON multimaster communications bus system for Arduino and IOT https://github.com/gioblu/PJON

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy