Leggere segnale Audio per vu meter

No, assolutamente non una questione economica.principalmente una questione di spazio, e poi pensavo che era un peccato buttare via tutti quei Pin considerando che me ne servono due in ingresso e uno in uscita. Infine anche per capire fin dove potevo spingere questo mini controllore…

... per divertimento puoi provare, così vedi fino a dove si può arrivare :wink:

Guglielmo

1 Like

Uno un uscita???... Un LED solo?... Allora non metterci nemmeno il microcontrollore!

Va bene! :grinning:

Sì perché comanderà la barra WS2812 che ha un solo pin data da cui prende i comandi

1 Like

A me fa più 《sorpresa》che siano due in ingresso

A cosa serve il secondo ?

Stereo?
Lavorando un po' col software, potresti metterci anche la memoria di picco...

Il codice sorgente, però, non c'è! :slight_smile:

Una cosa che non mi è mai piaciuta nelle memorie di picco è che molto semplicemente il picco viene aggiornato al livello corrente ogni 2 secondi, anche se in quell'instante il valore è più basso del picco. In un indicatore di modulazione (analogico, senza Arduino) per un trasmettitore, invece, misi un piccolo mosfet con un circuitino di controllo con un operazionale che azzera il conteggio dei 2 secondi ogni volta che il picco raggiunge il valore precedente. Questo, naturalmente, si può fare anche software con Arduino.

Un paio d'anni fa avevo cominciato a sciverne uno per 14+14 LED, ma è rimasto alla v0.1...
Avevo previsto, credo, due file di 14 LED da pilotare in rapida alternanza alimentando alternativamente i comuni delle due file. Se vuoi continuare il lavoro... :slight_smile:

uint16_t soglieLog[] = {11,  16,  22,  32,  45,  64,  90, 128, 181, 256, 361, 512, 723, 1023};
uint16_t soglieLin[] = {73, 146, 219, 292, 365, 438, 511, 584, 657, 730, 803, 876, 949, 1023};
uint16_t soglie[14];
byte modo=1; 
byte lum=5;
unsigned long t_comandi; // Legge le impostazioni dei comandi.
unsigned long t_aggiornamento; // Legge gli ingressi.

void setup()
{
// Imposta I/O 0...14 come 14+1 uscite:
for (int8_t i=14; i>=0; i--) {pinMode(i, OUTPUT);}
  
// Modo Barra (aperto) o Punto (a massa):
pinMode(A2, INPUT_PULLUP);

// Scala Log (aperto) o Lin (a massa):
pinMode(A3, INPUT_PULLUP);

// A0: a +5V: LED canale L.
// A1: a +5V: LED canale R.
// A2: aperto: Barra; a massa: Punto.
// A3: aperto: Log;   a massa: Lin.
// A4: In L
// A5: In R
// N.B.: per regolare la luminosità si può realizzare un PWM esterno per alimentare il comune dei LED.
}

void loop()
{
if(millis()-t_comandi>=500) // Legge i comandi 2 volte al secondo.
  {
  t_comandi=millis();
  stato_comandi();
  }

if(millis()-t_aggiornamento>=100) // Legge gli ingressi 10 volte al secondo.
  {
  t_aggiornamento=millis();
  aggiorna();
  }
}



void stato_comandi()
{
lum=analogRead(A1)/100;
if (digitalRead(A2)) modo=1; else modo=0; // 1: Barra.
if (digitalRead(A3)) // HIGH:Lin; (LOW:Log).
  {
  for(int8_t i=13; i>=0; i--)
    {
    soglie[i]=soglieLog[i]; // Alto: Logaritmico.
    }
  }
else
  {
  for(int8_t i=13; i>=0; i--)
    {
    soglie[i]=soglieLin[i]; // Basso: Lineare.
    }
  }
}

void pilota_led (byte n) // n da 0 a 13 accende; n=20 spegne tutto.
{
if (n==20) {PORTD = 0; PORTB &= 0b11000000;} // Spegne tutto.
else
  {           // --------- PORTA D --------- //
  for (int8_t i=7; i>=0; i--) // Accende o spegne i LED da 0 a 7: da D0 a D7.
    {
    if (i==n) PORTD |= 1<<i;         // Comunque accende il LED uguale a n.
    else if (i>n)  PORTD &= ~(1<<i); // Comunque spegne i LED superiori.
    else if (i<n) // LED inferiori a n:
      {
      if (modo) // Se modo=1 (Barra)
        {
        PORTD |= 1<<i;   // Accende anche i LED inferiori.
        }
      else // Se modo=0 (Punto)
        {
        PORTD &= ~(1<<i); // Spegne i LED inferiori.
        }
      } // END if (i<n)
    } // END for
              // --------- PORTA B --------- // 
  for (int8_t i=13; i>=8; i--) // Accende o spegne i LED da 8 a 13: da B0 a B5.
    {
    if (i==n) PORTB |= 1<<(i-8);         // Comunque accende il LED uguale a n.
    else if (i>n)  PORTB &= ~(1<<(i-8)); // Comunque spegne i LED superiori.
    else if (i<n) // LED inferiori a n:
      {
      if (modo) // Se modo=1 (Barra)
        {
        PORTB |= 1<<(i-8);   // Accende anche i LED inferiori.
        }
      else // Se modo=0 (Punto)
        {
        PORTB &= ~(1<<(i-8)); // Spegne i LED inferiori.
        }
      } // END if (i<n)
    } // END for
  } // END (n!=20)
}

void aggiorna()
{
uint16_t Lread = analogRead(A4);
uint16_t Rread = analogRead(A5);

for (int8_t i=13; i>=0; i--)
  {
  if (Lread>=soglie[i])
    {pilota_led(i);}
  }
}

La memoria di picco si può realizzare sia via software (ma devi fare anche il decadimento anti esponenziale...) oppure con altri due diodi ideali e due resistenze di scarica molto maggiori, per avere un decadimento molto più lento; poi leggi anche questi altri due valori e accendi i due led (uno per canale) relativi al valore.

Ciao, uno per canale destro e uno per canale sinistro

Davvero grazie mille per aver condiviso il codice. E tanto complesso per il mio livello attuale e spero di riuscire a farne buon uso!

Riusciresti a farmi capire meglio questa cosa… volevo successivamente aumentare la sensibilità con un potenziometro ma “grezzamente” avevo pensato: leggo il valore del potenziometro e lo mappavo con il valore letto della tensione dal segnale audio facendolo vedere più alto… non so se il mio gioco di parole si capisce…

Buonasera. Scusate se torno sull'argomento, ma non sono ancora riuscito a venire a capo per questo vu-meter. Io ho un uscita per altoparlanti e la mia radio non è dotata di uscita cuffie o aux. Gli schemi sono li stessi? Io non posso mettere la GND comune con l'altoparlante... ho provato a farlo visto che tutti gli schemi la portano comune ma il cavetto prende fuoco :slight_smile: credo sia dovuto alla tensione negativa che quando arriva fa una specie di corto o almeno solo questo mi è venuto in mente... Quindi mi trovo con uscita SPK + e - da portare nel diodo ideale e poi nell'op-amp ma non so da dove partire con il discorso del negativo, potreste aiutarmi a capire un pò meglio?
Grazie

Sai che il condensatore si lascia attraversare dalla corrente alternata (il segnale audio è alternato) ma non lascia passare la corrente continua?
Se hai un multimetro dovresti essere in grado di misurare la tensione continua che c'è tra +SPK e GND che dovrebbe essere circa 5 / 2 = 2.5V.
Quindi due condensatori da 1uF/16V uno su +SPK e uno su -SPK. I due terminali dei due condensatori negativi sono le uscite del segnale isolate dalla corrente continua. Ora non è ben presente qual'è il tuo circuito di amplificazione e non so che circuito vuoi usare parlando di Operazionale... boo forse il circuito di NE?

Operazionale???, bhe se c'è un operazionale questo lo si può configurare come amplificatore delle differenze, ma temo che sia impossibile guidarti in porto senza affondare. La soluzione più semplice che mi viene in mente e quella di usare due alimentatori separati, uno per arduino e l'altro per il lettore mp3.
Ciao.

Evidentemente l'uscita dell'amplificatore è a ponte. Mettendo un condensatore fra segnale e massa, cortocircuiterebbe comunque il segnale a massa! Basta collegare insieme le masse e prendere il segnale dall'uscita + oppure dall'uscita - tramite un condensatore con il negativo verso l'amplificatore, poi un diodo con anodo a massa e catodo verso il positivo del condensatore, un altro diodo con l'anodo sul positivo del condensatore e il catodo sul positivo di un secondo condensatore e il negativo di quest'ultimo a massa. Sul positivo di questo condensatore c'è la tensione per pilotare il vu meter tramite un partitore resistivo, perché potrà superare abbondantemente i 5V.
All'ingresso di questo vu meter vedi qualcosa di molto simile a quanto ti ho descritto:
https://www.narcisivalter.it/progetti/level-meter_16LED.html
Nota: C2 andrebbe collegato al contrario rispetto allo schema, però questo amplificatore tira fuori una continua, quindi va bene come nello schema.

Con il + collegato a +SPK (o -SPK), come nello schema che hai linkato:
PS: Quella rivista la ho in versione cartacea.

Ciao.

In quello schema C2 è disegnato con le polarità invertite per un uso generico, ma se l'amplificatore esce con una tensione continua va bene come è nello schema.

Stavo seguendo questo :
https://forum.arduino.cc/t/costruzione-vu-meter/904229
L’operazionale l’ho configurato come alla fine della discussione, credo come differenziale per spostare il segnale più sopra per evitare appunto i segnali negativi. Per sicurezza ho inviato anche un messaggio privato a faca87 e mi ha confermato che funzionava. L'unico dubbio era appunto questo negativo dell'uscita speaker in comune con la GND che mi ha fatto prendere fuoco al cavo...
Con il voltmetro se prelevo il + dell'uscita spk e il GND che non ho messo in comune con il negativo dello spk ho un oscillazione della tensione intorno ai 2,5V ma mai un valore negativo. Se il voltmetro lo metto tra il + e il - dell'uscita speaker il segnale oscilla anche in negativo ma è molto più piccolo, nella scala dei 200mA sul voltmetro. Anche volendo amplificare questo segnale ho sempre il problema di non capire come mettere in comune il negativo dello speaker con la GND per riportare tutto poi dentro arduino

Ma mettendo insieme le masse intendi il negativo dello speaker e la GND della radio? perchè cosi il cavo mi va in fumo...
Ho disegnato quello che hai scritto, o almeno spero di averlo disegnato giusto. Ho collegato il negativo dello spk e la massa in comune non sapendo se avevo capito bene e ho aggiunto uno zener da 4,7V per evitare di far salire la tensione sopra i 5V, ma cosi riuscirei a prendere il tutta l'onda del segnale audio senza utilizzare l'op amp ?

Lo schema è corretto, però non devi prelevare il -spk e se tua radio (posta qualche link così vediamo che amplificatore monta) è alimentata con un alimentazione in cui il negativo è in comune con la tensione con cui viene alimentato arduino, non serve altro collegamento.

Il chip LM3914 (LM3916) sono ancora in commercio, io li impiegherei al posto di dovere far fare cose che arduino fatica a fare.
https://learn.sparkfun.com/tutorials/dotbar-display-driver-hookup-guide/all

Ciao.