Domanda da neofita: interfacce combinate con pilotaggio digitale ?

Salve a tutti, sono nuovo del mondo Arduino, per cui mi scuso in anticipo se (quasi sicuramente) sto chiedendo cose che la maggior parte di voi probabilmente gia conosce.

Mi servono 30 differenti segnali (o meglio, azioni, di tipo misto) in remoto, ma ho solo 8 linee, e solo digitali - ho risolto il problema usando un converter BCD da 2 x 4 linee, cosi posso inviare 30 differenti combinazioni in tempo reale, due alla volta (in pratica, 15 differenti possibili combinazioni per mano), e mi ero fabbricato una decodifica in remoto con componenti discreti (un paio di 4514, qualche porta logica, qualche 555, una manciata di transistor e cosi via, abbastanza semplice da realizzare a livello circuitale), ma poi ho visto che fisicamente non ho sufficente spazio per i circuiti risultanti - poi un'amico mi ha suggerito che forse un Mega poteva fare lo stesso lavoro, occupando un decimo dello spazio.

Mi servirebbe pero' sapere se il tipo di applicazione e' fattibile, prima di cominciare ad applicarmici, per cui preferisco chiedere a chi e' piu esperto nel campo:

La board Arduino Mega, e' in grado, usando 8 ingressi (in 2 gruppi di 4), di comandarmi in tempo reale differenti tipologie di uscite, parte digitali, parte PWM ? - piu specificatamente, facendo alcuni esempi, ad una certa combinazione, diciamo 0001 sul primo gruppo, abilitare una o piu uscite digitali (ma solo finche' la combinazione e' presente - monostabile), ad un'altra combinazione, 0010, accendere e spegnere alternativamente una seconda uscita digitale (accendere e mantenere acceso finche' la combinazione non si ripresenta, poi spegnere, e cosi via - bistabile), ad una terza combinazione, settare una delle uscite PWM su un determinato valore (preimpostato nel programma) e mantenerla su questo valore finche' una diversa combinazione non la cambia, e cosi via, e CONTEMPORANEAMENTE fare le stesse cose per il secondo gruppo di 4 ingressi (ovviamente per un diverso gruppo di uscite e PWM), in tempo reale e soprattutto senza interferenze fra i 2 gruppi ? - Inoltre, sarebbe necessario che, in caso di interruzione di alimentazione, al ripristino la board riparta da sola con tutte le uscite in una specifica condizione (anche quella da inserire preventivamente nel programma).

Secondo voi e' una cosa fattibile, usando un Mega ?

fammi capire...
hai 8 pin d'ingresso ed 8 uscite (di cui es. 4 pwm).

ed in base ai pulsanti premuti effettuare diverse azioni?

Ho capito poco o niente di quello che vuoi fare, scusami. Per aumentare le uscite e gli ingressi digitali puoi sempre usare gli shift register (74hc595 per le uscite e cd4021, cd4022 per gli ingressi); questi integrati richiedono rispettivamente 3 pin digitali di arduino e si possono collegare in cascata quindi con solo 6 pin puoi comandare tutti gli ingressi e tutte le uscite che desideri. Quanti pin pwm ti occorrono di preciso? Arduino2009 o Uno ne hanno già 6, se te ne occorrono di più puoi sempre usare un TLC5940 oppure passare direttamente al mega. Per quanto riguarda il fatto dell'interruzione dell'alimentazione se devi ripristinare lo stato delle uscite prima del blackout potresti salvare lo stato sulla eeprom interna del microcontrollore (oppure usare una memoria esterna).
Spero di averti aiutato un pochino, non ho ben capito che vorresti fare.
Saluti.

No, scusa, cerco di spiegarmi meglio.

Io ho solo un cavo di alimentazione per trasferire 30 comandi (piu ovviamente l'alimentazione e le camere), ma quella parte l'ho gia risolta con un'interfaccia machine-2-machine (mi remota 8 ingressi e 8 uscite su ethernet-over-power)

Al momento, quindi, ho 8 segnali che posso usare, e me ne servirebbero 30, quindi ho usato gli 8 che avevo in 2 "parole" binarie, da 1 a F (2, perche' devo usare contemporaneamente almeno 2 comandi per volta), e con questi avevo costruito un'interfaccia che mi derivava tutte le funzioni che mi servivano (cambi di livelli in PWM, uscite singole o a gruppi, astabili o bistabili, ecc), solo che non ho materialmente lo spazio per infilare tutta l'elettronica nel poco spazio che ho a disposizione (e' un ROV), quindi volevo sapere se una scheda Arduino era in grado di effettuare tutte le operazioni che la mia interfaccia faceva.

In pratica, immaginatevi il comando remoto come un paio di manipolatori con 15 contatti l'uno (si usano 2 mani contemporaneamente, per pilotare un ROV, e gia sono poche :p), dove alcuni dei pulsanti accendono e spengono luci o apparecchiature, altri attivano i gruppi motore in differenti combinazioni (avanti, indietro, virata dx o sx, alza, abbassa, apri e chuidi pinze, ecc), altri cambiano il duty-cycle di diverse uscite PWM (che sono poi quelle che definiscono le velocita' dei motori), e cosi via.

Il tutto, pilotato da queste 8 linee, che trasferiscono dalla console di comando 2 gruppi di comandi in binario (da 0001 a 1111 per ogni gruppo), quindi a me serviva sapere se, usando 8 ingressi dell'Arduino, in 2 gruppi di 4, posso fargli fare tutte queste funzioni, in tempo reale, ogni gruppo indipendente dall'altro, e senza che interferiscano.

Inoltre, mi serve sapere se e' possibile programmarlo in modo che all'atto dell'alimentazione (o comunque quando l'alimentazione ritorna dopo essere stata scollegata), tutte le uscite in questione possono essere "forzate" a zero, indipendentememte dalla posizione dei comandi o dal fatto che ci sia un segnale di ingresso o meno, per un minimo di almeno mezzo secondo, o comunque finche' tutti gli ingressi non siano a zero per mezzo secondo dopo un restart.

quest'ultima cosa la vorrei inserire come sicurezza antiinfortunistica, nel senso, immaginatevi se qualcuno accende la console mentre qualcun'altro sta lavorando sul ROV o ha le mani dove non dovrebbe ed i comandi sono rimasti inseriti, partono i motori e qualcuno ci rimette un dito ... invece, in questo modo, qualsiasi sia lo stato dei comandi quando viene data tensione, rimane tutto spento, ed e' obbligatorio mettere tutto a zero prima che il sistema inizi a funzionare.

arduino può fare quello che dici, e forse semplificarti la vita. Tanto per cominciare arduino stesso può fare da "DEconverter BCD", evitando un bel pezzo di circuito, e usando un solo pin.
A questo punto è semplice programmare, in base ai segnali in ingresso, le azioni da intraprendere (arduino possiede uscite pwm e digitali)

il blocco delle uscite puoi farlo, è il bello della programmazione :slight_smile: in particolare arduino possiede proprio una funzione setup(), in cui di solito si mettono le inizializzazioni all'accensione, e una funzione loop() che si ripete all'infinito, che di solito legge un comando e lo esegue.

Non avrai che i comandi si eseguono in tempo reale, ma in tempi talmente brevi (microsecondi) da sembrare tali (anche i pc monoprocessore-monocore funzionano così!)

la parte più difficile potrebbe essere la decodifica da segnale unico a comando, perché richiede l'uso di interrupt. Se usi un segnale PPM (lo standard delle trasmittenti RC), ci sono delle librerie già fatte.

Grazie per le vostre risposte.

@ lesto:

No, sul ROV ho gia disponibile un'uscita binaria, 8 linee divise in 2 "short word" da 1 ad F (piu lo zero che significa niente comandi), ho dovuto scegliere questa soluzione perche' il cavo di connessione e' gia "intasato" di segnali.

Sull'ombelicale (che e' un coassiale RG8, fondamentalmente, anche se "blindato" e neutro rispetto all'acqua) ci passano gia i 290VAC dell'alimentazione, piu un segnale di rete (attraverso un'interfaccia "ethernet-over-power") che mi remota le varie telecamere IP (5 in tutto, fra manovra e lavoro), quindi non c'era verso di aggiungere un'altro segnale al tutto, senza disturbare o incasinare gli altri (avevo provato a sovrapporci una portante a 30MHz modulata, ma su 500 metri di cavo o il segnale si perde, o devo infilarci 5W, disturbando tutto il resto), cosi ho dovuto optare per un'interfaccia che mi remotava ingressi ed uscite su un cavo di rete, e poi inserirlo insieme ai segnali delle telecamere.

Purtroppo, l'unica interfaccia in grado di remotarmi sulla rete sia gli ingressi, sia la RS485 per lo scansonar aveva disponibili solo 8 ingressi ed 8 uscite, ed ha un tempo di latenza di alcuni millisecondi, fra la chiusura dei contatti in locale e l'attivazione dell'uscita in remoto (il che non costituisce un problema, e' sempre "in tempo reale", pero' non posso usare quelle linee per mandarci segnali modulati).

Cosi ho usato tutti gli 8 ingressi in locale per pilotare le 8 uscite in remoto, 4 per ogni meta' della console di comando, in modo da poter usare contemporaneamente almeno 2 segnali, uno per mano, per cui ora in remoto ho gia i segnali in binario, 2 gruppi di 4 fili ... suppongo che Arduino possa tranquillamente leggerli da 8 ingressi, e generare tutte le funzioni che mi servono, ma non avendolo mai usato prima, ho preferito chiedere informazioni in anticipo.

La funzione di "setup" di cui parli, probabilmente e' quella che mi serve per la sicurezza, se puo funzionare, ad esempio, in questo modo: all'accensione (o riaccensione), IGNORANDO qualsiasi ingresso, fare in modo che tutte le uscite siano a zero di default, tranne una, che pilota un beeper di potenza stagno (come avviso) e tutti i PWM al 66%, poi sempre tenendo tutto in questo stato, leggere tutti gli 8 ingressi dei comandi da console: se sono tutti a zero, dopo un secondo spegnere il beep ed abilitare il programma che converte gli ingressi in funzioni, accettando i comandi di ingresso, se invece, durante lo startup, rileva un qualsiasi ingresso dai comandi ad 1, continuare a tenere tutto bloccato e cominciare ad accendere e spegnere il beeper ogni mezzo secondo (questo come avviso che c'e' qualcosa che non va), e continuare finche' i comandi non siano posizionati tutti a zero, poi quando sono stati riportati tutti a zero, dopo un secondo abilitare il programma.

O forse sarebbe meglio usare un "loop" di inizio, subito dopo il "setup", per effettuare il controllo, e passare l'esecuzione al segmento seguente quando tutte le condizioni sono verificate ?

Se puo funzionare in questo modo, sarebbe una grossa sicurezza in piu.

all'interno del setup puoi tranquillamente creare un altro loop, con un while.. direi che in programmazione hai bisogno di studiare un poco :slight_smile:

se gli ingressi sono 16, e in più hai varie uscite, ti consiglio di prendere un arduino mega, così leggi tutti gli input uno per uno e comandi tutte le uscite una per una, niente codice difficile, anzi direi che è un ottimo codice per iniziare.

per il resto non ti ho seguito molto, di elettrotecnica non sono una cima, ma da quello che ho capito ti sei creato un hub per le telecamere IP, quindi se arduino può gestire il sonar tanto vale montare un ethernet shield ad arduino e collegarlo via hub
non ho capito la storia della portante a 30MHz, passawa da un'altro cavo o sempre via ethernet? se via ethernet, non avresti dovuto modularla alla portante ethernet? oppure modularla alla portante dei telefoni di casa e poi usare i filtri tipo quelli che ti danno per l'adsl?

direi che in programmazione hai bisogno di studiare un poco

Un "poco" tanto, puoi dirlo forte :stuck_out_tongue:

Io sono fondamentalmente un tecnico "hardware", piu che un programmatore ... quello che a voi programmatori riesce piu facile fare con qualche riga di codice, a me riesce piu facile farlo con qualche porta logica ed un po di transistor :smiley:

Comunque, grazie per i suggerimenti, mi procuro un Mega e mi metto a smanettarci un po su, almeno adesso che ho un'idea sul fatto che la cosa e' possibile, vado un po piu tranquillo ... a proposito, sai mica se il software di cui si parla sul sito per Arduino (0022) e' solo per compilare e programmare l'ATMega, o se riesce anche ad "emulare" sul PC il funzionamento delle board ? ... se si, sarebbe un'aiuto enorme. (oppure se ci fosse un qualche emulatore del genere, magari)

Per la faccenda dei 30 MHz, era solo un tentativo di "sovrapporre" un terzo livello di segnali sullo stesso cavo, ma non si puo fare senza disturbare tutto quanto il resto (no, di cavo ce n'e' uno solo, il coassiale RG8), quindi l'ho lasciato perdere gia subito.

Per l'ethernet shield, non credo, gia mi tocchera' costruirmi una "shield" personalizzata per il pilotaggio dei motori ed attuatori (principalmente, drivers a ponte di mosfet di potenza, pilotati dai PWM per le velocita' e dalle uscite per la direzione), e poi l'ethernet gia mi remota l'interfaccia M2M (che remota anche l'RS485 dello scansonar) ed alcune camere, non ci posso caricare anche i protocolli per l'Arduino ... inoltre, la soluzione dell'interfaccia M2M l'ho usata per ridurre il piu possibile i tempi di latenza dei comandi ... mi spiego meglio, cosi come e' adesso, la console e' cablata a contatti, fra lettura del contatto > trasferimento in remoto > arrivo all'Arduino, il comando ha da 5 a 10 mS di ritardo, poi arriva ai servo, mentre se dovessi usare la rete, dovrei rifare la console, costruire una seconda interfaccia di rete dedicata per fargli leggere in scansione la console, leggerla con un PC, spedire i segnali sulla stessa rete delle camere, decodificare i segnali con l'Arduino, e generare le uscite ... dubito che potrebbe essere piu veloce, in compenso aggiungerei parecchia roba che ha la possibilita' di guastarsi (legge dell'elettronica n. 2, "Quel che non c'e', non puo guastarsi." ;))

Arduino (0022) e' solo per compilare e programmare l'ATMega, o se riesce anche ad "emulare" sul PC il funzionamento delle board ?

mi spiace, nessun simulatore valido per arduino per ora, anche se idealmente non è difficilissimo da fare, diciamo medfiamente facile per un esperto :slight_smile:

per il resto direi che sei sulla giusta strada, ti posto questa guida che ho confezionato un apio di giorni fà, per iniziare a programmare dovrebbe essere utile. Se non hai ancora arduino, potresti iniziare a sgranchirti con il C classico, per windows c'è un ottimo compilatore + IDE che è dev-c++,per linux e mac direi l'immancabile gcc :smiley:

lesto:
mi spiace, nessun simulatore valido per arduino per ora

Se cerchi un simulatore specifico per Arduino probabilmente non trovi nulla di valido, se cerchi un simulatore per AVR che supporti il 328p ne esistono tanti, moltissimi più che validi.
Uno commerciale a basso costo è questo, prevede vari strumenti e vario hardware virtuale, funziona molto bene ed è usatissimo.

astrobeed non conoscevo questo software, quindi con arduino compili l'hex e poi lo carichi nel simulatore?

lesto:
quindi con arduino compili l'hex e poi lo carichi nel simulatore?

Esatto, poi utilizzi i vari, tanti, tool virtuali messi a disposizione dal simulatore, incluso un terminale seriale, per vedere cosa succede.
Il software si può scaricare in versione demo totalmente funzionante, però permette al massimo qualche decina di avvi con un tempo limite di un paio d'ore per ogni sessione.

non preoccuparti TheMadDoctor fanno paura ma non mordono
XD XD XD XD XD

a proposito, probabilmente sbaglierò ma http://www.virtualbreadboard.com/ c'è un emulatore (sempre se ho capito cos'è un'emulatore) per arduino, era gratuito fino ad aprile... =(

Di simulatori software per AVR ce ne sono molti.
Attenzione che quasi tutti i simulatori sono molto lenti durante la virtualizzazione, cioè pochi secondi di tempo simulato possono diventare molte decine di secondi di tempo reale, sopratutto se si vuole visualizzare in real time tutto quello che succede all'interno della CPU.

si, quello bisogna metterlo in conto, ma è un prezzo da pagare se si vuole virtualizzare (io lo usavo per studiare l'arduino :D)

Ancora un grazie a tutti.

@ lesto: non c'e' il link alla tua guida :wink:

AVR Simulator sembra bello incasinato ... ma pure gli altri non scherzano :stuck_out_tongue: ... meglio che mi studi un po di programmazione, prima di provare ad usarli :astonished:

Una possibile alternativa potrebbe essere qualcosa di simile a Pspice, che consenta di "simulare" sul PC anche il resto dei componenti (virtualbreadboard dovrebbe funzionare cosi, pero' e' limitato, e per sbloccare tutto bisogna pagare per "sottoscrizioni" a tempo) ... di fatto, il problema principale e' proprio quello di emulare tutto quanto, non solo la board Mega.

Mi spiego, se con la Mega ci devo pilotare, ad esempio, un motore, che deve poter girare avanti o indietro a diverse velocita', questo richiede ovviamente un'interfaccia ... il modo piu semplice e' utilizzare 4 mosfet di potenza (o un ponte integrato, se disponibile), e pilotarlo mediante 2 uscite per l'avanti e indietro, e mediante uno dei PWM connesso all'enable (a 100KHz o piu), per le diverse velocita', con un'operazionale che legge la corrente e manda il tutto in protezione se il motore si blocca (indipendentemente dalla Mega) ... lo schema elettrico per questa soluzione e' quasi elementare, ma la scelta dei valori no ... bisogna fare diverse prove, simulando l'assorbimento del motore per differenti condizioni (libero, sotto sforzo, carico massimo, bloccato), calcolare i diversi valori, provarli ... e' molto piu semplice se per la parte iniziale e' disponibile un'emulatore, piuttosto che dover rifare 4 o 5 volte diversi circuiti, ogni volta che si decide di modificare qualcosa o di provare una configurazione differente.

Virtualbreadboard sembrerebbe quello giusto, ma la loro "filosofia" non mi va proprio ..... voglio dire, nulla in contrario a pagare il giusto, per un programma che funziona come voglio io, ma se poi devo continuare a pagare per "rinnovare" le loro "sottoscrizioni a tempo", allora si attaccano ... :stuck_out_tongue:

Purtroppo per ora sembra che non ci sia nulla di simile ... c'era un programma chiamato "Emulare 1.7", ma sul mio sistema non funziona e non so perche' ... provero' le demo di Avrora, appena ho un'attimo di tempo (dannato lavoro che interferisce sempre con gli hobby :D)

TheMadDoctor:
@ lesto: non c'e' il link alla tua guida :wink:

wooops, eccola: Arduino Playground - HomePage

come ti capisco mad, comunque anch'io ho smesso di usare virtualbreadboard non appena l'hanno messo a pagamento prima che mi bloccassero le versioni precedenti ...sob
:0