Go Down

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

gioscarab

Ciao Maolomao! Scusate il ritardo nella risposta. Siamo in corsa per il rilascio della versione 11, che conterra' moltissime novita' tra cui il supporto per network switch e router (entrambi in grado di funzionare trasparentemente qualsiasi esso sia il datalink in uso tra quelli supportati).

Purtroppo anche se sono italiano  :) , non ho avuto il tempo di scrivere una guida o la documentazione in italiano.


manolomao

Ciao tutti.
Dopo svariati tentativi e sbattimenti di testa contro il muro, sono riuscito a far scambiare i dati tra i due arduino con PJON.
Però c'è qualcosa che non mi convince...se premo un pulsante mi aspetto che dall'altra parte reagisca accendendo il relè, ma questo lo fa con un ritardo o a volte rimbalza; ho guardato sul monitor seriale ed ho visto che ci sono tanti errori e credo che il fatto di attuare in ritardo sia dovuto a questo, tanti pacchetti vengono persi o arrivano in ritardo...non so..
il monitor seriale mi dice :
Code: [Select]
Packet buffer is full, has now a length of 5
Possible wrong bus configuration!
higher PJON_MAX_PACKETS if necessary.

e a volte anche di aver perso la comunicazione con ID 20 (che sarebbe uno dei due arduino).
Quindi quando va a buon fine funziona perfettamente, quando compaiono tutti questi errori si rallenta il tutto...
Chi può aiutarmi a districarmi in questo problema??Date le mie scarse capacità da programmatore, sono in un vicolo cieco...
Per farvi capire.....ho provato a partire con un semplice pulsante, per poi mandare una stringa con diversi comandi e ricevere dati da sensori di temperatura... quindi sono partito dal facile, ma gli errori li ho sempre avuti...

gioscarab

Ciao manolomao, controllerei il rate di trasmissione di ogni modulo e cercherei di ridurlo al minimo necessario. Se tutti i device trasmettono ininterrottamente e' facile che avvengano delle collisioni e un invio non vada a buon fine. Ma avrei bisogno di dare un occhio al tuo codice per darti consigli piu' precisi, per favore postalo qui in modo che possa darci un' occhiata.

gioscarab

Ciao Mauro ho dato un'occhiata al tuo codice. Stai spedendo un pacchetto ogni giro di loop, cosi' non puo' funzionare. busRS485.update(); ritorna il numero di pacchetti che sono ancora da spedire, quindi se invii con send un pacchetto, update ritornera' 1 finche' quel pacchetto non e' stato inviato con successo. Invece che chiamare send a ogni ciclo, chiama come in quasi tutti gli esempi viene mostrato:
 
if(!bus.update()) // If all packets are delivered, send another
    bus.send(44, content, 20);

Cerca anche di avere una sola chiamata a receive e update per loop, usane di piu' solo se strettamente necessario cosi' hai chiaro cosa sta succedendo e in che ordine.

Cina

Ciao Guglielmo!
Seguo con interesse i tuoi post e sono contento che ce ancora gente che ha voglia di inventare cose nuove..come Te.
E da un po' di tempo che provo a fare una rete con il tuo bellissimo  :)  protocollo.
Purtroppo non essendo un grande esperto mi trovo con qualche bel insuccesso.
Mia idea e collegare 4-5 Arduino Nano (slave) con uno Master in una rete usando SoftwareBitBang (un cavo) e tutti collegati tra loro su pin D12.
Sulla stessa scheda del Master si trova anche un Nodemcu ESP8266 che mi serve per trasmissione via WiFi.
Arduino Nano (Master) raccoglie dei dati dai vari Slave e da i sensori Analogici e "passa i dati al Esp8266.
In questo momento sto testando la trasmissione tra Master e Esp8266.
Riesco ad inviare e ricevere, ma una quantità di dati molto piccola.
Quindi se invio un numero lo ricevo, ma volendo inviare 16 valori di ingressi analogici da Master (Arduino Nano) al Esp8266 su stessa scheda ci vuole molti secondi per riceverli tutti e spesso non li ricevo neanche.
Sono sicuro che il modo ce, ma da qualche parte sbaglio e non riesco comunicare.
Ti chiedo quale sarebbe il  modo più giusto per inviare da Nano a Esp8266 questi 16 valori analogici.
Chiedo inoltre se possibile e in che modo trasmettere/ricevere una struttura (Struct) , e di che dimensione massima può essere … con il tuo protocollo.
Grazie mille per la risposta e mi scuso in anticipo se chiedo cose ovvie.
Allego i due codici (ridotti).

gpb01

Ciao Guglielmo!
... stai confondendo le persone ... io non c'entro nulla ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

Cina

... stai confondendo le persone ... io non c'entro nulla ... ::)

Guglielmo
Hai ragione! Scusa... Il mio era rivolto al gioscarab...
Ringrazio anche Te perchè i Tuoi post, spesso mi hanno aiutato.
Spero che gioscarab, mi risponde al post precedente...

gioscarab

Ciao Cina, scusami tanto per il ritardo nella risposta. Ho letto il codice che hai linkato. Vedo che utilizzi nel setup del master usi:
Code: [Select]
bus.set_asynchronous_acknowledge(true);
 

Considera che di default PJON utilizza l'acknowledgment sincrono, che puo' essere opzionalmente disattivato. L'utilizzo della combinazione acknowledge sincrono + asincrono e' definito come "Recursive acknowledgment pattern" che e' pensato per soddisfare requirement di reti complesse e non credo sia per te necessario. Il Recursive acknowledgment pattern puo' essere utile quando uno slave in una rete complessa composta da tanti nodi, switch o router interconnessi vuole avere la sicurezza di aver passato il messaggio alla piu' vicina fonte di connettivita', per poi aspettare un pacchetto di acknowledgment asincrono che confermi la ricezione da parte del destinatario. Questa procedura puo' ridurre la quantita' di overhead e ritrasmissioni che possono avvenire in alcuni casi utilizzando il solo ack asincrono.

In sintesi io proverei a non utilizzare l'ack asincrono e vedere cosa succede.
Fammi sapere, se hai bisogno di supporto real time scrivimi su gitter.

Se ti serve configura PJON per assegnare un id ad ogni pacchetto, vedi documentation/configuration: https://github.com/gioblu/PJON/blob/master/documentation/configuration.md

cesco

Un saluto a tutti.

Una domanda a livello di logica.

Vorrei provare a realizzare una piccola rete di sensori di temperatura (3 arduino mini pro con DS18B20) e vorrei utilizzare la libreria PJON. Come "Master" vorrei usare una Raspberry per creare una pagina WEB di controllo e di comando per i led delle schede Arduino.
Per raspberry ho visto che bisogna usare wiringPi (https://github.com/gioblu/PJON/wiki/Raspberry-Pi-interfacing) quindi per la stampa sulla pagina web potrei utilizzare l'output dello script in esecuzione su raspberry, ma se volessi "comandare", quindi inviare un comando ad uno degli arduino per l'accensione del led, come potrei fare dalla raspberry (lato web non è un problema il come), mi interessava proprio come inviare dei comandi allo script che è in esecuzione con wiringPi.

Grazie per i suggerimenti.

gpb01

>cesco: ho riunito io il tuo thread con quello relativo alla PJON dato che è quello dove l'autore fornisce supporto ...

Guglielmo
Search is Your friend ... or I am Your enemy !

fabpolli

mi interessava proprio come inviare dei comandi allo script che è in esecuzione con wiringPi.

Grazie per i suggerimenti.

Se per script in esecuzione intendi la pagina web visualizzata nel browser (e relativo javascript) direttamente non riesci è proprio impossibile tecnicamente, deve essere la pagina che interroga il server per sapere se occorre fare qualcosa (AJAX, reload, ecc. a te la scelta).
Lato server io ho affrontato la cosa creando un demone che si occupa di inviare i messaggi via seriale, e quindi poi con relativo adattatore sulla rete RS485) ai dispositivi e nel contempo controlla che non ci siano messaggi in arrivo (tramite la libreria PJON), nel caso vi siano messaggi da processare richiama delle apposite pagine (PHP nel mio caso) che si occupano di aggiornare il database con le informazioni in arrivo (attivazioni, temperature, ecc.).
Lato client via javascript tramite timer ogni minuto circa vado a invocare (AJAX) una pagina sul server che mi restituisce le informazioni aggiornate per la sezione di pagina che mi interessa.
Per il momento sta funzionando tutto bene con le sole temperature, ma ho dovuto impostare PJON con l'acknowledge sincrono e asincrono disattivato per non ricevere errori in ricezione/trasmissione dei pacchetti in quanto il demone per non sovraccaricare la CPU effettua il polling dei dati una volta al secondo.

cesco

Grazie,. Scusa ma avevo paura fosse off topic.

>cesco: ho riunito io il tuo thread con quello relativo alla PJON dato che è quello dove l'autore fornisce supporto ...

Guglielmo

cesco

Se per script in esecuzione intendi la pagina web visualizzata nel browser (e relativo javascript) direttamente non riesci è proprio impossibile tecnicamente, deve essere la pagina che interroga il server per sapere se occorre fare qualcosa (AJAX, reload, ecc. a te la scelta).
Lato server io ho affrontato la cosa creando un demone che si occupa di inviare i messaggi via seriale, e quindi poi con relativo adattatore sulla rete RS485) ai dispositivi e nel contempo controlla che non ci siano messaggi in arrivo (tramite la libreria PJON), nel caso vi siano messaggi da processare richiama delle apposite pagine (PHP nel mio caso) che si occupano di aggiornare il database con le informazioni in arrivo (attivazioni, temperature, ecc.).
Lato client via javascript tramite timer ogni minuto circa vado a invocare (AJAX) una pagina sul server che mi restituisce le informazioni aggiornate per la sezione di pagina che mi interessa.
Per il momento sta funzionando tutto bene con le sole temperature, ma ho dovuto impostare PJON con l'acknowledge sincrono e asincrono disattivato per non ricevere errori in ricezione/trasmissione dei pacchetti in quanto il demone per non sovraccaricare la CPU effettua il polling dei dati una volta al secondo.
Grazie delle info. Immaginavo un qualcosa del genere, ma da riga di comando come passo i dati al demone, non mi interessa la sintassi, più che altro capire come tramite wiringPI posso leggere stringhe (dati) inviate da riga di comando, o qualcosa del genere insomma.volevo provare a non usare rs485 ma SoftwareBitBang. Grazie

fabpolli

Stai mischiando pere e mele, se sei su linea di comando non ti serve il demone (quello serve per stare in ascolto in maniera continuativa dei messaggi in arrivo) ma un semplice programma in C che lo richiami con i parametri che ti servono, all'avvio leggi gli argomenti passati dalla linea di comando e li trasmetti via PJON (che ti rende trasparente il mezzo fisico di trasmissione, fai la send che poi PJON sia configurato per il bitbang, seriale, ecc. a livello di programmazione non ti cambia nulla).
Se invece da un cliente cha sta visualizzando la pagina web ti viene richiamata una pagina sul server per effettuare qualcosa e quest'ultima deve trasmettere qualcosa con PJON allora entra in gioco il demone che essendo sempre attivo starà in ascolto delle tue richieste e invierà tramite PJON il comando (come prima il mezzo fisico non importa).
Come può ascoltarti un demone? Sta a te deciderlo, il modo più rozzo possibile (mi vergogno quasi a scriverlo) è che la pagina web scriva una file con un nome a caso su un determinato percorso e il demone ogni tanto va a vedere se nel percorso c'è almeno un file da processare, lo legge e invia il comando. Perché fa schifo? Perché è asincrono, la pagina web deve stare li ad aspettare che qualcuno le dica che il comando è stato processato (Es. aspetta che il file venga cancellato, aspettache un altro file venga creato e lo cancella, ecc.) ma è la via più semplice da programmare per chi ha poca esperienza di C ecc.
Altra strada è aprire un socket dalla pagina web inviare il comando e in base alla risposta comuicare che il comando è stato eseuguito e se è fallito oppure no. Il demone dal canto suo aspetta la connesione tramite socket, la acetta, riceve il comando da inviare, lo trasmette con PJON e sul medesimo socket comunica ciò che è successo (comando OK, comando trasmetto p quello che più ti piace), non è difficile neppure questo, si trovano esempi a iosa su internet ma dipende chiaramente dalla tue capacità/aspetative.
Comuque per iniziare scordati pure la parola demone, puoi fare il tuo programma lanciarlo da linea comando di un terminale, apri la pagina web o un altro terminale e provi ad interagire (crei il file, il socket o la "cosa" che hai deciso di usare per comunicare con il tuo programma, questo potrà scriverti nella console che sta ricevendo la connessione, processando il comando, ecc., invia su PJON (e l'avvenuto invio lo verifichi sul ricevente) in modo da renderti più facile la vita di "debugger", in un secondo momento lo "trasformi" in demone

cesco

Ok grazie mille, spiegazione esaustiva, spero di riuscire presto a fare delle prove e condividere l'esperienza. Per caso si sa se la SoftwareBitBang verrà introdotta su Raspberry, o comunque su Linux in generale?

Grazie

Go Up