[Consiglio] Gestione di un plastico con scheda ARDUINO

Buongiorno a tutti,

Sono nuovo su questo forum e sono anchè principiante con l'uso dei microcontrollori e schede Arduino.

Ho bisogno di un consiglio da parte Vostra perché non sono per niente un esperto in elettronica (vecchie conoscenze di almeno 25 anni) e non conosco niente di microcontrollori. La programmazione di applicazioni di gestione la conosco, ma non di programmazione in "tempo reale". Desidererei che il mio progetto o parte di esso sia realizato con una o più schede Arduino.

Come dice il mio titolo, desidero "gestire" il plastico con un microcontrollore. Il plastico è composto da circa 15 blocchi (troncchi, sezioni, ...) ogni blocco ha circa 10 ingressi(10 * 15 = 150 ingressi) e 5 uscite (5 * 15 = 75 uscite). Ho fatto qualche ricerca sul net per vedere se qualcuno avesse già realizato qualcosa di simile, ma non ho trovato. Ho trovato degli articoli per guidare un treno con una scheda Arduino, ma nulla che spiega come fare quando si hanno così tante I/O. I progetti trovati sono sempre per pilotare un treno con accelerazione e frenata con degli H-bridge, ma questo è tutto.

Le domande che vorrei porre sono:
Quale architettura hardware (numero di schede Arduino e che tipo e quale elettronica da mettere in torno alle carte Arduino) e quale architettura software devo mettere in atto, o sia la più adatta per gestire le 150 Input e 50 Output ?
Quall'ora l'applicazione (hardware soprattutto) deve essere flessibile per aggiungere blocchi all'avenire, se necessario.
D'altra parte, è difficile da realizzare se piu schede Arduino devono essere collegate (communicare) tra di loro ?

In un primo tempo, gl'ingressi e le uscite sono solo informazioni di livello logico (1 o 0), con gl'ingressi deterermino programmaticamente lo stato delle uscite. L'alimentazione trazione (invio della corrente sui binari) è gestita al di fuori del Arduino da un'elettronica di potenza. L'informazione agl'ingressi può essere indicata da un pulsante o da un contatto del relè o da una uscita del Arduino che va all'ingresso di un altro Arduino (da vedere se è possibile).

Ecco ho descritto il mio progetto. Se avete bisogno di ulteriori informazioni per potere rispondermi, non esitate a chiedermi.

In anticipo vi ringrazio per le vostre risposte e non vedo l'ora di leggerle.
Vogliate scusarmi per il mio italiano se non è del tutto perfetto, non lo scrivo mai.

Cordiali saluti
Dario.

Ciao e Benvenuto.
Secondo me potresti approcciare il problema utilizzando un Arduino MEGA e dei port expander con protocollo I2C.
Usano gli MCP23017 (MCP23017 - i2c 16 input/output port expander : ID 732 : $6.95 : Adafruit Industries, Unique & fun DIY electronics and kits) avresti 16 I/O, quindi uno per blocco.
Su ogni bus i2c puoi mettere fino a 8 expander, quindi per gestire 15 o 16 expander devi avere 2 linee di bus.
La UNO e la MEGA dispongono di un bus hardware che può essere affiancato ad uno software oppure puoi optare per la DUE che ha giusto 2 bus i2c hardware (ma lavora a 3.3V, anche gli expander possono lavorare a 3.3V quindi non avresti problemi)
Ho parlato di MEGA o di DUE perchè secondo me con la UNO avresti problemi di memoria: infatti per ogni blocco tevi tenere in memoria gli stati di ogni pin per gestine il funzionamento ovvero creare una classe o una struttura e istanziarla 15 volte, una per blocco.
Secondo me la UNO nun gliè a fà, come direbbe Guglielmo, tuo connazionale.

Bello... un plastico.
Ci fai tornare bambini.

Di che grandezza stiamo parlando, dato che il Bus I2C sarebbe l'ideale ma ha dei problemi di lunghezza dei cavi

Nick Gammon ( un utente di questo forum ) ha scritto un interessante articolo per la gestione di numerosi ingressi e uscite Gammon Forum : Electronics : Microprocessors : Buttons, I2C, interrupts and port-expanders.

Gli ingressi a cosa corrispondo? Puoi dividerli su diverse aree ognuna gestita da un micro?

andrea86:
Nick Gammon ( un utente di questo forum )...

Io avrei scritto:
Nick Gammon ( grande GURU!)... :grin: :grin:

Buon giorno a tutti,

Grazie a tutti voi per le rapidissime risposte che mi date.

Rispondo nel ordine di arrivò :

Paolo:
Secondo me potresti approcciare il problema utilizzando un Arduino MEGA e dei port expander con protocollo I2C.
Usano gli MCP23017 (MCP23017 - i2c 16 input/output port expander : ID 732 : Adafruit Industries, Unique & fun DIY electronics and kits) avresti 16 I/O, quindi uno per blocco.
Su ogni bus i2c puoi mettere fino a 8 expander, quindi per gestire 15 o 16 expander devi avere 2 linee di bus.

Quest è una prima idea interessante ma scrivi "fino a 8 expander". Questo per me vuol dire che se all'avenire devo estendere potrei incontrare dei problemi per mancanza di ingressi o uscite, verò oppure falso problema da parte mia ?
Non essendo un esperto in elettronica, desidererei il meno possibile componenti elettronici a mettere insieme.

Paolo:
ma lavora a 3.3V, anche gli expander possono lavorare a 3.3V quindi non avresti problemi

E facile costruire un alimentatore che fornisce 3.3V perchè un 7805 per esempio e facile da mettere in pratica ma 3.3V (non sono un esperto in elettronica) ?

Paolo:
secondo me con la UNO avresti problemi di memoria

Infatti, hai raggione si deve pensare che il software prenda già parecchio posto in memoria perchè sara siccuramente abbastanza lungo.

brunello:
Bello... un plastico.
Ci fai tornare bambini.

XD XD XD tutto verò hai raggione... sono contento se vi posso fare tornare un pò bambini XD, le giornate a gestire dei progetti informatici (il mio lavoro) sono pesanti quindi tornare a casa e ogni tanto darsi un po di tempo per gli hobby e necesario. Ma qui non è più giocare e modellismo... non vorrei che i miei treni (costosi) venisserò a scontrarsi perchè il programma e il progetto non l'ho fatto bene :wink:

brunello:
Di che grandezza stiamo parlando, dato che il Bus I2C sarebbe l'ideale ma ha dei problemi di lunghezza dei cavi

Giusto, havevo dimenticato a dirvelò, il plastico e 4m x 3.5m quindi la lunghezza di certi cavi di rilievo dei dati sul tracciato possono essere di 3, 4 o 5 metri. Ma secondo me, tutta l'elettronica non è distante l'una dall'altra (al massimo 50cm), e solo i dati in ingresso degli expander che sono distanti !!! Questo sarebbe anchè un problema ?

Andrea:
Nick Gammon ( un utente di questo forum ) ha scritto un interessante articolo per la gestione di numerosi ingressi e uscite Gammon Forum : Electronics : Microprocessors : Buttons, I2C, interrupts and port-expanders.

Guarderò il sito non appena avrò un pò di tempo. E se è un grande guru forse avrò la mia risposta... :wink: :wink: :wink: :wink:

Andrea:
Gli ingressi a cosa corrispondo?

Quello che havevo scritto nel primo post risponde alla tua domanda ?

In un primo tempo, gl'ingressi e le uscite sono solo informazioni di livello logico (1 o 0), con gl'ingressi deterermino programmaticamente lo stato delle uscite. L'alimentazione trazione (invio della corrente sui binari) è gestita al di fuori del Arduino da un'elettronica di potenza. L'informazione agl'ingressi può essere indicata da un pulsante o da un contatto del relè o da una uscita del Arduino che va all'ingresso di un altro Arduino (da vedere se è possibile).

Se non è questa la risposta che ti aspettavi, potressti ripormelà perchè non ho capito bene !!!

Andrea:
Puoi dividerli su diverse aree ognuna gestita da un micro?

Questa è anchè una buona idea. Penso proprio di si. Vi allego uno schema che ho fatto dell'idea che havevo per gestire il plastico. Cosà ne pensate e realistico fare così (apparte il costo... per fortuna al momento non è un problema) oppure inefficiente ?[/b][/color]
Sperò essere stato abbastanza chiaro... essendo che il mio italiano non è del tutto perfetto. Ma forse che lo schema sia più parlante... ci sono dei testi in francese ma sono pocchissimi... scusatemi. E sopratutto per dare un idea di quello che immagino.
Buona giornata a tutti voi e a presto per leggere le prossime idee e proposte... non vedo l'ora di potere iniziare... a giocare.
Cordialmente
Dario
PS. Gli allegati si vedono solo quando si è conessi ?

dbe8f:
[Sperò essere stato abbastanza chiaro... essendo che il mio italiano non è del tutto perfetto. Ma forse che lo schema sia più parlante... ci sono dei testi in francese ma sono pocchissimi... scusatemi. E sopratutto per dare un idea di quello che immagino.

Il tuo italiano è meglio di quello di molti madre lingua che postano (me compreso) :grin:
Qualche doppia mancante o di troppo, ma si capisce tutto bene.

La domanda "Gli ingressi a cosa corrispondo?", forse perchè non pratico ferromodellismo, non risulta chiara anche a me.
Cioè tu cosa colleghi praticamente? Gli scambi? oppure le sezioni e i relativi semafori?
Ma se i treni hanno la loro elettricità, l'elettricità delle sezioni a cosa serve? per gli scambi o gli stop?

Pilotare tante linee di I/O direttamente dai pin di un micro non è una buona idea. Ci sono dei limiti di corrente che può scorrere per pin/gruppo di pin/chip intero che non possono essere superari. Per singolo pin sono 40 mA, per gruppo di pin sono 100/150 mA (a seconda dei pin usati - vedi datasheet del chip), per intero chip sono 200 mA (compresa la corrente che serve al chip stesso per funzionare). La somma delle correnti è assoluta, vale cioè indipendentemente dal verso che essa ha (in ingresso o in uscita).
Se ad esempio avessi 20 linee di output collegate tutte all'Arduino e le accendessi tutte, sarebbe un problema.

Poi prima di scegliere i componenti io analizzerei cos'è che devi pilotare, se sono utenze da attivare con un minimo di corrente (tipo relé attuatori, LED ecc). Ad esempio l'MCP23017 può fornire/ricevere al max 25 mA di corrente per pin ed un massimo di 125/150 mA di corrente su tutto il chip (a seconda se va in ingresso o in uscita). Quindi anch'esso, nonostante abbia 16 linee di I/O, potrebbe non essere sufficiente.

Ci sono però altri modi per espandere le porte, ad esempio usare shift register tipo i 74HC595 per le uscite (8 uscite, 10 mA per uscita) oppure i 74HC165 per gli ingressi (8 ingressi). Ne puoi mettere fino ad 8 in catena e pilotarli con 3 pin. Nulla vieta di mettere più di una catena per tipo (3 pin per ogni catena).
Puoi anche pensare di dividere la gestione degli ingressi/uscite a tante unità periferiche basate su un micro in standalone che riceve gli ordini da una unità centrale più potente.

Se vuoi usare più Arduino per fargli gestire a ciascuno un blocco potresti pensare di collegarli tramite MODbus oppure tramite un framework tipo il Souliss di Veseo (Souliss, Domotica e IoT basata su Arduino ed Android - Megatopic - Arduino Forum) cioè trattare il plastico come una domotica.

Riguardo al numero massimo di expander dipende dal componente specifico. Il bus I2C necessita che ogni periferica collegata abbia un indirizzo univoco, siccome MCP23017 può avere solo 8 indirizzi diversi, non puoi aggiungere il nono.
Dovrai per forze avere diverse linee I2C. (se vuoi usare quel componente) Altrimenti devi cercare dei componenti che abbiano la possibilità di vedersi attribuire più indirizzi (il limite teorico del I2C è di 127 periferiche, il limite pratico dipende dalle caratteristiche elettriche della linea del bus).
Di solito si consiglia di non superare i 20 cm come lunghezza della linea, ma mi pare che anche qui sul forum si siano raggiunte con successo, ma non senza problemi, lunghezze di circa 50 cm.
Per lunghezze maggiori c'è la RS485, ma cambia tutta la componentistica e la logica di controllo. Ma non è da scartare, anzi se ti indirizzi verso la gestione multi-arduino la RS485 una soluzione efficace.

Visto che lavori in campo informatico credo che dal punto di vista della programmazione non avresti problemi, giusto?

Ciao a tutti,

Grazie per le risposte... ma devo anchè lavorare ;).

nid69ita:
Il tuo italiano è meglio di quello di molti madre lingua che postano (me compreso) smiley-mr-green
Qualche doppia mancante o di troppo, ma si capisce tutto bene.

Grazie, tento di fare del mio meglio, è vero che non controllo tutto con Google.

nid69ita:
Cioè tu cosa colleghi praticamente? Gli scambi? oppure le sezioni e i relativi semafori?

Infatti, collego il rilevamento del consumo di corrente sul binario (presenza o no di un treno e no l'elettricità) tramite contatto relè (consumo qualche mA perchè sul'ingresso ci sta solo una resistenza da pull up o down), rilievo posizione scambio tramite il contatto di quest'ultimo (consumo qualche mA perchè sul'ingresso ci sta solo una resistenza da pull up o down), semaforo (per il momento 3 LED da 10mA ciascuna che potrebbero anchè essere pilotate da un transistor in comutazione consumo 2 o 3mA). Gli altri ingressi o uscite sono connesse tra di loro quindi consumo minimo o 0mA. Non so se avevi avuto il tempo di vedere il mio schema prima di inviarmi le tue domande !!! Te l'ho chiedo perchè vorrei sapere se è abbastanza esplicito, oppure se manca qualche cosà per capire melgio le funzioni.

nid69ita:
Ma se i treni hanno la loro elettricità, l'elettricità delle sezioni a cosa serve? per gli scambi o gli stop?

Non sono sicuro di capire bene la domanda ! Ogni sezione è comandata con una tensione che dipende da più variabili e delle sezioni avanti. Il treno si deve arrestare da solo se, ad esempio, la sezione avanti è occupata da un altro treno. Ma forse vuoi dire perchè si deve rilevare la tensione (elettricità) delle sezioni... come detto qui sopra, si rileva il consumo della corrente sul binario per identificare la presenza o no di un treno.

Per rispondere a leo72:
Infatti, le tue osservazioni sono tutte giuste, si deve pensare al consumo complessivo di tutti i pin della scheda. Ma dopo avere spiegato qua su come sono utilizzati gl'ingressi e le uscite è possibile o no con il mio schema ? Oppure la mia idea (più schede Arduino collegate) non è realistica ? Io penso davvero che il consumo non sia tanto elevato per una sezione.

Devo ammettere che questa parte qui non la capisco da come si dovrebbe implementare l'elettronica :

leo72:
Puoi anche pensare di dividere la gestione degli ingressi/uscite a tante unità periferiche basate su un micro in standalone che riceve gli ordini da una unità centrale più potente.

La soluzione la vedo complessa per un principiante in elettronica !!!

PaoloP:
Se vuoi usare più Arduino per fargli gestire a ciascuno un blocco potresti pensare di collegarli tramite MODbus oppure tramite un framework tipo il Souliss di Veseo (Souliss, Domotica e IoT basata su Arduino ed Android - Megatopic - Arduino Forum) cioè trattare il plastico come una domotica.

Guarderò il link.

PaoloP:
Per lunghezze maggiori c'è la RS485, ma cambia tutta la componentistica e la logica di controllo. Ma non è da scartare, anzi se ti indirizzi verso la gestione multi-arduino la RS485 una soluzione efficace.

Voglio essere sicurò di capire bene, mi stai dicendo che se voglio realizzare lo schema che ho allegato deve passare inevitabilmente dal protocolo RS485 oppure, come ho designato lo schema, è possibile solo collegando degli ingressi con delle uscite ?

PaoloP:
Visto che lavori in campo informatico credo che dal punto di vista della programmazione non avresti problemi, giusto?

Si e no, come detto nel mio primo post, in programmazione di gestione me la cavo, bene che sono oltre 7 anni che non faccio più programmazione ma solo gestione e pilotaggio (supervisione e controllo) progetti, ma in tempo reale con manipulazione di bit e byte e con hardware non l'ho mai fatto :blush:. Comunque la proposta e da ritenere a secondo della scelta del'hardware a mettere in pratica.

Grazie per tutte queste proposte. Vedo che ci sono diverse possibilità per realizzare questa gestione.
Ho risposto a tutte le vostre domande oppure dovreste avere altre informazioni da parte mia per potere proseguire ?

Cordialemente

Dario

Beh, sarà una stupidaggine, ma una foto del plastico la puoi linkare ? :slight_smile:
Anche per rendersi veramente conto delle dimensioni

Vero. Siamo curiosi! :wink:

@dbe8f:
beh, io non so come hai progettato la cosa. Ho solo dato dei suggerimenti. In base a cosa scegli poi ti devi muovere in un certo modo.
Non capisco una cosa: tu vorresti rilevare la presenza di un treno dal consumo elettrico? Ma i binari non sono tutti congiunti insieme? Come fai a capire se un treno si trova nel segmento 1 oppure nel segmento 24 dal solo consumo di corrente? Non ti servirebbe forse un qualche tipo di sensori? Oppure ogni sezione ha un'alimentazione separata per cui puoi effettivamente capire se in un settore c'è un treno?

Scusa se ti chiedo 'ste cose ma la mia esperienza è limitata ai trenini Lima anni '80 :wink:

Ciao a tutti,

nid69ita:
Beh, sarà una stupidaggine, ma una foto del plastico la puoi linkare ? smiley
Anche per rendersi veramente conto delle dimensioni

La domanda è legitima. Sarei contentissimo potere mostrarvì il plastico perchè vorebbe dire che sono molto avanzato. Ma per il momento sto costruendo la struttura di legno per sostenere il plastico. Vi posso allegare la foto del progetto e domani una foto di come sono avvanzato nella struttura e cioè della stanza in cui sarà il plastico. Per tanto vi metto una foto di come era la struttura qualche mese fa.

Nello schema, ci sono due reti (plastici), quella blu è la rete in scala HO e quella in verde la scala HOm (treni di montagna) ed è quest'ultima che voglio gestire con un microcontrollore. L'altra è gestita da un programma e hardware dedicato (non l'ho fatto io ma ho comperato un sistema completo).

Ho anchè un plastico da test che mi permette di fare dei testi prima di montare il tutto sul verò plastico.

Buon fine di pomeriggio.
Cordialmente

Dario

Buona sera,

Metto ancora alcune foto del avanzamento della struttura. L'ultima è il plastico di test.

Cordialmente
Dario

IMAG0010_V1.jpg

IMAG0018_V1.jpg

IMAG0025._V1.jpg

I colori dello schema rappresentano le famose sezioni?

Ciao leo72,

leo72:
beh, io non so come hai progettato la cosa. Ho solo dato dei suggerimenti. In base a cosa scegli poi ti devi muovere in un certo modo.

Si lo so, grazie per le proposte. Devo riflettere alla soluzione, ma non ho ancora indizzi in sufficenza per dirigermi in un drita.

leo72:
Non capisco una cosa: tu vorresti rilevare la presenza di un treno dal consumo elettrico? Ma i binari non sono tutti congiunti insieme? Come fai a capire se un treno si trova nel segmento 1 oppure nel segmento 24 dal solo consumo di corrente? Non ti servirebbe forse un qualche tipo di sensori? Oppure ogni sezione ha un'alimentazione separata per cui puoi effettivamente capire se in un settore c'è un treno?

Il sezionamento lo si fa su entrambi i binari con delle "eclissi" isolanti come in allegato. Non è un'alimentazione separata ma si puo alimentare o no una sezione a secondo di quello che si vuole o si deve fare in una sezione. Se vedi il mio post dove ho messo lo schema con le schede Arduino, vedi le sezioni che sono rapresentate da due linee rosse.

nid69ita:
I colori dello schema rappresentano le famose sezioni?

No, non rapresentano le sezioni, solo cambiamenti di livelli. La rete verde e quella della scala HOm (treno di montagna) ed è questa che voglio gestire con un MC.

Buona notte

Dario

eclissi_isolanti.JPG

eclissi_isolanti.JPG

Secondo me puoi gestire il tutto con i mcp23017. Il bello è che li puoi anche dislocare in vari punti del plastico e lungo tutto il plastico ci fai passare solo le due linee i2c. Risparmi in cavi e mantieni tutto + ordinato. Ti riconsiglio il link di Gammon. Ciao

Ciao Andrea,

Grazie per la tua risposta e proposta.
Cosa vuoi dire con :

puoi gestire il tutto con i mcp23017

Una sola scheda Arduino e dopo tutti questi componenti ?

Grazie se mi puoi rispondere.
Cordialmente

Dario

Il mcp23017 ha 16 pin, ognuno dei quali può essere input o output. Pensa a comandare 16 scambi che si trovano tutti in area deposito. Normalmente ci dovresti portare 16 coppie di fili, invece ci devi portare solo alimentazione e gnd e poi le due linee i2c. Ovvio che in uscita dal mcp23017 non ci puoi comandare direttamente un motore o una bobina, ma devi fare uno stadio di potenza (un transistor tipo il 2N7000 è ottimo)

PS Ti riconsiglio la lettura dell'ottima guida di Gammon sul suo sito.