Go Down

Topic: PJON - Multi-master, multi-media network protocol stack  (Read 62907 times) previous topic - next topic

gioscarab

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:
https://github.com/gioblu/PJON

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
Code: [Select]
network.send_command(123, "T", temperature, 60000000);

dall'altro lato, il codice del device 123 e' semplicemente:
Code: [Select]
network.add_reaction("T", update_temperature);

il tutto funziona in background e l'unica cosa da fare e' da un lato chiamare:
Code: [Select]
network.update();

e dall'altro
Code: [Select]
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!!

PaoloP

Bentornato.

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

Library manager --> https://github.com/arduino/Arduino/wiki/Library-Manager-FAQ
Naturalmente tutto questo è per l'IDE 1.6.5 e successivi.

vbextreme

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.
Code: ("at line 220 from PJON.cpp" ) [Select]

*string_pointer++;

Questo funziona per miracolo!
la forma corretta è
Code: [Select]

string_pointer++;

o in maniera più amata dai programmatori c:
Code: [Select]

++string_pointer;

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

Buona Vita
Easy framework linguaggio C: https://github.com/vbextreme/EasyFramework
Hack your life: http://vbextreme.netai.net/
Unoffical Telegram group: https://telegram.me/joinchat/ALRu8ACkdTdXyz-2P7v13A

astrobeed

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.
Scientia potentia est

gioscarab

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?





gioscarab

A casa mia con 30 metri di cavo nei muri di fianco a tutti i cavi della 220, passando dietro al frigo ecc non ha alcun problema e sono 18 Arduini a parlare in modalita' multimaster.

gioscarab

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

astrobeed

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.

Quote
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).  :D
Scientia potentia est

gioscarab

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.


gioscarab


cyberhs

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?

PaoloP

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?

PaoloP

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


PaoloP

Quote from: 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 :)
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.

PaoloP

Una volta convertita la libreria nel formato 1.5.x si può chiede l'inclusione nel library manager.
--> https://github.com/arduino/Arduino/wiki/Library-Manager-FAQ#how-can-i-add-my-library-to-library-manager

In particolare:
Quote
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

Go Up