Go Down

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

gioscarab

Ciao Cesco, scusa la risposta in mega ritardo. Su RPI non stiamo attivamente lavorando ad implementare SoftwareBitBang. Ad oggi e' necessario avere un qualsiasi altro mcu supportato che faccia da switch:
Code: [Select]
SoftwareBitBang <-> SWITCH <-> ThroughSerial <-> Raspberry Pi

manolomao

Ciao, vorrei fare una domanda sulla gestione degli errori: quando inteviene l'errore "CONNECTION_LOST"?
Ho provato a far visualizzare questo errore per marcare la mancanza di comunicazione tra due arduini, ma non mi appare...ho seguito il setting degli errori come da specifica, poi ho tolto il cavo che mette in comunicazione i due arduini e nulla...non mi segnala nulla.
mentre se ricollego il cavo parte a comunicare correttamente...

gioscarab

Ciao manolomao se stai usando send_packet or send_packet_blocking e' normale peche' queste chiamate blocking usano il loro valore di ritorno per comunicarti il risultato della trasmissione, vedi:
https://github.com/gioblu/PJON/blob/master/documentation/data-transmission.md

Rileggendo la documentazione mi rendo conto che non e' specificato che gli errori vengono emessi solo dalle chiamate non-blocking, aggiorno subito aggiungendo la specifica mancante, grazie mille :)

manolomao

Ciao Gioscarab,uso questa istruzione:
Code: [Select]
busRS485.send(20,car_buffer,strlen(car_buffer));
Quello che volevo fare è gestire la mancanza di comunicazione....una volta che cade, mi visualizza l'errore di comunicazione...
Come posso fare???

fabpolli

Come posso fare???
Come gestire l'errore sta a te, ovvero la libreria prevede un segnale di acknowledge sincrono, asincrono oppure anche senza segnale di "messaggio ricevuto", in base a come la si configura.
Se non ridefinito è previsto l'acknowledge sincrono, quosto significa che se un dispositivo non è disponibile manca il ritorno e la libreria tramite la callback dell'errore te lo segnala, a questo punto sta a te decidere cosa fare, ad esempio potresti prevedere un certo numero di tentativi di reinoltro del messaggio (magari distanziando gli invii con scala logaritmica un po' come fanno i cellulari quando richiamano in automatico un numero occupato) e doco questo numero di invii segnali la cosa. Oppure potresti subito segnalare l'anomalia senza tentare l'invio successivo, insomma dipende da cosa fanno i tuoi dispositivi e da quanto è grave l'assenza di comunicazione per il corretto funzionamrnto del tutto.

manolomao

Domanda: posso inviare una struct come payload in PJON?
Se si, come fare?

manolomao

Ciao tutti, sto vedendo di fare un restaling di un mio progetto vecchio, in cui erano previsti tre arduino che dialogavano tra di loro utilizzando la PJON e il bus RS485.
Tutto bene, e mi ha dato modo di approfondire la conoscenza di questo protocollo...
Ora vorrei cambiare la gestione della comunicazione e vi chiedevo se fosse possibile farlo: un arduino monta l'HC12, uno RS485 ed il terzo (diciamo il centrale) ha sia un RS485 che l'HC12.
Pensate che sia gestibile con PJON?
Il mio dubbio è il micro nel "mezzo" che deve gestire due porte softgwareserial con due interfacce diverse (RS485 e HC12)...
Come posso fare??

fabpolli

PJOn sicuramente può gestire la cosa, tra le altre cose l'arduino "centrale" può avere a bordo PJOn in configurazione "brigdeswitch" o "router" che fa si che si possa occupare nativamente di instradare le comunicazioni da verso due reti differenti come nel tuo caso (wired/wirless ma anche due bus wired ad esempio) in  modo del tutto trasparente, ovvero non dovrai scrivere manco mezza linea di codice se non quelle per configurare la libreria PJON.
Il vero problema sono le due softwareserial che non possono coesistere nel modo a cui servono a te. Ovvero puoi definire N softwareserial ma solo una è attiva e abilitata alla ricezione dei dati, è stato l'inghippo che mi ha costretto a passare da una uno a una mega in un mio progettino.
Ti consiglio quindi di pensare a sostituire l'arduino "cenrale" che penso sia una uno o una nano con un'altra shceda con almeno due seriali hardware in questo modo la seriale 0 la tieni libera per debug e caricamento firmare, la seriale 1 ci attacchi ad esempio la RS485 e con la softwareserial gestisci l'HC12.

fabpolli

Se cerchi un'alternativa con form factor piccolo prova a guardare questa chi l'ha fatta sa il fatto suo  ;)  :)

fabpolli

Ho usato un termine errato non è bridge ma switch se cerchi la documentazione relativa è qui

manolomao

PJOn sicuramente può gestire la cosa, tra le altre cose l'arduino "centrale" può avere a bordo PJOn in configurazione "brigdeswitch" o "router" che fa si che si possa occupare nativamente di instradare le comunicazioni da verso due reti differenti come nel tuo caso (wired/wirless ma anche due bus wired ad esempio) in  modo del tutto trasparente, ovvero non dovrai scrivere manco mezza linea di codice se non quelle per configurare la libreria PJON.
Il vero problema sono le due softwareserial che non possono coesistere nel modo a cui servono a te. Ovvero puoi definire N softwareserial ma solo una è attiva e abilitata alla ricezione dei dati, è stato l'inghippo che mi ha costretto a passare da una uno a una mega in un mio progettino.
Ti consiglio quindi di pensare a sostituire l'arduino "cenrale" che penso sia una uno o una nano con un'altra shceda con almeno due seriali hardware in questo modo la seriale 0 la tieni libera per debug e caricamento firmare, la seriale 1 ci attacchi ad esempio la RS485 e con la softwareserial gestisci l'HC12.
Mi sembrava che non fosse così semplice  :smiley-sweat:
Grazie Fabpolli, sempre molto gentile...
Dovrò rivedere la cosa e valutare come muovermi...

fabpolli

Mi sembrava che non fosse così semplice  :smiley-sweat:
Grazie Fabpolli, sempre molto gentile...
Dovrò rivedere la cosa e valutare come muovermi...

Se metti qui le caratteristiche del centrale e eventuali dubbi che non ti permettono un rapido cambio di piattaforma si può vedere se in molti si trova una soluzione migliore.
Per la parte software più semplice di come PJON ti permette non mi viene in mente nulla, puoi usare due bus separati e gestire tu quli e qunado inviare messaggi tra un bus e l'altro o demandare il tutto alla libreria in modo automatico, meglio di così :)

gpb01

Thread "promosso" alla sezione Megatopic. :)

Buona continuazione.

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

manolomao

Se metti qui le caratteristiche del centrale e eventuali dubbi che non ti permettono un rapido cambio di piattaforma si può vedere se in molti si trova una soluzione migliore.
Per la parte software più semplice di come PJON ti permette non mi viene in mente nulla, puoi usare due bus separati e gestire tu quli e qunado inviare messaggi tra un bus e l'altro o demandare il tutto alla libreria in modo automatico, meglio di così :)
Fabpolli pensavo di creare a questo punto una rete con gli NRF24,però a questo punto credo debba abbandonare PJON...
Tornando al discorso PJON con gli HC12 (anche per future applicazioni) ho messo sul device 1 questo setting
Code: [Select]

#include <LiquidCrystal_I2C.h>//Libreria LCD I2C
#include <SoftwareSerial.h>
#include <EEPROM.h>           
#include <Wire.h>

#define PIN_RX_HC12 11
#define PIN_TX_HC12 10
#define busHC12_ID 30             //display
#define bus_HC12_LATENCY 1000

#define TS_RESPONSE_TIME_OUT 200000

#define PJON_PACKET_MAX_LENGTH 63  //aggiunto
#include <PJON.h>

poi questo
Code: [Select]

LiquidCrystal_I2C lcd(ind_lcd, 20, 4);   
SoftwareSerial HC12Serial(PIN_RX_HC12,PIN_TX_HC12);
PJON<ThroughSerial> busHC12 ;

Nel setup
Code: [Select]
busHC12.set_error(error_handler);                       
  busHC12.set_receiver(receiver_function);               
  busHC12.set_synchronous_acknowledge(false);
  busHC12.begin();     //avvia PJON

Poi nel loop
Code: [Select]

busHC12.receive(TS_TIME_IN + bus_HC12_LATENCY);
busHC12.update();
....
....
//per spedire il dato
if(!busHC12.update()){
 busHC12.send(20,caratteri,strlen(caratteri)+1);}

Funziona??
o non ho capito nulla???

fabpolli

Non funziona non hai associato la seriale dell'HC12 alla libreria, guarda l'esempio dell'IDE PJON->ARDUINO->Local->ThroughSerial->HC-12-Blink (o ogni altro esempio presente basato su HC12) oppure anche qui

Go Up