SoftSerial

Salve a tutti!

Per un mio progetto ho l'esigenza di controllare moooooolte uscite e molti ingressi. Dato che non riesco a comprendere la logica degli shift register, ho deciso di utilizzare una sorta di protocollo seriale. Ogni derivazione invia tramite tx al master che raccoglie e li rinvia al computer. Il master sarebbe una sorta di multiplexer.

Per il master userei un atmega2560 (mannaggia lo fanno solo in smt!!!), mentre per le derivazioni uso un atmega328.

Credete sia fattibile? Se si, con la libreria softserial riuscirei a configurare solamente un tx o un rx? Se non dovessi per forza configurare sia rx tx avrei il doppio delle entrate e delle uscite.

Edit: Grazie mille!

l'elettonica non è il mio forte, tuttavia:

lo shift register non l'ho mai usato, ma leggendo questo forum quotidianamente ho intuito che inviando un'impulso al CLK cambi il pin dello shift da coomandare.

in alternativa ci sono alcuni shift che comandano più pin in rapporto ai pin che sfrutta. es. con 4 pin ai comandi = 16 pin da poter comandare 0000 = 0 0001 = 1 0010 = 2 0011 = 3 ... 1111 = 15

in base allo stato dei 4 pin sfruttati dall'atmega allo shift register puoi comandare altri 16 pin che verranno letti/scritti da un quinto pin.

successivamente l'ATMEGA 2560 ha 3 seriali, quindi potresti collegare USB "il mega" e sul Serial2 o Serial3 l'Atmega328 e comandarli con il classico Serial (non so se puoi sfruttare la SoftSerial anche per il Serial2).

Per il master userei un atmega2560 (mannaggia lo fanno solo in smt!!!)

volendo ci sono degli adattatori che riportano i pin dell'atmega2560 smt in tht e potresti utilizzarlo in una classica breadboard.

sicuramente i Big sapranno dirti di più su questo argomento.

I parallel in/serial out shift register (74165) sono registri che possono leggere 8 uscite contemporaneamente: ogni volta che dai il segnale di latch, carichi nel registro interno il valore degli 8 pin e poi li puoi leggere dall'Arduino. Se colleghi più registri in cascata, puoi leggere diversi ottetti (8 bit=1 byte) alla volta.

Quelli che dici tu, Marbi, sono dei convertitori 3-to-8 (come il 74138) o 4-to-16 e servono principalmente per la selezione di altri chip: sui vecchi computer, ad esempio, erano usati per selezionare i banchi di memoria in base ai bit più alti dell'indirizzo spedito dalla CPU.

leo72: Quelli che dici tu, Marbi, sono dei convertitori 3-to-8 (come il 74138) o 4-to-16 e servono principalmente per la selezione di altri chip: sui vecchi computer, ad esempio, erano usati per selezionare i banchi di memoria in base ai bit più alti dell'indirizzo spedito dalla CPU.

capisco, ma non potrei usarli, per esempio per l'indirizzamento dei trasferimenti dati?

mi spiego meglio, collego un arduino ad un 74138 e dall'altro capo collego 8 arduini, in base ai valori che do ai 3 pin/bit non potrei trasmettere ad un determinato arduino?

perchè non capisco se posso inviare soltanto un segnale oppure veri e propri dati!!! (sempre per info :D )

p.s. non vorrei entrare in un ennesimo OT :(

L'ideale sarebbe il protocollo seriale, dato che ha bisogno di un solo filo, mentre gli shift & co usano dai 2 ai 3 fili/piste. E' importante la quantità di fili che devo usare!

In ogni caso, dovrei inviare proprio dei dati (sottoforma di caratteri, nulla di più).

L'ideale è il bus I2C: puoi connettere fino a 128 periferiche differenti, ognuna con il suo indirizzo, usato per identificarla sul bus, messo nello sketch degli 8 Arduino come indirizzo arbitrario, es.: 0xA0, 0xA1... 0xA7. Dall'Arduino "master" non devi far altro che fare una richiesta sul bus specificando l'indirizzo dell'Arduino che deve rispondere

Ora cerco bene come mettere l'indirizzo.

L'I2C lo conoscevo già, ma non sapevo come dare un indirizzo ad ogni dispositivo un indirizzo.

E' l'occasione per impararlo! ;)

tra il dire ed il fare c'è di mezzo un mare, e visto che la teoria l'ho mezza capita chiedo a stefano di farci vedere anche l'atto pratico qualora riesca nel progetto :D

altrimenti poi Leo si lamenta perchè sto sempre a rompergli i maroni :stuck_out_tongue_closed_eyes: in particolare collegamento di questo famoso I2C e pezzettino di codice per far parlare i vari atmega :D

stefanolavori: Per il master userei un atmega2560 (mannaggia lo fanno solo in smt!!!), mentre per le derivazioni uso un atmega328.

La cosa è molto semplice da risolvere, lato pc una interfaccia USB-RS485, ogni Arduino stand alone dotato di 485, il pc è il master gli Arduino sono gli slave, ne puoi mettere fino a 255 (compatibilmente con il tipo di transceiver) per ogni bus, la velocità di comunicazione può essere molto più alta di quella offerta dalla normale seriale e/o dalla I2C, puoi raggiungere una distanza di 1200 metri.

Anche la soluzione di astro va bene, c'è solo da capire la distanza tra i vari Arduini.

stefanolavori: Ora cerco bene come mettere l'indirizzo.

Semplicemente quando "agganci" l'Arduino sul bus I2C dando Wire.begin() entri come master, Wire.begin(indirizzo) entri come slave con l'indirizzo specificato.

Semplicemente quando "agganci" l'Arduino sul bus I2C dando Wire.begin() entri come master, Wire.begin(indirizzo) entri come slave con l'indirizzo specificato.

SEI UN MITO!!!

stefanolavori: SEI UN MITO!!!

:sweat_smile: