Aumentare il numero degli ingressi di arduino.

Ciao a tutti, ho un problema che credo sia risolvibile, ma vorrei chiarimenti su alcuni aspetti.
Possiedo arduino mega 2540 ed ho impegnato più di 30 pin per il controllo generale di alcuni sensori, tastierino numerico ed uscite per pilotare alcuni relè. Ho bisogno di avere molti più ingressi utilizzando pochi pin ed ho visto diversi articoli tipo questo:
http://www.google.it/url?http://www.mcmajan.com/mcmajanwpr/?p=1376

Utilizza uno shift register 74HC165 e da quanto vedo impegna solo 3 pin per avere 8 ingressi.
Il mio problema è questo:
Se io volessi avere lo stato di 40 ingressi utilizzando solo 15 pin di arduino, e tutti questi ingressi con "mantenimento chiuso" ho dei problemi?
Mi spiego meglio, un tastierino numerico per esempio non ha bisogno di avere più pressioni al' unisono perché solo un comando alla volta viene accettato, mentre a me serve avere lo stato di tutti gli ingressi come stanno realmente. es: 10 sono mantenuti chiusi e i restanti aperti. Con la configurazione del sito postatovi, viene a favore al mio caso perché nello sketch, ad ogni variazione di stato di un qualsiasi ingresso, viene inviata tutta la situazione attuale via seriale degli ingressi ed è quello che voglio ma ho paura che ci sia qualcosa che non ho preso in considerazione.
Ricapitolando:

  • Ho bisogno di avere almeno 60 o più ingressi digitali sfruttando il più basso numero di pin di arduino
  • La frequenza di commutazione on/off è molto lenta, nel' ordine del secondi o minuto c'è una variazione di stato.
    -la simultanietà di tutti gli stati mantenuti a massa o a livello alto (per esempio la tastiera di un pc non consente di avere lo stato di più di 8 tasti premuti consecutivi per un sistema di logica a matrice)
  • Avere, ogni volta che cambia lo stato di uno degli ingressi, lo stato tramite serial port.
    Chi è in grado tra di voi di consigliarmi qualcosa, magari se il sito indicato potrebbe essere la strada giusta?
    grazie e buon anno a tutti

Se colleghi gli shift register in cascata, a livello hardware ogni gruppo di 8 ingressi ti utilizza ... gli stessi 3 pin del primo :wink: ... quindi 3 (o 4, dipende come li usi) pin in tutto ... poi dovrai ovviamente leggerli tutti ogni volta, mettendo i valori in un'array e lavorando su quello a livello software, ma quello e' un'altro discorso :wink:

Mandi il serout del secondo nel serin del primo, quello del terzo nel secondo, e cosi via, gli altri pin sono in parallelo ... ti allego parte di uno schema che sto sviluppando per un'applicazione (non lo allego tutto solo perche' e' straincasinato), per darti l'idea di cosa intendo ...

Puoi metter i shift register in cascata.

perché nello sketch, ad ogni variazione di stato di un qualsiasi ingresso, viene inviata tutta la situazione attuale via seriale degli ingressi ed è quello

I shiftregister non fanno nessun controllo attivo devi Tu leggere regolarmente i stato degli ingressi.

Ciao Uwe

Una MEGA possiede anche degli ingressi analogici che puoi usare come digitali: li hai sfruttati?

Volendo puoi decidere di utilizzare dei pcf8574 tramite protocollo I2C (quindi 2 pin dell'Arduino), con cui volendo oltre agli ingressi puoi espandere anche le uscite arrivando ad un totale di 64 utilizzando 8 di questi integrati (o 128 I/O aggiungendo altri 8 pcf8574A).

Se ti interessa qui c'è un'articolo molto interessante su come usarlo.

1 Like

uwefed:
Puoi metter i shift register in cascata.

I shiftregister non fanno nessun controllo attivo devi Tu leggere regolarmente i stato degli ingressi.

Ciao Uwe

Ciao, intendevo da Software leggere lo stato e ad ogni cambio, inviare una stringa seriale.

PER ETEMENANCHI:
Grazie per la dritta, lo immaginavo che bastavano solo tre cavi, un po come succede per i protocolli I2C e questo viene a mio favore.
Per caso stai progettando questa cosa per applicazioni domotica?
Se è per quello, anche io ci sto lavorando, ho un Software molto complesso, magari ne hai già sentito parlare; Il mio progetto si chiama labdomotic con il Software domotica Tartaglia PRO e implementa delle mie interfacce Hardware (labdomotic 4000) Sto cercando una soluzione per i ritorni, nel senso che tutti quegli ingressi vengono impegnati per i ritorni dello stato serrande, luci, porte ecc.
Arduino è il cuore della parte analogica e gestisce tutto quello che appartiene a sensoristica e stato ritorni.

cyberhs:
Una MEGA possiede anche degli ingressi analogici che puoi usare come digitali: li hai sfruttati?

Certo, sono tutti impegnati per 12 sonde DHT11 e i restanti per altri tipi di sonde.

Quello che non ho capito, è cosa inviare tramite seriale per lo stato, es: di 80 ingressi digitali. Chiaro che su arduino saranno inseriti dentro una array, ma come porto lo stato di tutti questi ingressi in un solo comando? avete una soluzione per non impegnare il flusso seriale? I sensori per esempio tramite arduino inviano ogni 10 secondi lo stato di tutti i valori, ma non saprei come gestire il flusso di più di 80 ingressi.
Mi piacerebbe sapere voi come realizzereste una cosa simile.
Grazi infinite per il vostro supporto

Puoi usare l'easy transfert --> EasyTransfer Arduino Library « The Mind of Bill Porter
Prima di spedire comprimi tutto in 10 byte.

PaoloP:
Puoi usare l'easy transfert --> EasyTransfer Arduino Library « The Mind of Bill Porter
Prima di spedire comprimi tutto in 10 byte.

ma questo vale se la comunicazione avviene tra due arduino?
Il problema è che devo gestire dal mio Software i valori seriali entranti e non credo posso decomprimere un valore inviato in modo compresso. Ho utilizzato arduino anche come centralina antifurto, ma gestisco solo gli ingressi dei rilevatori antri intrusione e sono 12 e per riconoscere il loro stato ho inviato una stringa formata da 12 caratteri dove, ad ogni carattere corrisponde lo stato di un' ingresso es: 000100000001 questa stringa inviata significa che ho il quarto e l' ultimo ingresso a livello alto. Ogni volta che questa stringa cambia di stato, viene inviata tramite seriale. Potrei fare la stessa cosa, ma una stringa da oltre 80-90 caratteri mi sembra eccessiva. voi cosa ne pensate?

pablos:
I dati che invii sulla seriale dove finiscono?

Vengono gestiti dal mio Software. Vengono messi dentro un' array list e, in funzione al primo carattere di indirizzo, smisto e prelevo i valori.

Purtroppo non posso impegnare tutti i pin di arduino perchè sono gia impegnati.
12 per le sonde temperatura umidita
4 per i sensori fumo e gas
8 per il tastierino numerico
12 per gli ingressi della centralina allarme
6 per delle uscite ausiliarie (relè o led)
quindi ne rimangono pochi. In multiplexer, con appositi chip dedicati si può fare tranquillamente, vedi il link che ho postato. Mi sembrava una soluzione molto simile a quella che cerco io, ma per espanderla, volevo sapere se potevo tenere a livello alto tutti gli ingressi senza andare in conflitto. Da quanto ho capito, viene letto un solo ingresso alla volta e messo dentro una cella di memoria dello shift register e poi viene inviato lo stato di tutti gli ingressi letti dal chip. quindi viene letto uno alla volta ad una velocità impercettibile.
questo è il link del progetto di cui sto parlando:

edstarink:
...
Per caso stai progettando questa cosa per applicazioni domotica?
...

No, sto riprogettando da zero un ROV per impieghi medi (max 400 metri di profondita', una cinquantina di chili di peso), e questo e' parte dello schema della scheda ingressi, che gestisce 6 banchi da 8 ingressi protetti, per poter trasmettere fino a 48 comandi simultaneamente al ROV via cavo coassiale, sovrapposti all'alimentazione (lo schema completo della sezione ingressi e' quello sotto, e' circa un decimo del totale fra centralina e ROV, ed ancora non ho finito di progettare decoder, overlay video e trasmettitori RF per le camere ... in compenso il mal di testa e' gia formato famiglia :P)

Un ROV? Pensa che io lavoro per una cooperativa di sommozzatori e ne ho visti di rov, specialmente al' interno ne ho anche pilotato uno diversi anni fa per un survay dove dovevo controllare il fondale per mettere una piattaforma. Avevamo il super Achille, un rov che arrivava fino a 1000 metri con un solo cavo coassiale. 6 motori e una console fatta veramente bene. Avevamo anche Helena, sembrava un missile e costava 800 milioni delle vecchie lire. Dentro era fantastico, lavorava in alta tensione e dentro aveva i toroidali per generare corrente per i motori. Occhio :wink: realizzare un rov è molto difficile, non solo per la parte circuitale, ma anche per la parte meccanica e connessioni ad immersione. Se vuoi ti posso dare delle dritte, specialmente sulla parte connessioni...sono un tecnico e mi occupo di tutta la parte comunicazioni, video ed altro del mondo iperbarico. Naturalmente accetto ben volentieri un' aiuto per realizzare quello che sto chiedendo nel forum :slight_smile:

Grazie, ne ho gia riparati due (uno si era allagato) e modificato uno, ed un po di esperienza nel campo ce l'ho ... ora sto riprogettando tutto da zero, per renderlo piu affidabile ed aggiungere roba ... conosco il Super Achille, quello che sto progettando ha una struttura simile ma per ora solo 4 motori (niente traslazione laterale, non so se la aggiungero') ... lavorera' con la rete (tramite un trasformatore d'isolamento), 260V di default, commutati a 290 quando azioni i motori.

Bene, se conosci il super achille saprai il fatto tuo :wink: .
Rov a parte, cosa ne dite del mux shield 2 che ha 48 input con solo 3 pin?
si possono mettere due di questi shield per arrivare a 96 ingressi?
La Schedina è già pronta, basta solo implementare dei tlp281-4 per avere gli ingressi optoisolati, ma non ho ancora capito se posso tenere mantenuti a livello alto o basso tutti i pin contemporaneamente.
Nel senso che verranno tenuti tutti a livello alto e se uno di questi ingressi viene a mancare il +vcc, segnala che una serranda è aperta oppure una luce spenta ecc, è fattibile?.
Chi mi potrebbe aiutare tra di voi a capire come gestire questi ingressi?
non sono riuscito a trovare uno sketch per capire come avere lo stato di questi 48 input, voi sapete qualcosa a proposito di questo shield?
saluti

Scusa il tastierino numerico è un 4x4 (16 pulsanti) oppure ti puoi accontentare di un 3x4 (12 pulsanti)?

Te lo chiedo perché esiste un LCD I2C/seriale con connettore per un keypad 3x4 che ti farebbe risparmiare un sacco di linee ed oltretutto risolve il problema del rimbalzo tasti.

purtroppo no, ho bisogno del 4x4 perché le lettere vengono usate per aprire diverse funzioni.
Ma non credo sia li il problema, anche se rimuovessi il tastierino, i pin non sono sufficienti. devo avere almeno 48 ingressi, ma speravo di avere informazioni sulle domande dove non ho ancora avuto risposta :slight_smile:
la simultaneità delle pressioni con il mux shield e se c' è uno sketch che spiega come gestire gli ingressi. Io per adesso ho trovato solo materiale in inglese.
per simultaneità intendo che devo avere tutti gli stati mantenuti a livello alto in pull UP e non so se il mux shield ha delle limitazioni. Io penso di no, conosco a grandi linee il multiplexer e visto che dialoga un solo ingresso alla volta memorizzando il suo valore dentro un buffer, non credo gli freghi niente se un' ingresso o più sono a livello alto o basso. correggetemi se sbaglio :wink:

Etemenanki:
Se colleghi gli shift register in cascata, a livello hardware ogni gruppo di 8 ingressi ti utilizza ... gli stessi 3 pin del primo :wink: ... quindi 3 (o 4, dipende come li usi) pin in tutto ... poi dovrai ovviamente leggerli tutti ogni volta, mettendo i valori in un'array e lavorando su quello a livello software, ma quello e' un'altro discorso :wink:

Mandi il serout del secondo nel serin del primo, quello del terzo nel secondo, e cosi via, gli altri pin sono in parallelo ... ti allego parte di uno schema che sto sviluppando per un'applicazione (non lo allego tutto solo perche' e' straincasinato), per darti l'idea di cosa intendo ...

@ete
ciao
stavo guardando lo schema postato e ho notato che sulla linea che colleghi l'uscita seriale di uno shift con l'altro hai messo delle resistenze di pulldown, io uso dei cd4021 li consigli anche su questi, ma soprattutto sono necessari, migliorano il comportamento?

Per un'uso "al volo" si potrebbero omettere, ma usandolo in uno scatolotto con anche encoder, convertitore fsk e trasmettitore convogliato, a volte creavano problemi, mentre invece in quel modo i problemi sono spariti quasi tutti ... probabilmente funziona anche con i 4021, ma e' una cosa da provare di volta in volta (comunque ho visto che male non gli fanno, al massimo non faranno nulla, ma danni nessuno, ed una sicurezza in piu e' sempre meglio di una in meno, in applicazioni "critiche" ;))

edstarink:
...
la simultaneità delle pressioni con il mux shield e se c' è uno sketch che spiega come gestire gli ingressi. ...

Per lo sketch non so, ci sto ancora studiando sopra, anche perche' la mia applicazione e' piu "strana" (e per ora non ho un pc su cui fare prove a casa, quindi tutto a mente :P) ... ma per gli ingressi, non vedo problemi a fare quello che dici ... puoi tenerli tutti ad 1 con dei pullup da 10 o 20 Kohm, in quel caso te li leggera' come tutti 1, quando alcuni (o anche tutti) andranno a zero, i corrispondenti bit nelle relative stringhe andranno a zero, stara' poi allo sketch esaminare le stringhe di bit e vedere quali sono a zero e quali ad uno ... ma a livello "fisico", non c'e' assolutamente nessun problema ...

Ti ringrazio, almeno su questo aspetto posso andare tranquillo.
realizzare la parte hardware non mi sembra niente di complesso a parte il fatto che devo obbligatoriamente usare degli optoisolatori per questioni di lunghezza cavo e sicurezza (molti dei contatti vengono presi da microswitch, mentre altri da contatti relè.
Il mio problema è capire come gestire questa quantità di dati. nessuno mi ha mai spiegato come si gestiscono via seriale tante informazioni come la gestione del numero di ingressi.
se si tratta di 10 ingressi è semplice, basta inviare una stringa da 10 caratteri oppure uno alla voltra, la seriale non viene impegnata se la stringa è corta, con valore binario 0/1 per lo stato come ho gia fatto, ma un contro è avere 10 ingressi, un conto è averne piu di 90
casomai è possibile creare piu stringhe, per esempio 3 stringhe da 30 caratteri, non mi sembra niente di difficoltoso ma quello che chiedo è questo:
qual' è la migliore soluzione? intendo ricevere lo stato di tutti gli ingressi con una stringa molto piu corta, tipo in esadecimale per poi essere convertita dopo la lettura da seriale?
Aiutatemi, mi blocca questo aspetto..

Ho provato a capire questo schetch e mi sembra la soluzione piu indicata.

const int IN_PL = 9;
const int IN_Data=10;
const int IN_Clock=8;

int attuale=0;
int lettura=0;

void setup()
{
  pinMode(IN_PL,OUTPUT);
  pinMode(IN_Data,INPUT);
  pinMode(IN_Clock,OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  delay(50);
  digitalWrite(IN_PL, LOW);
  digitalWrite(IN_PL, HIGH);
  lettura=shiftIn(IN_Data, IN_Clock, MSBFIRST );
  if(attuale!=lettura)
  {
    attuale=lettura;
    Serial.println (lettura);
  } 
}

Se ho ben capito, ogni 74HC165 si occupa di 8 ingressi e lo schetch è riferito ad un solo 74HC....
Se uno degli stati cambia da LOW/HIGH o viceversa, viene inviato, cosi scrive nel sito, un numero che va da 0 a 255. Mi chiedo perchè questo valore? come lo interpreto, sono tutte le combinazioni che possono avere 8 ingressi?
EDIT...Ho studiato nell' attesa :slight_smile: si si tratta di una conversione da decimale a binario.
se ricevo il valore 37 ho il seguente stato 101001 che indica che il primo ingresso, il terzo, e l' ultimo sono a livello alto per la formula della divisione per due, mentre i resti sono i valori:
37 : 2 = 18 resto 1
18 : 2 = 9 resto 0
9 : 2 = 4 resto 1
4 : 2 = 2 resto 0
2 : 2 = 1 resto 0
1 : 2 = 0 resto 1

Se è cosi, ad ogni variazione di stato viene inviato quel codice numerico IN RELAZIONE ALLO STO ATTUALE DEGLI INGRESSI PER QUEL 74HC..tramite il serial print?
se avessi invece due di questi 74HC165, dovrà essere eseguita una seconda chiamata shiftIn successiva alla prima per andare a leggere i secondi otto ingressi?
per concludere. se ho tre 74hc... ed ho, nello stesso tempo tre variazioni, una per ogni integrato, mi arriveranno tramite seriale tre valori come questi:
238
139
240
a questo punto dovrei mettere un carattere di codifica per capire da seriale quale stringa è stata inviata per mezzo di un 74hc...?
es:
A238
B139
C240

Vi prego, voglio solo che mi dite se ho capito oppure se la cosa è lontana da quello che ho capito