Multiplexer, io non lo conosco...

Salve a tutti,
vi chiedo un aiuto per capire meglio la gestione a codice del concetto di multiplexer.
Per imparare ad usare l' arduino, mi sono cimentato nel gestire due display a sette segmenti usanso solo 7 uscite, usandoli come countdown elettronico ( con in piu' un ingresso per far partire il countdonw, e uno per resettare).
Mi sono documentato su internet, anche attraverso il forum di arduino, imparando cos'e' il multiplexer, imparando come collegare i display ma sono ad un punto morto.
Al livello pratico non capisco come gestire i due transistor che collego sui catodi dei display, quindi chiedo a voi di illuminarmi.
Accetto suggerimenti, insegnamenti, cazziate su tutto quello che diro' o mi direte.
Grazie in anticipo per il tempo che mi dedicherete.

Bruser

Allora se usi arduino noterai che in esso è presente un generatore di impulsi al cristallo di quarzo, il che significa che puoi "sincronizzare" qualsiasi dispositivo legato al tempo, quindi in linea generale stiamo parlando di logica sequenziale ( contatori etc etc ), tu vuoi usare un multiplexer per pilotare un display 7 segmenti ok, ma se hai arduino non ti serve multiplexare ( logica combinatoria ). Io per esempio utilizzo il clock interno di arduino per impostare il timer nel 7 segmenti.

Semplice:

Se devi visualizzare il numero197 su 3 display, devi prima inviare il numero 1 al 1° display e attivarlo con il suo Transistor TR1.

  • poi invii il numer 9 al 2 display, accendendolo con il suo Transistor TR2
  • e poi invii il numero 7, contemporaneamente all'accensione del 3° Transistor TR3

In pratica invii (ed accendi) un solo numero per volta, alla frequenza di multiplexer.

Multiplexing significa che accendi un LED (segmento, non numero) per volta molto velocemente: il nostro occhio non 'tiene il ritmo' e sembra che tutti i segmenti siano illuminati.

Gestire due transistor? Per far cosa?
In generale, vorrai collegare una resistenza dal pin di Arduino alla base del transistor. Il collettore sarà collegato ai 5v (o 12v o qualsiasi cosa tu voglia controllare) con in serie l'apparecchio da accendere/spegnere. L'emettitore lo attacchi al GND :slight_smile:

Scusa se ti contraddico ma il multiplexing è anche un numero per volta.

Questo è un circuito miultiplexex di cui si può verificare un solo numero per volta:

Ciao bruser
Il multiplex si usa per diverse cose.
Il concetto é utilizzare una dispositivo per diverse cose in momenti diversi.
Nel caso di Display o matrici di LED accendi solo i led di un display alla volta e dopo passi al sucessivo. (come giá spiegato dagli altri).
Il vantaggio é che Ti servono meno piedini in confronto di pilotare ogni segmente/led singolarmente. 2 cifre 7 segmenti col punto decimale sono 24 LED. Col multiplexing servono 8 per i segmenti e 3 per definire quale segmento accendere. Il secondo vantaggi é risparmiare (in parte) corrente perché nel caso devi accendere tutti i segmenti compreso il punto decimale accendi solo 8 LED e non 24. In parte perché il led deve essere piú luminoso essendo acceso per meno tempo.

L' arduino ha un multiplexer incorporato nel controller. Il ATmega328 ha un unico convertitore analogico digitale ma ha 6 (8) entrate analogiche. Come funziona? Semplice: c'é un multiplexer che collega a necessitá una entrata dopo l'altra al convertitore. Cosí hai piu entrate analogiche, ma Ti serve solo 1 convertitore (risparmi transistori e percui il controller che diventa meno costoso). Lo svantaggio é che devi dividere le conversioni su tutte le entrate e percui puoi farne di meno nello stesso tempo.

Esistono altre strategie di multiplexing che non spiego in questo momento.

Ciao Uwe

Salve a tutti,
grazie per la tempestiva risposta.
Gli schemi sul come collegare i due display ad arduino, i sette fili in comune per i segmenti, e i transistor per i catodi comuni, li ci sono arrivato.
Quello che non capisco e non riesco a fare, e esattamente quello che BaBBuino; al livello pratico di codice scritto non capisco proprio come fare, ed e' per questo che vi chiedo aiuto.
Per pilotare un display, ho usato questo sketch preso da internet...

// Arduino 7 segment display example software
// http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html
// License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
 

// Define the LED digit patters, from 0 - 9
// Note that these patterns are for common cathode displays
// For common anode displays, change the 1's to 0's and 0's to 1's
// 1 = LED on, 0 = LED off, in this order:

// Arduino pin:                    2,3,4,5,6,7,8
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                 { 0,0,1,1,0,0,0 },  // = 1
                                 { 1,1,0,1,1,0,1 },  // = 2
                                 { 0,1,1,1,1,0,1 },  // = 3
                                 { 0,0,1,1,0,1,1 },  // = 4
                                 { 0,1,1,0,1,1,1 },  // = 5
                                 { 1,1,1,0,1,1,1 },  // = 6
                                 { 0,0,1,1,1,0,0 },  // = 7
                                 { 1,1,1,1,1,1,1 },  // = 8
                                 { 0,1,1,1,1,1,1 }   // = 9
                                };

void setup() {               
  pinMode(2, OUTPUT);  
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
   
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() {
  for (byte count = 10; count > 0; --count) {
   delay(100);
   sevenSegWrite(count - 1);
  }
  delay(1000);
}

...speranzoso che con qualche ora di studio sopra sarei riuscito a carpirna i segreti, ma nulla, sono solo riuscito a farlo funzionare col mio arduino. (il codice fa un countdown da 9 a 0 a loop)
Quindi se volete aiutarmi con indirizzi di post ed altro, e spiegazioni vostre in merito, io vi ringrazio.
A mia discolpa tengo a dire che sono un elettrotecnico, con la passione per l'elettronica (elettronico mancato, diciamo...)conosco molto poco la programmazione (riesco a grandi linee a fare un stupido programma per plc...), quindi molti concetti mi sono sconoscuti.
Grazie, Bruser

Non lo capisci il multiplexing del citato programma perché il programma non fa il multiplexing.
Il programma visualizza dei numeri uno dopo l' altro sullo stesso display.

Ciao Uwe

Salve,
So bene che il codice che ho riportato non fa il multiplexing, ho solo voluto far vedere quello che ho trovato per il momento, riguardante quello che voglio fare.
Fino adesso ho sempre fatto da solo consultando il foum e i blog in merito, ma in questi posti dannno per scontato che uno sappia anche farlo, quindi non spiegano nel dettaglio l'argomento. (ribadisco che quello che non capisco, e come scrivere il codice)
Grazie, Bruser.

spiegazione teorica del flusso del programma multiplex di un display a 7 segmenti a 3 cifre.

Dicciamo che hai 3 display a 7 segmenti a singola cifra con catodo comune.
Colleghi i segmenti a-g e dp di ciascun modulo insieme e con una resistenza da 1000 Ohm a 8 uscite Arduino per esempio D2 a D9.

I 3 catodi comuni li metti ciascuno a un uscita Arduino per esempio D10 a D12.
Definisci i Pin D2 a D9 come uscite e D10 a D12 come entrate.

Adesso ciclicamente metti in L o H le uscite D2 a D9 a secondo della cifra che vuoi visualizzare e uno pin collegato al catodo lo definisci come uscita e la metti a LOW. Si accenderá una cifra.
Aspetti il tempo necessario (diciamo se vuoi avere una ripetizione di 25 volte al secondo e ai 3 cifre ogni cifra puó essere accesa 1/ (25*3) percui ca 13 msec) definisci il pin del catodo come entrata e fai la stessa cosa per gli altri 2 cifre. Una volta finito con i 3 moduli riincominci da capo.

Ciao Uwe

Magari ti potrebbe interessare il progetto di un timer con 4 display a 7 segmenti, utile per fare un conto alla rovescia fino a 99 minuti e 99 secondi.
Quale applicazione migliore per vedere alla prova ben 4 display multiplexati?

Il progetto lo trovi qui:
http://www.electronicsblog.net/arduino-4-digits-7-segments-led-countdown-timer-with-buzzer/

Io stavo "provando" ad iniziare a costruirlo.

Ciao, dai uno sguardo a questi link :

http://www.eeng.biz/multiplex.htm
http://www.eeng.biz/7segmenti.htm

fanno riferimento ai PIC ma la logica è la stessa.

Ciao.

Salve,
grazie per le risposte, studiero' sui nuovi indirizzi che mi avete dato, e vi faro' sapere.
Grazie, Bruser

Salve,
sara' per il poco tempo, sara' per le festa, o piu' probabile perche' non ci arrivo, ma non riesco proprio.
Mi duole chiederlo, ma cortesemente qualcuno puo' farmi vedere un pezzo di codice per multiplexer?
Ne approfitto per un'altra domanda: posso interrompere una funzione "for" con un ingresso?
Grazie,Bruser

Leggi un po' questa pagina, vediamo se ti aiuta. E' molto semplice come codice:
http://www.electronicsblog.net/4-digits-7-segments-led-display-multiplexing-with-arduino/

Per la seconda domanda, la risposta è sì: semplicemente basta mettere una lettura del pin nel ciclo ed usare un break per uscire dal for.

Salve,
Grazie leo, ci riprovo...
Bruser

Salve,
Mi sorge una domanda guardando il codice consigliatomi da leo ( che poi e' lo stesso blog che mi aveva consigliato Systemystapazzo, devo stare piu' attento ai consigli che mi date...):
Quale' la differenza, vantaggi/svantaggi, di fare il contdown come nel mio caso (comando 'for') e con 'switch'?
Grazie, Bruser

// Define the LED digit patters, from 0 - 9
// Note that these patterns are for common cathode displays
// For common anode displays, change the 1's to 0's and 0's to 1's
// 1 = LED on, 0 = LED off, in this order:

// Arduino pin:                    2,3,4,5,6,7,8
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                 { 0,0,1,1,0,0,0 },  // = 1
                                 { 1,1,0,1,1,0,1 },  // = 2
                                 { 0,1,1,1,1,0,1 },  // = 3
                                 { 0,0,1,1,0,1,1 },  // = 4
                                 { 0,1,1,0,1,1,1 },  // = 5
                                 { 1,1,1,0,1,1,1 },  // = 6
                                 { 0,0,1,1,1,0,0 },  // = 7
                                 { 1,1,1,1,1,1,1 },  // = 8
                                 { 0,1,1,1,1,1,1 }   // = 9
                                };
         
int default_n=9;

void setup() {               
  pinMode(2, OUTPUT);  
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(13,INPUT);
  pinMode(12,INPUT);
}

void loop() {
  for (byte count = 10; count >0; --count) {
    while (digitalRead (13) == HIGH) {
    delay(100);
    sevenSegWrite(count - 1);
    (digitalRead (13) == LOW);
      break;
     }
  }
}

void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}