I2C, SPI e simili convertiti in Modbus su RS485

Ciao a tutti,
dopo qualche giorno che cerco e chiedo informazioni su come leggere informazioni tra un arduino e un sensore/periferica a lunga distanza (qui la discussione) e aver più o meno capito come fare utilizzando RS485 con il protocollo modbus mi è passato per la mente che tutto ciò in realtà non risolvesse i miei problemi…

La maggior parte dei sensori che ho visto sfrutta infatti un collegamento I2C, SPI o altro ancora, quello che mi chiedo (purtroppo solo ora), come faccio a convertire il tutto?

Inizialmente avevo pensato ad un piccolo microcontrollore (es. ATtiny85) che non facesse altro che al giungere di una richiesta “GET” dall’arduino master rigirasse lo stato del sensore senza fare alcun tipo di elaborazione, e con una richiesta “SET” fare esattamente l’opposto rigirando il tutto al sensore.

Praticamente programmare il piccolo microcontrollore per funzionare da interfaccia con qualsiasi(nei limiti del ragionevole) tipologia di sensore, senza interpretare i dati passati.

Ma qui mi scontro con un problema a cui le mie ricerche in internet (probabilmente sbagliate) non hanno saputo rispondere, quello che avevo in mente è qualcosa di fattibile oppure sono partito da un presupposto errato?
Sto chiedendo troppo ad esempio ad un ATtiny85?
Esistono integrati che fanno già delle conversioni di questo tipo?
Come dovrei procedere?

So che sono molte domande, ma in questo momento non saprei più dove sbattere la testa :astonished:
Ogni suggerimento/soluzione è bene accetta grazie a tutti :wink:

A mia conoscenza non ci sono integrati che fanno la conversione I2C SPI a MODBUS. Ti serve per forza un microcontroller in mezzo. Oltre quella anche un adattatore Seriale RS485 e un Sketch che gestische il protocollo MODBUS. Non avendo esperienza non so dirti se un ATtiny sia adatto per questo scopo (non so ne se ha le interfaccie implementate via HW o abbastanza RAM) Devi vedere se 6 Pin bastano ( Ti servono 2 per la seriale e 2 per la I2C o 4 per ogni dispositivo SPI e di conseguenza puoi sicuramente collegare solo 1 SPI al ATtiny85.

Ciao Uwe

Innanzitutto grazie per la risposta.. Per quel che riguarda l'adattatore RS485 pensavo di usare un MAX485, mentre per lo sketch per la gestione del protocollo modbus avevo trovato questo ma non l'ho ancora testato..

Per i pin rimanenti spero bastino anche perchè l'idea era quella di usare 1 ATtiny per ogni sensore o periferica.. Domanda stupida il protocollo I2C posso usarlo su qualunque pin? Stessa cosa per i dispositivi SPI?

Usa gli Attiny84, hanno 8K di flash come i fratellini Attiny85 ma 11 pin liberi contro 5. Sui Tiny esiste l'SPI ma non esiste l'I2C, che è emulata via software usando la periferica USI interna riprogrammata allo scopo (c'è la lib TinyWire apposta). Per la RS485, anche in questo caso devi andare di emulazione perché i Tiny non hanno neanche la seriale ma su di essi può girare la SoftwareSerial.

Grazie davvero, mi hai dato un sacco di informazioni utili nei prossimi giorni provo a fare qualche ricerca su quello che mi hai detto..

Solo una domada, tutte queste librerie posso caricarle insieme sullo stesso tiny oppure rischiano di andare in conflitto?

Più che altro va visto lo spazio che ti prendono perché, come detto, sono chippini con solo 8K di flash e 512 byte di RAM! C'è il rischio di esaurire la memoria, soprattutto se metti Wire, SPI e Seriale insieme.

Allora vedrò di fare varie versioni a seconda del sensore che voglio gestire, quindi Modbus +i2c, Modbus+SPI e così via. In questo modo potrebbe starci?
Comunque ora faccio qualche altra ricerca in internet poi proverò a comprare un ATtiny84 e un sensore per fare delle prove

Per sapere se ci stai, ti basta compilare e l'IDE ti dice quanta Flash ti resta fuori. Se poi compili con l'IDE 1.5.x ti viene detto anche il consumo statico della RAM.

leo72: Per sapere se ci stai, ti basta compilare e l'IDE ti dice quanta Flash ti resta fuori. Se poi compili con l'IDE 1.5.x ti viene detto anche il consumo statico della RAM.

Ho appena scaricato ed installato la versione 1.5 dell'IDE come mi hai suggerito, ho aggiunto il supporto per la board ATtiny84 e 2 librerie: la TinyWireS (grazie per avermela suggerita) per la gestione del protocollo I2C e la SimpleModbusSlaveSoftwareSerial per la comunicazione con ModBus su RS485, ho aperto i due esempi di un modbus slave e per leggere da un dispositivo I2C ed infine ho incollato tutto in un unico skecth (ovvero una porcata) e il risultato sembra incoraggiante (credo):

Lo sketch usa 4.808 byte (58%) dello spazio disponibile per i programmi. Il massimo è 8.192 byte.
Le variabili globali usano 329 byte di memoria dinamica.

Più o meno il 60% delle risorse è occupato dalle librerie, quindi dovrebbe rimanere abbastanza spazio per fare quello che serve a me. Nei prossimi giorni mi studio per bene le due librerie in questione e provo a scrivere un programma che faccia (si spera) quello che serve a me, se alla fine riuscissi a stare sotto ad almeno il 90% delle risorse vado a comprare un ATtiny84 per le prove in campo ;) In caso contrario ho paura che dovrò optare per un ATmegaXX o ripiegare su altre soluzioni

Come ti ho detto, non guardare solo la Flash ma anche la RAM. Sei a quasi 400 byte su 512, e questo è solo il consumo statico. Ricordati che l’I2C crea poi due bus per la ricezione e la trasmissione dei dati. E poi anche per la SoftwareSerial hai altri buffer. Insomma, occhio che potresti avere problemi…

Ti ringrazio per l'avvertimento per caso sai indicarmi un sistema per misurare o calcolare il consumo dinamico della RAM?

Per il momento sto ancora studiando le due librerie e come usarle, l'unica cosa che posso agevolmente modificare (e poi verificare se funziona e mi basta) è la dimensione del buffer utilizzato dalla libreria SimpleModbusSlaveSoftwareSerial che attualmente è impostato a 128.

Ps. Mi sa che questa discussione ormai più che in Hardware ha preso una piega Software :P

In questo mio articolo illustro un paio di metodi per visualizzare la memoria libera a runtime. La cosa è un pò più complessa rispetto all’Atmega328/Arduino perché i Tiny non hanno la seriale HW ma non è del tutto impossibile, basta usare la SoftwareSerial (tenendo a mente che dal valore indicato dovrai scalare i buffer per la SoftwareSerial).