Sistema di Sensori e attuatori su largo raggio - [brainstorming]

Ciao a tutti; sto studiando la fattibilità di un progetto che ho in mente da tanto tempo e vorrei chiedervi dei consigli per impostarlo correttamente fin da subito. La mia idea non è assolutamente nuova, ma non ho trovato progetti così "ampi": si tratta del classico giarduino ma non limitato alla terrazza o al vaso, ma a tutto un intorno di una casa oltre all'orto e frutteto. Il progetto si dividerebbe in tre parti -sensori -attuatori -interfacciamento web Per gli attuatori non è un problema, delle elettrovalvole potrebbero essere a qualche metro dalla posizione dell'arduino, comandate attraverso uno o più shift register oltre a dei transistor adeguati allo scopo. Dimensionando correttamente i componenti delle elettrovalvole da 12 v non dovrebbero soffrire molto di un eventuale calo di tensione: ne dovrebbe risentire solamente la velocità di commutazione, assolutamente irrilevante. Per l'interfacciamento web pensavo ad un raspberry Pi o un beaglebone che si interfaccia con l'arduino via seriale scambiandosi informazioni riguardo ai sensori e allo stato degli attuatori. Ho fatto già qualcosa del genere e si tratterebbe solamente di un riutilizzo di codice; comunque questo è un problema che verrebbe alla fine.

La cosa che più mi lascia dubbioso è la possibilità di stendere una rete di sensori su di una superficie ampia, diciamo con una distanza dell'ultimo sensore a 100m. I parametri che mi piacerebbe misurare in ogni punto sono: -temperatura e umidità dell'aria -temperatura del suolo -umidità del suolo -luminosità. Nel caso siano troppi, potrei pensare di misurare i parametri dell'aria in un punto soltanto, magari poco distante dalla centrale. Sono sicuro che su lunghi cavi alcuni tipi di sensori non funzionano a causa di tutte le interferenze presenti, inoltre trovo poco pratico e abbastanza impattante portare un cavo per ogni "stazione", la cosa migliore sarebbe una configurazione entra-esci, utilizzando per esempio un cavo ethernet. La cosa che volevo chiedere è se esiste un modo affidabile per costruire questa rete diciamo in modo passivo, oppure se conviene per ogni stazione utilizzare un arduino (magari standalone) opportunamente programmato in modo da agire come slave rispetto ad un arduino master. E in questo caso a quale tipo di protocollo di comunicazione mi conviene pensare, seriale? i2c (ma la vedo laboriosa per via della distanza..)? altro?

Scusate per il wall of text e spero che qualcuno abbia delle idee da aggiungere al progetto :)

Oltre al cavo segnali devi portare l'alimentazione, ti è necessario quindi un cavo a 4 poli. Il cavo ethernet ha 4 coppie da 2 quindi ci stai comodo: i fili da collegare saranno ovviamente TX, RX, GND e Vcc. Per i sensori in remoto ti consiglio di usare RS485 e dei ATtiny85. L'RS485 è una linea seriale che necessita solo di 2 file (tx e rx) è supporta lunghissime distanze. Per contro non è direttamente utilizzabile da Arduino ma occorrono dei transrecevier. I transrevevier lavorano in coppia. Uno vicino al sensore + Atttiny e uno unico vicino all'Arduino. Puoi collegare tutti i sensori alla stessa coppia di cavi realizzando un multi-slave però devi programmare correttamente i vari ATtiny per selezionare quello giusto. Mi pare ci siano delle limitazioni per la linea ma non ricordo.

Soluzione interessante, grazie, mi informo meglio!
L’ATtiny85 se non mi sbaglio ha 8 piedini di cui 4 analogici e 2 digitali, 2 andrebbero utilizzati per la seriale, gli altri mi dovrebbero bastare per i sensori.
Ovviamente dovrei fornirgli 5v, quindi l’alimentazione andrebbe regolata stazione per stazione (magari portando sul cavo ethernet 12 o 24v e inserendo un regolatore dc dc)
Per la questione del multislave non dovrebbe essere difficile, programmando un semplice protocollo di comunicazione e assegnando un indirizzo diverso ad ognuno.
Grazie! Continuo a informarmi su componenti e costi :slight_smile:

Si, l'ATtiny85 ha 8 piedini. 1 Vcc. 1 GND 1 Reset Ne restano 5. 2 li puoi usare per la seriale software (pin 0 e 1) e 3 per i sensori (pin 2, 3 e 4), sia analogici che digitali. I transrecevier di cui ti parlavo sono come questi --> http://www.robot-italy.com/it/sn75176bd-differential-bus-transceiver.html Il tiny questo --> http://www.robot-italy.com/it/atmel-attiny85-20pu.html

In alternativa cè sempre il tiny 44/84 o 4313, quest'ultimo ha poca memoria ma la seriale nativa e potrebbe evitarti alcuni problemi inutili...

Guardando le specifiche della rete rs485 se non ho capito male dovrei utilizzare 3 piedini per garantire la bidirezionalità del bus. Considerando che i sensori dovrebbero essere chiamati e successivamente dovrebbero rispondere attraverso un protocollo adatto, credo che questo sia il mio caso o sbaglio? A questo punto rimangono solamente 2 piedini per i sensori che sono pochi per quello che volevo fare: almeno 3 sensori mi interesserebbe metterli. Dovrei quindi considerare un ATtiny84, che dovrebbe garantire più ingressi (analogici, che mi servono).

Per quanto riguarda i transrecevier mi sembra abbastanza immediato il loro utilizzo, anche se non sono riuscito a trovare degli schemi che indichino correttamente oltre ai collegamenti con la seriale, se c'è bisogno di resistenze da qualche parte. Voi come li avete utilizzati?

I Tiny84 sono supportati al pari dei Tiny85 dal core apposito. Hai ben 11 pin, di cui, tolti i 3 per gestire il bus, te ne restano 8 liberi.

Per collegare i 75176/Max485 ti serve una resistenza da 120 ohm da mettere tra i pin A e B di ogni chippino e poi i pin di /RE e DE li colleghi ad un unico pin dell'Arduino (se vuoi, con un R da pochi ohm, tipo 100, per proteggere eventuali sovracorrenti). Lo schema base è questo: Mettendo il pin di abilitazione su LOW, attivi il chip in ricezione, mettendolo su HIGH lo attivi in trasmissione.

Lato software puoi usare la libreria ModBus --> https://github.com/angeloc/simplemodbusng

La resistenza da 120 ohm non va messa in ogni slave ma solo alla fine della linea e all'inizio della linea come terminazioni

le limitazioni su questi drivers sono : -sul numero : massimo 32 slave -sulla distanza : dipende dalla velocità dati---> vedi DS ----- 250kbps: 400metri -sulla max tensione bus: 15V -per il bidirezionale necessita del 3 filo di direzione

-per aumentare il n slave usa il mcp2551 : 110 slave -per aumentare la distanza pur mantenendo alta velocità: non è possibile con Rs485 ---> usa ethernet o o zigbee -per aumentare la max tensione: usa mcp2551 : 24V -per eliminare il terzo filo di direzione : usa mcp2551

Grazie a tutti! Quindi la resistenza da 120 la dovrei mettere due volte, diciamo sul master della linea e sullo slave terminale del circuito. Per quanto riguarda il numero massimo e la velocità non sono essenziali, considerando che le misurazioni verrebbero ripetute a distanza di minuti l'una dall'altra.

Ho guardato un po' i prezzi dei vai componenti e, visto il costo esiguo, non conviene fare salti mortali per utilizzare l'85 invece dell'84; userò questo.

In realtà un'altra idea "malsana" mi è venuta in mente: realizzare dei sensori wireless alimentati a batteria, utilizzando il modulo rfm12b. Con le batterie, supponendo poche misure ogni ora, riuscirei a fare qualche mese implementando un codice risparmioso in termini di risorse. Ho anche trovato qualcuno che ha realizzato quello che vorrei fare io, l'unica differenza è che di sensori io ne vorrei più di uno e non so se c'è modo di coordinare la trasmissione dei dati in modo efficiente. Mi spiego: per risparmiare batteria la cosa più migliore sarebbe lasciare in idle il sensore con un watchdog, farlo svegliare ogni 10 minuti circa per fare una misura e inviare, per poi rimandarlo a riposo. Realizzare un protocollo che permetta al master di chiamare ogni singolo sensore per indirizzo obbligherebbe a lasciarli sempre in ascolto e quindi a sprecare risorse. Realizzare un singolo sensore non sarebbe molto problematico, non ho però mai visto più trasmettitori che operano in contemporanea. Mi sto facendo troppi problemi o effettivamente è complicato?

In casa mia ho una rete di sensori analoghi che funziona da qualche anno.

Ti suggerisco, per i sensori più lontani, un moduletto che trasmetta via radio.

Questa accoppiata, per esempio, trasmette un bus i2c, ma ne esistono anche SPI o semplicemente TX/RX.

![](http://i.ebayimg.com/t/2pcs-NRF24L01-2-4GHz-Antenna-Wireless-Transceiver-Module-For-Microcontr-/00/s/NTYwWDcwMA==/z/kq4AAOxy6MBSRoth/$(KGrHqRHJCoFJC+3FC!7BSRothh8Nw~~60_3.JPG)

Sviluppi nella ricerca: ho trovato un progetto funzionante identico a quello che vorrei fare io: http://nathan.chantrell.net/tinytx-wireless-sensor/ utilizza un attiny84 un rfm12b e un sensore (di vario tipo). Il codice è semplice e aggiungere qualche altro sensore è banale. Inoltre è compatibile con "open energy monitor" , un progetto open source nato per monitorare i parametri energetici di una abitazione, ma il concetto è analogo. Mi troverei semplificata tutta la parte web e analisi dati.

Ho deciso di seguire questi due esempi per sviluppare un primo prototipo!