PJON - Multi-master, multi-media network protocol stack

Ciao ragazzi, vi parlo a piu' riprese da anni delle mie peripezie con i protocolli di comunicazione custom scritti da me. Vivo da solo ormai da un po' e ho lavorato a casa mia per piu di due anni per l'automazione della casa. Per farlo ho avuto bisogno di una libreria comoda da usare per poter programmare una rete di arduino boards per comunicare assieme e a una scheda master il loro stato o saper rispondere a una richiesta.

Ho avuto modo di scrivere il readme che illustra in maniera piuttosto precisa come funziona:

Spero che qualcuno di voi abbia piacere di testare questa libreria perche' e' davvero divertente con poche righe veder succedere cose piuttosto complesse!!

Ho costruito le pulsantiere delle luci di casa con un arduino integrato, alcuni sensori e la scheda relais. La cosa bellissima della libreria e' poter definere:

da un lato la pulsantiera che ogni 60 secondi trasmette la temperatura con un header identificativo T al device numero 123

network.send_command(123, "T", temperature, 60000000);

dall'altro lato, il codice del device 123 e' semplicemente:

network.add_reaction("T", update_temperature);

il tutto funziona in background e l'unica cosa da fare e' da un lato chiamare:

network.update();

e dall'altro

network.receive();

in ogni caso vi consiglio la lettura del readme per avere una visione piu' chiara perche' come al solito sono le 5 e alle 9.45 devo alzarmi e lavorare!!

Bentornato.

Perchè non converti la libreria nel formato 1.5?
--> Arduino IDE 1.5: Library specification · arduino/Arduino Wiki · GitHub
Sarebbe interessante aggiungere anche il .json e il .properties, oltre a cambiare le estensioni degli esempi da .pde a ino.

Library manager --> Library Manager FAQ · arduino/Arduino Wiki · GitHub
Naturalmente tutto questo è per l'IDE 1.6.5 e successivi.

Commenti/Critiche, è un bel progetto e innanzitutto i miei complimenti.
Mi fa anche piacere vedere che hai usato la "mia" funzione di swap, anche se nel tuo caso la variabile temporanea deve essere settata come byte e non come int.
Usi un mix di tipi, non che non si possa fare ma è poco elegante.

*string_pointer++;

Questo funziona per miracolo!
la forma corretta è

string_pointer++;

o in maniera più amata dai programmatori c:

++string_pointer;

Detto questo una buona rilettura sul capitolo dei puntatori non fa mai male.

Buona Vita

gbm:
Ciao ragazzi, vi parlo a piu' riprese da anni delle mie peripezie con i protocolli di comunicazione custom scritti da me.

In tutta franchezza non vedo la necessità di inventarsi un nuovo protocollo di comunicazione quando ne esistono molti free, perfettamente documentati, completi di librerie per Arduino stracollaudate e affidabilissime, tanto per citarne uno il modbus.
Far dialogare una rete con un sistema onewire sulle lunghe distanze, sopratutto in ambito casalingo, è volersi fare del male da solo, oltre alla eccessiva lentezza della linea c'è la scarsa affidabilità, anche in questo caso esistono soluzioni super collaudate e iperaffidabili, p.e. la RS485.

Oh il buon vecchio, che piacere.

Modbus ti permette di fare quello che fa PJON?
Contiene un packet manager?
E un reaction manager?

Come al solito e non e' la prima volta che te lo dico: Documentati prima di sparare a zero. Perche' scusami se te lo dico ma, vista la mia esperienza con Arduino se modbus o 1wire avesse fatto al caso mio l' avrei usato :).

E poi se qualcuno per passione costruisce qualcosa, anche se gia esistente e pluritestata io non lo mortifico dicendo "quello che hai fatto non vale nulla, e funziona anche peggio!!" ma anzi lo sprono con i miei complimenti, per esempio un amico sta costruendo un piccolo ultraleggero. Potrebbe comprare un acrobatico gia fatto e non rischiare la pelle su un oggetto costruito da lui, ma come si puo' non stimarlo per la sua passione e determinazione?

Ciao Paolo, vbextreme vi ringrazio molto per i consigli.
Tendo a precisare che non ho un elevato background di c e cpp in particolare e credo questo traspaia dal codice che ho scritto, quindi se avete soluzioni piu' intelligenti di quelle che ho scelto, per favore fatemi sapere!!

Ho postato ieri per scherzo la libreria su hackernews. E' finita in prima pagina da ieri sera e continuo a ricevere star al repository e messaggi privati, non so che dire, sembra che alla community nerd stia piacendo :o :o :o devo per forza sistemarla!!!! hahah

gbm:
Modbus ti permette di fare quello che fa PJON?

Ho citato modbus solo perché è il primo che mi è passato per la testa ed è il più diffuso, inoltre trovi una marea di device che lo supportano.

Come al solito e non e' la prima volta che te lo dico: Documentati prima di sparare a zero.

Potresti avere ragione se avessi criticato il tuo protocollo, cosa che non ho fatto, ho criticato il fatto che trovo inutile scoprire l'acqua calda ogni volta, ovvero di protocolli di comunicazione pronti ed affidabili ne trovi quanti ne vuoi.
Poi se ti sei divertito nel farlo allora questo non ha prezzo, per tutto il resto c'è ArduinoCard(tm). :smiley:

Ciao Astro. Scusami, ho probabilmente frainteso la tua opinione.
In ogni caso credo che anche tu abbia frainteso il contenuto di questa libreria, perche' non e' soltanto un protocollo di comunicazione, ma contiene anche un packet manager che si occupa della gestione dei pacchetti in background senza nessun effort dell utente e di un reaction manager che ti permette di correlare delle funzioni da eseguire quando viene ricevuto un determinato simbolo (o serie di simboli) definito dall'utente. Questo significa che in molti casi puo' agire da main scheduler di task.

In ogni caso sarei felice se dedicassi 10 minuti a leggere il readme e a dare un occhio al codice perche' ammiro la tua esperienza e le tue conoscenze e sono certo tu possa darmi ottimi spunti a cui io non ho pensato.

La libreria sta ottenendo un discreto successo all'estero.
Mi stanno tempestando di messaggi e pull request.

Ecco un video di uno dei test:

Qualche domanda:

al pacchetto di dati viene aggiunto un carattere di checksum?
è possibile trasmettere un messaggio a tutti i dispositivi della rete, senza doverlo ripetere per ciascun nodo?
come fai a garantire la ricezione di un dispositivo occupato?
come gestisci le collisioni in caso di multi master?

Ho convertito la libreria per l'IDE 1.6.5 aggiungendo i file json e property. Stasera, tempo permettendo, faccio la pull request per l'integrazione.
Visto che però non sarà più compatibile con la versione 1.0.x e 00.x, forse è il caso di fare una nuova branch. Che dici?

Ciao GioBlu,
se crei una nuova branch per la versione 1.5.x, faccio una pull-request con le modifiche.

GioBlu:
Hi Paolo! I would be able to maintain only one version of PJON for 0.x 1.x and 1.6x!
I would merge your contribution but I am not sure if I want to have digital write fast and PJON in the same arc directory! And also I can t get the sense of having the src directory! Generally is used in repos where u can / have to compile or maybe I am ignorant :slight_smile:

La struttura della libreria tra 0.x, 1.x e 1.6.x è notevolmente cambiata.
La nuova struttura prevede che il codice della libreria si all'interno di una cartella "src", gli esempi nella cartella "examples", eventuali altri file come doc, pdf, schemi ecc nella cartella "extra" (che viene ignorata dall'IDE).
Nella directory principale andranno i file keyword, json e property. Questi file servono all'IDE per gestire la libreria sia nell'editor (colorazione delle funzioni e dei metodi) si per il library manager. (introdotto dalla versione IDE 1.6.4.
Le versioni 1.0.x ricercano i file anche nelle sottodirectory delle librerie per cui anche l'architettura nuova è utilizzabile.
Con le versioni 0.x invece c'è incompatibilità, ma sinceramente credo si possa smettere sviluppare librerie per una versione alpha dell'IDE continuando ad includere il Wcostant.h.

Quindi ecco perché ho messo tutto nella cartella src e creato i vari file di proprietà per l'IDE 1.6.x.

Una volta convertita la libreria nel formato 1.5.x si può chiede l'inclusione nel library manager.
--> Library Manager FAQ · arduino/Arduino Wiki · GitHub

In particolare:

How can I add my library to Library Manager?

Ensure your library is complaint with 1.5 format
Tag it and push the tag, or create a release with github "releases"
Open an issue on Arduino's github, specifying the git repo (or github url) from where to download your library

Ciao Paolo!! Grazie mille del tuo supporto! Ho iniziato con una diecimila 7anni fa quindi forse sono un po' legato ai vecchi strumenti :slight_smile:

Oggi creo una branch dove tu possa inviare la pull request!! Oki?

Ci vorrebbe più gente attiva come te nella community!! :slight_smile:

La pull l'ho già inviata. Da gitHub puoi fare il merge sul branch invece che sul master.

Ciao Paolo, non ho ancora accettato la tua pull request perche' devo ancora testare come viene compilato il codice con la 1.5. Ho notato che tutto il codice compilato con 0.x occupa decisamente piu spazio ma la cosa piu assurda e' che ci sia una netta differenza nel tempo di esecuzione del codice. Intendo dello stesso codice, compilato con una o l' altra versione. Infatti, lo stesso sketch di test di velocita' di PJON nella 0.x raggiunge quasi 4kB/s, nella 1.x 3kB/s questo credo, perche' e' cambiato il tempo di attuazione di tutte le funzioni base. Infatti come puoi vedere nella master attuale ho dovuto ricalibrare condizionalmente i delay di lettura tra la versione 0.x e la versione 1.x

A questo punto porterei la tua versione a master con alcune modifiche che intatto ho fatto sulla attuale master, e creerei una branch dedicata alle versione 0.x e 1.x pre 1.5

cosi' da retrocompatibilizzare qualsiasi sketch che usi PJON

Per la velocità non so che dirti.
Riguardo lo spazio è possibile che la nuova toolchain Atmel integrata nelle ultime versioni dell'IDE sia meno esosa di risorse.

posso fare una domanda? sarei interessato nell'applicazione di questa libreria a network però di arduino collegati tramite bluetooth secondo voi è adattabile?

Ho adattato il layer fisico di PJON per funzionare con le coppie di rx e tx 433 mhz da 3 dollari e ho ottenuto 200 metri di range in ambiente cittadino (tra i palazzi). Quindi credo che si possa fare ma non conosco il mondo del bluetooth per darti una risposta affidabile, qui trovi il link della libreria con layer fisico radio:

Fammi sapere come va!

Grazie Paolo per la pull request, l'ho accettata e ora ci lavoro un po' grazie ancora