[RISOLTO] Due Arduino, una striscia led... deviatore?

Buon sabato,
eccomi con un'altra delle mie idee strampalate! Devo smetterla di andare a camminare nei boschi, l'aria buona produce idee malsane :slight_smile:

Obiettivo
pilotare una striscia led alternativamente da due Arduino senza utilizzare un deviatore meccanico (nel senso interruttore manuale).

L'idea
Arduino A comanda una striscia led.
Al bisogno, Arduino A:

  • smette di inviare dati alla striscia
  • comanda a X (L1) di ricevere i dati da Arduino B (devia la linea dati)
  • comanda ad Arduino B (L2) di inviare dati alla striscia
    Al bisogno, Arduino A:
  • comanda ad Arduino B (L2) di non inviare dati alla striscia
  • comanda a X (L1) di ricevere i dati da Arduino A (devia la linea dati)
  • invia dati alla striscia

Di seguito uno schemino

deviatore.png

Quesito
Si può fare? Se si, come? Cos'è X?

Ho provato a fare qualche ricerca, ma non ho trovato nulla di utile, a parte questo, ma non è proprio lo stesso principio.

Nota
Chi ha seguito i miei ultimi esperimenti, ha sicuramente capito cosa voglio fare, comunque il problema è che non posso più aggiungere funzionalità ad Arduino A, quindi pensavo di utilizzare un secondo Arduino.
Chiaramente potrei sostituire Arduino con altro, ma questo mi sembra un buon esperimento, sempre che si possa fare, in ogni caso non è un upgrade fondamentale al progetto.

Tenete presente le mie conoscenze, e sentitevi liberi di dirmi di lasciar perdere, la cosa non mi offende affatto :wink:

TIA
Federico

deviatore.png

Un qualsiasi multiplexer digitale ... gli dai quale ingresso buttare in uscita e colleghi i due pin di dati a due differenti ingressi. Ah ... immagino parli di una striscia di LED intelligenti tipo WS2812 che comandi con UN pin :wink:

Guglielmo

gpb01:
Un qualsiasi multiplexer digitale ...

Caspita, cosi facile? :slight_smile:

Ho appena letto questo, mi sembra anche molto semplice da usare, ma trovo solo moduli a 16 canali!!
Per quel che mi serve mi basterebbe un 2x1, al max 4x1, continuo a cercare.

In merito alla striscia... immagini bene, un cavo dati :wink:

Grazie
Federico

Puoi leggere anche QUESTO che è fatto bene e guarda gli SN74LS151 :wink:

Guglielmo

Per averlo velocemente, ho trovato solo questo, la foto non mi convince, ma il venditore sembra ok.

Grazie
Federico

Per chiarire, io ho bisogno di due ingressi e una uscita, quindi mi basterebbe un solo pin come selettore.
L'SN74LS151 ha tre pin per la selezione (avendo otto ingressi), facendo riferimento alla tabella di verità, ipotizzo di poter avere questa configurazione:
uso D0 e D7 come ingressi, Y come uscita e collego i pin A, B e C (selettori) ad un unico pin arduino in modo da poter utilizzare le sole combinazioni LLL (D0) e HHH (D7), questo perchè immagino di non poter lasciare liberi due dei selettori.
Corretto? o ho detto una sciocchezza?

SN74LS151.png

TIA
Federico

SN74LS151.png

Colleghi 'B' e 'C' a massa così usi solo 'A' come selettore per 'D0' 'D1'.

O li colleghi a Vcc così con 'A' selezioni 'D6' e 'D7'.

Funziona anche il tuo sistema naturalmente, l'elettronica digitale permette molte "interpretazioni".

Se non ricordo male gli ingressi TTL scollegati sono alti, ma comunque non mi fido a lasciare ingressi aperti.

Claudio_FF:
Colleghi 'B' e 'C' a massa così usi solo 'A' come selettore...

Fantastico, non avevo pensato a questa soluzione.

Grazie
Federico

Basterebbe fare una logica OR: le due uscite sono collegate insieme attraverso due diodi e poi c'è una resistenza di pulldown: quello che è attivo passa. Se necessario, puoi aggiungere un buffer (o due inverter in cascata) CMOS serie 40 o serie 74.

Al posto di tutto quanto detto, puoi anche usare una sola porta OR (o, se più facilmente disponibili, due NAND, di cui una usata come inverter in uscita, forzando alta l'uscita dell'Arduino che è bloccato).

Datman:
Basterebbe fare una logica OR...

Grazie, ma per me troppo complicato, ho già preso un paio di SN74LS151 :slight_smile:

Federico

Complicato???...

OR.png
Puoi usare un 74LS32 o CD4071, oppure puoi usare un 74LS02 o CD4001 invertendo l'uscita con una delle 3 porte rimanenti.

Tra l'altro, se metti il pin di Arduino che è bloccato in alta impedenza impostandolo come ingresso, puoi collegarli brutalmente in parallelo! 8) Si fanno interi bus in questo modo... :slight_smile:

OR.png

Datman:
Complicato???...

Nel senso, che se devo scegliere tra realizzare la logica con diodi e resistenze, e usare un chip, preferisco il chip :wink:

Federico

"Puoi usare un 74LS32 o CD4071, oppure puoi usare un 74LS02 o CD4001 invertendo l'uscita con una delle 3 porte rimanenti."

Si, ma immagino lui utilizzi due istanze di qualche libreria per pilotare i Neopixel e quindi ... meglio avere la separazione totale che offre un mux rispetto alle altre soluzioni ... non si sa mai cosa combinano le librerie sui pin :smiley: :smiley: :smiley:

Guglielmo

Le librerie: gioie e dolori degl'ignari sperimentatori! :slight_smile:

gpb01:
Si, ma immagino lui utilizzi due istanze di qualche libreria per pilotare i Neopixel ...

Ovviamente, una libreria per ogni Arduino :slight_smile:

Datman:
Le librerie: gioie e dolori degl'ignari sperimentatori! :slight_smile:

sai che per me è un passatempo, a volte leggo e a volte gioco con Arduino :slight_smile:
e poi, sono uno un programmatore, le librerie, se le conosci, sai anche come usarle, e se non ci sono, te le crei :wink:

Federico

... e in quest'ultimo caso sai bene come gestirle e adattarle alle tue esigenze!

Ho già ricevuto l'SN74LS151, spero di riuscire a fare qualche test nel fine settimana. :slight_smile:

Adesso nasce un altro dubbio
(Non apro un altro un altro thread, ma se preferisci, lo sposto).

"Arduino A" comanda ad "Arduino B" (L2) di inviare/non inviare dati alla striscia, perchè vorrei evitare di di far lavorare "Arduino B" inutilmente :wink:

Visto che già uso AltSoftSerial, pensavo di creare un'altra istanza per la sola trasmissione, ma pensavo male!
AltSoftSerial può usare solo i pin 8 e 9 che sono già utilizzati, ed in ogni caso non prevede la sola trasmissione, quindi ne dovrei usare due pin!

Visto che io devo solo trasmettere due comandi (start/stop), potrei collegare tra loro due pin?
Naturalmente il GND è già in comune tra i due Arduino (stessa alimentazione), e quindi, indicativamente qualcosa del genere:

  • Arduino A (master)
byte pinA = 5;
void setup() {
  pinMode(pinA, OUTPUT);
}

void loop() {
  if(qualcosa) {
    digitalWrite(pinA, HIGH);
  } else {
    digitalWrite(pinA, LOW);
  }
}
  • Arduino B (slave)
byte pinB = 5;
void setup() {
  pinMode(pinB, INPUT);
}

void loop() {
  if(digitalRead(pinB)) {
    //fai quello che devi fare
  }
}

immagino si possa fare, ma preferisco fare domande stupide, che fare danni :wink:
forse è meglio aggiungere un diodo? se si, cosa?

TIA
Federico

Metti in serie una resistenza da 470Ω così, anche se dovessi sbagliare qualche cosa, NON potresti mai far scorrere più corrente di quanta al massimo ne regge un pin :wink:

Per il resto, è un ottima soluzione.

Guglielmo

gpb01:
Metti in serie una resistenza da 470Ω così, anche se dovessi sbagliare qualche cosa, NON potresti mai far scorrere più corrente di quanta al massimo ne regge un pin :wink:

Grazie!
Effettivamente, il software lo scrivo io, e dovrei essere in grado di non invertire il flusso :wink:

Federico