Go Down

Topic: PJON - Multi-master, multi-media network protocol stack  (Read 60280 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

Go Up