Distorsore per chitarra fai da te con ESP8266: costruzione, utilizzo e regolazione

Introduzione

Benvenuto nel mondo della personalizzazione sonora con la realizzazione di un distorsore per chitarra! Se sei un appassionato di chitarra elettrica e desideri esplorare nuovi orizzonti sonori, sei nel posto giusto. In questo articolo, ci immergeremo nella costruzione di un distorsore per chitarra fai-da-te, sfruttando la potenza dell’ESP8266. Questo progetto ti consentirà di plasmare il tuo suono, creando quell’effetto di distorsione iconico che caratterizza molte performance rock. Approfondiremo il processo di costruzione, esploreremo le modalità d’uso e scopriremo come regolare il distorsore per ottenere il sound perfetto. Se sei pronto a dare un tocco unico al tuo stile musicale, continuiamo insieme!

Questo distorsore ha anche una regolazione delle frequenze del segnale distorto. Per questa funzione ci serviremo del filtro passa basso descritto nell’articolo Ingegneria del suono: costruisci il tuo filtro passa basso con frequenza di taglio regolabile tramite potenziometro digitale che ti consiglio caldamente di leggere. Come al solito, per la stesura del firmware ci avvarremo dell’ottimo IDE PlatformIO.

In questo caso il filtro passa basso sarà regolabile non solo in frequenza di taglio ma anche in guadagno, sempre con delle API REST come nel caso dell’articolo citato.


Breve storia della distorsione della chitarra elettrica: un viaggio nel suono ribelle

La distorsione della chitarra elettrica è stata da sempre una parte intrinseca dell’evoluzione della musica rock. Risalendo agli anni ’40 e ’50, i musicisti iniziarono a cercare modi per ottenere un suono più aggressivo e potente dalle loro chitarre. Con l’avvento della tecnologia, nacquero i primi distorsori a valvole, come il Gibson Maestro FZ-1, che caratterizzò i suoni ribelli del rock ‘n’ roll di quegli anni.

Negli anni ’60, il suono distorto divenne una firma distintiva del rock psichedelico, con artisti come Jimi Hendrix che sperimentavano con feedback controllato e tonalità più pesanti. L’introduzione di pedali fuzz, come il leggendario Fuzz Face, contribuì a definire il suono psichedelico dell’epoca.

Negli anni ’70 e ’80, l’evoluzione degli amplificatori a transistor portò a una nuova generazione di distorsori più accessibili e portatili. Pedali iconici come il Pro Co Rat e l’Ibanez Tube Screamer divennero fondamentali per gli amanti dell’hard rock e dell’heavy metal.

Con l’avvento della tecnologia digitale negli anni ’90, furono sviluppati distorsori multi-effetto che offrivano una vasta gamma di suoni, consentendo ai chitarristi di personalizzare la propria distorsione. Oggi, grazie a progetti fai-da-te come il nostro distorsore con ESP8266, la ricerca del suono distorto perfetto continua, mantenendo viva la tradizione di esplorare nuovi orizzonti sonori nella storia della chitarra elettrica.

Questo progetto prevede l’utilizzo di amplificatori operazionali, potenziometri digitali e filtri, quindi partiremo con una loro breve descrizione.

Cosa è un amplificatore operazionale?

L’amplificatore operazionale (detto anche opamp) è un componente elettronico analogico a stato solido capace, come dice anche il suo nome, di amplificare un segnale elettrico. È definito operazionale perché è in grado di svolgere alcune operazioni matematiche in maniera totalmente analogica su segnali elettrici. Le operazioni generalmente possibili sono la somma, la sottrazione, la derivazione e l’integrazione, il logaritmo etc etc.
È anche parte fondamentale dei filtri attivi passa-basso, passa-alto, passa-banda, notch etc etc.

È dotato di due ingressi, uno invertente (indicato col segno -) e uno non invertente (indicato col segno +), e di una uscita. Viene alimentato, in genere, con una tensione duale (di solito indicata coi segni V+ e V).

Nel caso il segnale entri attraverso l’ingresso non invertente, il segnale di uscita si trova con la stessa fase del segnale di ingresso. Se invece il segnale entra nell’ingresso invertente, il segnale di uscita sarà in opposizione di fase (sfasato cioè di 180 gradi) rispetto al segnale in ingresso.

Un amplificatore invertente è, quindi, un amplifcatore operazionale il cui ingresso non invertente è collegato a massa mentre quello invertente è collegato alla sorgente di ingresso VINPUT.

Schema elettrico di un amplificatore operazionale in configurazione invertente
Schema elettrico di un amplificatore operazionale in configurazione invertente

Questo circuito prende il segnale al morsetto INPUT e lo ripropone in OUTPUT amplificato (cioè moltiplicato per un valore chiamato guadagno che indicheremo col simbolo G).

Quindi, in formula, abbiamo che:

VOUTPUT = G * VINPUT

Abbiamo detto che questo amplificatore inverte la fase del segnale di uscita rispetto alla fase del segnale in ingresso (i due segnali sono sfasati di 180°). Questo significa che il valore di G è negativo. Se per esempio il segnale in ingresso fosse amplificato di 10 volte, avremmo che G = -10 [V/V] e quindi:

VOUTPUT = -10 * VINPUT

Se, per esempio, il segnale VINPUT = 1V avremmo che VOUTPUT = -10 V mentre con VINPUT = -1 V avremmo VOUTPUT = 10 V.

In pratica il segnale in uscita è dato dal segnale di ingresso ingrandito di 10 volte e ribaltato.

NOTA: il guadagno, essendo il rapporto tra due tensioni

G = VOUTPUT / VINPUT

è espresso da un numero puro. Possiamo comunque esprimerlo, alternativamente, con la notazione [V/V] (che è sempre un numero puro).

Come si imposta il guadagno dell’amplificatore invertente?

Il guadagno è facilmente determinato a partire dai valori delle due resistenze R1 e R2. In particolare abbiamo che il guadagno, in valore assoluto, è dato da:

|G| = R2 / R1

Quindi, se avessimo R1 = 1 kΩ e R2 = 10 KΩ, avremmo che |G| = 10.

Considerando lo sfasamento di 180° abbiamo che

G = -R2 / R1

Con i valori dell’esempio precedente abbiamo che G = -10 [V/V].

Detto in altre parole:

VOUTPUT = -(R2 / R1) * VINPUT

cioè:

VOUTPUT = -10 * VINPUT

Il guadagno può essere anche espresso in dB (decibel) secondo la relazione:

GdB = 20 * log(|G|) = 20 * log(|-R2 / R1|) = 20 * log (R2 / R1)

Per esempio, se R1 e R2 fossero da 1 kΩ e 10 kΩ rispettivamente, si avrebbe G = -10 [V/V] e GdB = 20 dB. Se R1 e R2 fossero da 2 kΩ e 15 kΩ rispettivamente, si avrebbe G = -7.5 [V/V] e GdB = 17.5 dB.

Come funziona un potenziometro classico?

Un potenziometro è un dispositivo a 3 terminali usato come resistore variabile. E’ dotato di un contatto rotante comandato dalla manopola e viene usato come partitore di tensione.

Un classico potenziometro
Un classico potenziometro

Il suo simbolo elettrico è quello di una classica resistenza ma con il contatto intermedio comandato dalla manopola:

Il simbolo elettrico del potenziometro
Il simbolo elettrico del potenziometro

Come funziona un partitore di tensione?

Un partitore di tensione è un semplice circuito in cui la tensione in uscita è una frazione della tensione in ingresso. Si possono usare due resistori fissi oppure un potenziometro.

Vediamone lo schema e la formula:

Un semplice esempio di partitore di tensione realizzato con un potenziometro
Un semplice esempio di partitore di tensione realizzato con un potenziometro

Il potenziometro è indicato con la lettera P mentre R1 e R2 sono le due sezioni della resistenza totale che variano a seconda della posizione del cursore (che è comandato dalla manopola).

Come puoi osservare la tensione Vo di uscita è una frazione di quella di ingresso Vi. La Vo varia tra due estremi:

  • Vo = 0 quando R2 = 0 (la manopola è ruotata tutta verso il terminale collegato al polo negativo della batteria)
  • Vo = Vi quando R1 = 0 (la manopola è ruotata tutta verso il terminale collegato al polo positivo della batteria)

I potenziometri digitali

Questi esempi si basano su potenziometri meccanici ma esistono in commercio anche dei tipi di potenziometri che sono completamente elettronici e regolabili tramite un opportuno segnale in ingresso. Sono i cosiddetti potenziometri digitali.

Oggi vogliamo testarne uno comandandolo tramite ESP8266, in particolare il modello MCP41010, che è un singolo potenziometro. Il suo valore massimo è di 10 kΩ mentre il valore minimo è di circa 100Ω.

Un potenziometro digitale MCP41010
Un potenziometro digitale MCP41010

Vediamo ora il pinout di questo componente:

Pinout di un MCP41010
Pinout di un MCP41010

Il nome del dispositivo dipende dal massimo valore di resistenza del singolo potenziometro digitale e dal numero di potenziometri presenti al suo interno. Per esempio:

  • MCP41010: singolo potenziometro, 10 kΩ
  • MCP41050: singolo potenziometro, 50 kΩ
  • MCP41100: singolo potenziometro, 100 kΩ
  • MCP42010: due potenziometri indipendenti, 10 kΩ
  • MCP42050: due potenziometri indipendenti, 50 kΩ
  • MCP42100: due potenziometri indipendenti, 100 kΩ

Comanderemo il nostro potenziometro digitale attraverso la sua porta SPI opportunamente pilotatata dall’ ESP8266.

Osservando il datasheet del potenziometro digitale si può vedere come, per comandare questo chip, sia necessario mandargli prima un “command byte” (per dire al chip cosa deve fare) e poi un “data byte” (per dire al chip quale valore di resistenza settare, da 0 a 255).

Per esempio, per settare una resistenza di 10 kΩ, dobbiamo mandare un data byte pari a 11111111 (corrispondente a 255), per settare una resistenza di 5 kΩ dobbiamo mandare un data byte pari a 10000000 (corrispondente a 128) e così via.

Perché il comando venga eseguito, per prima cosa il terminale CS deve essere messo a 0 (valore LOW) poi bisogna mandare il command byte seguito dal data byte (per un totale di 16 bit). Infine bisogna riportare il terminale CS al valore 1 (valore HIGH). Solo allora il comando verrà eseguito (dal datasheet:”Executing any command is accomplished by setting CS low and then clocking-in a command byte followed by a data byte into the 16-bit shift register. The command is executed when CS is raised.”)

Abbiamo già affrontato l’uso di uno di questi potenziometri digitali negli articoli Come controllare un potenziometro digitale con Arduino UNO e Come controllare un amplificatore operazionale invertente usando Arduino UNO e un potenziometro digitale di cui ti consiglio la lettura.

Il diodo


Il diodo è un dispositivo elettronico a due terminali che consente il passaggio di corrente in una sola direzione, bloccandola in direzione opposta. La sua caratteristica principale è la giunzione p-n, una regione di materiale semiconduttore in cui gli atomi sono drogati con impurità per creare un eccesso o una carenza di portatori di carica. Quando una tensione positiva viene applicata al terminale anodico (p), e negativa al terminale catodico (n), la giunzione p-n è in polarizzazione diretta, consentendo il libero flusso di portatori di carica e quindi creando una bassa resistenza. Inversamente, quando la polarizzazione è inversa, la giunzione si comporta come una barriera elettrica, impedendo il flusso di corrente. Questa caratteristica di conduzione unidirezionale rende il diodo essenziale in molte applicazioni, tra cui raddrizzatori di corrente alternata, circuiti di protezione e logica digitale.

Il diodo, quindi, è un componente elettronico fondamentale, svolge un ruolo cruciale in numerosi circuiti elettronici, inclusi quelli dedicati all’arte dell’amplificazione e della distorsione del suono, come nel caso dei distorsori per chitarra.

La proprietà di condurre corrente in un solo senso rende il diodo un elemento ideale per controllare il flusso elettrico e svolge un ruolo chiave nella creazione di effetti sonori desiderati.

Nei circuiti di distorsione, i diodi vengono spesso utilizzati per introdurre il fenomeno del “clipping”, ovvero il taglio dell’ampiezza del segnale. Ciò avviene quando il segnale supera una certa soglia, creando una forma d’onda distorta, più o meno squadrata, che conferisce al suono una qualità unica e ricca di armoniche.

In sostanza, il diodo è una sorta di valvola elettronica moderna, che consente o blocca il flusso di corrente in base alle esigenze del circuito. La sua versatilità e il controllo preciso del flusso elettrico lo rendono uno strumento indispensabile nell’elettronica e nella progettazione di dispositivi musicali, contribuendo all’espressione artistica attraverso la modulazione del suono.

Il diodo ha sul suo contenitore una banda di diverso colore da quello del contenitore (per esempio nera o grigia) in corrispondenza del catodo. Per esempio, questo modello di 1N4148 ha una banda nera per contraddistinguere il catodo:

Un diodo 1N4148
Un diodo 1N4148

Il transistor


Il transistor è un dispositivo a tre terminali che svolge un ruolo cruciale nell’amplificazione e nel controllo del flusso di corrente in un circuito elettronico. Basato su materiali semiconduttori, il transistor è composto da due giunzioni p-n e opera attraverso processi di amplificazione di corrente. I suoi terminali sono denominati Emettitore, Base e Collettore. La modalità di funzionamento fondamentale prevede l’applicazione di una piccola tensione variabile nel tempo alla giunzione di base-emettitore, determinando un flusso di corrente tra il collettore e l’emettitore relativamente grande, che segue le variazioni del segnale in ingresso. Nella configurazione di tipo NPN, la corrente fluisce dalla base all’emettitore, controllando così la corrente più ampia che scorre tra collettore ed emettitore. Questa proprietà permette al transistor di agire come un amplificatore di segnali. Inoltre, nell’elettronica digitale viene usato come interruttore controllato. La sua versatilità rende i transistor fondamentali per applicazioni in elettronica analogica e digitale, inclusi circuiti integrati, amplificatori audio, e logica digitale nei dispositivi elettronici moderni.

Il transistor è una pietra miliare nell’evoluzione dell’elettronica, svolgendo ruoli chiave nella creazione di amplificatori e distorsori, strumenti essenziali nell’ambito musicale.

La sua capacità di amplificare un segnale elettrico lo rende fondamentale in applicazioni audio. Tra le varie configurazioni, quella ad emettitore comune è spesso impiegata in circuiti di distorsione.

Nel contesto dei distorsori per chitarra, il transistor, in particolare nella configurazione ad emettitore comune, agisce come un amplificatore a guadagno elevato. Quando il segnale di ingresso supera una certa soglia, il transistor raggiunge la sua saturazione, generando un effetto di “clipping” che contribuisce alla distorsione del suono. Questa saturazione provoca una forma d’onda distorta, ricca di armoniche, dando alla chitarra quel suono caratteristico e potente.

In sintesi, il transistor è l’architetto dell’amplificazione e della distorsione, svolgendo un ruolo fondamentale nella trasformazione del segnale audio grezzo in una potente espressione sonora. La sua versatilità lo rende uno strumento indispensabile per gli appassionati di musica elettrica che cercano di plasmare il proprio suono unico e inconfondibile.

I transistor hanno svariati tipi di “case” (contenitore) che dipendono dall’impiego che hanno (transistor di segnale, transistor di potenza, transistor per alta tensione e così via). In generale non c’è un modo per individuare a vista i tre terminali Emettitore, Base e Collettore quindi ci si affida ai datasheet che riportano questa informazione (oltre a tutte le caratteristiche elettriche, termiche e meccaniche del dispositivo).

Partiamo con un po’ di teoria

I Sistemi Lineari Tempo Invarianti (SLTI)

Lo studio dei sistemi lineari tempo invarianti (SLTI) è fondamentale nell’ambito dell’ingegneria elettronica e del controllo, poiché fornisce un approccio sistemico all’analisi e al design di sistemi dinamici. Un sistema è considerato LTI se soddisfa due proprietà fondamentali: linearità e invarianza nel tempo. La linearità implica che il sistema rispetti il principio di sovrapposizione degli effetti, mentre l’invarianza nel tempo indica che la risposta del sistema non cambia nel tempo, purché l’ingresso rimanga invariato. Due rappresentazioni comuni di tali sistemi sono la risposta all’impulso e la funzione di trasferimento.

Risposta all’Impulso

La risposta all’impulso è una caratteristica fondamentale di un sistema dinamico LTI ed è definita come la risposta del sistema a un impulso unitario, noto anche come delta di Dirac (indicato con δ(t)). Quindi, se in ingresso ad un sistema SLTI pongo un impulso di Dirac, ottengo la risposta del sistema a quell’impulso, che indicherò con la funzione h(t):

blank

Se h(t) è la risposta all’impulso di un sistema LTI, allora la risposta y(t) del sistema a un qualsiasi ingresso x(t) può essere ottenuta calcolando la convoluzione fra l’ingresso e la risposta all’impulso:

blank

Quindi, tornando agli schemi a blocchi, avremo che:

blank

dove l’uscita y(t) è, come detto prima, la convoluzione tra l’ingresso x(t) e la risposta all’impulso h(t) (calcolata con l’integrale di sopra).

L’operazione di convoluzione si indica col simbolo * quindi possiamo scrivere che y(t) = x(t) * h(t).

In sostanza, la risposta all’impulso h(t) di un SLTI è la funzione che caratterizza il comportamento del sistema nel dominio del tempo.

Funzione di Trasferimento

La funzione di trasferimento, spesso indicata con H(s) nel dominio di Laplace, è un modo alternativo di descrivere un sistema LTI. Essa rappresenta il rapporto tra la trasformata di Laplace della risposta Y(s) e quella dell’ingresso X(s). In pratica è la trasformata di Laplace della risposta all’impulso h(t):

blank

Graficamente rappresenteremo il nostro sistema in questo modo:

blank

La funzione di trasferimento è utile perché semplifica l’analisi dei sistemi in frequenza. Giusto per fare un esempio, la convoluzione (operazione non semplicissima) si trasforma in una semplice moltiplicazione. Quindi, nel mondo di Laplace avremo che la relazione precedente si trasforma in

Y(s) = X(s) H(s).

I poli (radici del denominatore) e gli zeri (radici del numeratore) della funzione di trasferimento forniscono informazioni cruciali sulla stabilità e la risposta in frequenza del sistema.

La funzione H(s) è una funzione di variabile complessa. Infatti la variabile s, detta variabile di Laplace, è una variabile complessa (dotata cioè di parte reale e parte immaginaria) e si rappresenta così: s = α + jω (con α e ω reali). Per α = 0 si ha s = jω. In questo caso la funzione di trasferimento dipende quindi dalla sola pulsazione ω, si ha cioè H(ω) dove la pulsazione è legata alla frequenza dalla relazione ω = 2πf. Il modulo e la fase di H(ω) saranno funzioni di ω. Essa caratterizza quindi il comportamento del sistema nel dominio della frequenza.

Risposta in frequenza di un SLTI

Un aspetto chiave dello studio dei sistemi LTI è l’analisi della loro risposta in frequenza. Questa analisi coinvolge la valutazione di come il sistema risponde a segnali sinusoidali a diverse frequenze. Il modulo e la fase della funzione di trasferimento sono usualmente rappresentati graficamente tramite il diagramma di Bode, fornendo una chiara visione delle caratteristiche di attenuazione e fase del sistema in funzione della frequenza.

Breve teoria del filtro passa basso

Un filtro passa basso del primo ordine è un semplice circuito elettronico o, più in generale, un sistema dinamico caratterizzato da una frequenza di taglio che rappresenta il punto in cui il segnale inizia ad essere attenuato. La funzione di trasferimento H(s) di un filtro passa basso del primo ordine nel dominio di Laplace è espressa come:

blank

dove:

  • K rappresenta il guadagno statico del filtro, ovvero il valore del guadagno quando la frequenza tende a zero
  • s è la variabile complessa della trasformata di Laplace
  • T è la costante di tempo del sistema

La costante di tempo T è inversamente proporzionale alla frequenza di taglio fc​, e la relazione tra loro è data da:

blank

Il filtro passa basso del primo ordine agisce come un circuito RC, dove R è la resistenza e C è la capacità. La funzione di trasferimento può anche essere scritta nel dominio del tempo come risposta impulsiva del sistema h(t) (cioè calcolando l’antitrasformata di Laplace della funzione di trasferimento H(s)):

blank

dove:

  • t è il tempo
  • e è la base del logaritmo naturale

La risposta in frequenza del filtro passa basso del primo ordine indica che attenua gradualmente le frequenze superiori alla frequenza di taglio. Questo comportamento può essere visualizzato nel dominio della frequenza attraverso il diagramma di Bode, dove il modulo della funzione di trasferimento decresce con una pendenza di -20 dB/decade, mentre la fase varia da 0° a -90°.

Diagramma di Bode per K = 1 e differenti valori della frequenza di taglio

Diagramma di Bode (solo modulo)
Diagramma di Bode (solo modulo)

In generale, il filtro passa basso del primo ordine trova ampio utilizzo in diverse applicazioni, inclusi circuiti audio, sistemi di controllo, elettronica di potenza e altro ancora. La sua semplicità lo rende una scelta comune per il filtraggio di segnali con esigenze di attenuazione relativamente basse alle frequenze più elevate.

Il filtro passa basso realizzato con amplificatore operazionale

Come già visto, un filtro passa basso è un circuito elettronico progettato per consentire il passaggio di segnali a bassa frequenza mentre attenua quelli a frequenza più elevata. Questo tipo di filtro è fondamentale in diverse applicazioni audio e elettroniche, in quanto consente di isolare e concentrarsi sulle componenti di bassa frequenza di un segnale. Nel contesto dell’ingegneria del suono, i filtri passa basso vengono spesso utilizzati per eliminare o ridurre le frequenze indesiderate e per concentrarsi sulla riproduzione dei toni più profondi e risonanti di un suono. Sono essenziali anche in sistemi di comunicazione, dove la separazione delle frequenze è cruciale per garantire una trasmissione chiara e priva di interferenze. Grazie alla loro versatilità, i filtri passa basso trovano impiego in una vasta gamma di dispositivi, dalla progettazione di altoparlanti e amplificatori audio a quella di circuiti di elaborazione del segnale elettronico.

Ovviamente, oltre ai filtri passa basso esistono anche i filtri passa alto, i filtri passa banda e i filtri elimina banda.

La frequenza di taglio in un filtro passa basso è il punto critico in cui il filtro inizia ad attenuare le frequenze del segnale. Si tratta della frequenza alla quale il segnale inizia a essere ridotto, e al di sotto di questa frequenza il filtro consente il passaggio quasi completo delle componenti di bassa frequenza. In un filtro passa basso ideale, al di sopra della frequenza di taglio, il segnale viene attenuato gradualmente, raggiungendo infine un punto in cui le frequenze più elevate vengono drasticamente ridotte.

La frequenza di taglio è un parametro chiave nella progettazione di filtri passa basso, poiché determina la gamma di frequenze che verranno mantenute o attenuate. Regolando la frequenza di taglio, è possibile adattare il filtro alle specifiche esigenze dell’applicazione, consentendo un controllo preciso sulla riproduzione delle frequenze nel segnale audio o elettronico. La corretta impostazione della frequenza di taglio è fondamentale per ottenere il risultato desiderato nel filtraggio del segnale.


Un filtro passa basso del primo ordine può essere realizzato utilizzando un amplificatore operazionale in configurazione invertente insieme a un componente reattivo, come un condensatore. Questo tipo di filtro è noto anche come filtro RC a un polo, poiché coinvolge un solo componente reattivo. La configurazione tipica di un filtro passa basso del primo ordine con un amplificatore operazionale è chiamata filtro RC passa basso.

Nel filtro RC passa basso, il condensatore è collegato tra l’ingresso invertente dell’amplificatore operazionale e la sua uscita. La resistenza è collegata all’ingresso invertente e al terminale di uscita dell’amplificatore (in parallelo al condensatore). La frequenza di taglio del filtro è determinata dalla relazione tra la resistenza (R) e la capacità (C) secondo la formula:

fc = 1/(2πRC)

Dove:

  • fc è la frequenza di taglio,
  • R è la resistenza,
  • C è la capacità.

Qui sotto vediamo un esempio di filtro passa basso del primo ordine realizzato con un amplificatore operazionale in configurazione invertente:

Schema di base di un filtro passa basso del primo ordine realizzato con un amplificatore operazionale in configurazione invertente
Schema di base di un filtro passa basso del primo ordine realizzato con un amplificatore operazionale in configurazione invertente

In questo caso le due resistenze hanno valore, in generale, diverso (a differenza del caso presentato nell’articolo Ingegneria del suono: costruisci il tuo filtro passa basso con frequenza di taglio regolabile tramite potenziometro digitale dove R1 = R2). Ciò ci consente di regolare sia la frequenza di taglio sia il guadagno del filtro. Infatti, la funzione di trasferimento H(s) di tale filtro è data da:

blank

che, nella forma più generale possiamo esprimere come:

blank

Quindi, il rapporto (cambiato di segno) tra R2 e R1 rappresenta il guadagno mentre il prodotto fra R2 e C rappresenta la costante di tempo, come indicato nella seguente immagine:

blank

Ti ricordo che il segno (meno) indica che stiamo invertendo la fase (l’amplificatore operazionale è in configurazione invertente). La costante di tempo C R2 è inversamente proporzionale alla pulsazione (e quindi alla frequenza).

Quindi, per prima cosa si stabilisce la frequenza di taglio dando un opportuno valore alla R2 (supponendo di aver già stabilito il valore per C che comunque rimane costante), dopo di che si stabilisce un opportuno valore di R1 per avere il guadagno desiderato.

In questo caso, il guadagno in tensione, a meno del segno, è pari a R2/R1 [V/V] per le frequenze abbastanza inferiori alla frequenza di taglio fc e, man mano che la frequenza aumenta, diminuisce gradualmente. Questo tipo di filtro offre un’attenuazione di 20 dB/decade per frequenze in ingresso al di sopra della frequenza di taglio.

La configurazione del filtro passa basso del primo ordine con amplificatore operazionale offre una soluzione semplice e efficace per ottenere un’attenuazione graduale delle alte frequenze, ed è ampiamente utilizzata in applicazioni audio e di elaborazione del segnale.

Descrizione del distorsore

Questo distorsore per chitarra si compone essenzialmente di tre parti:

  • OPZIONALE: un pedale preamplificatore da anteporre allo stadio al secondo punto nel caso l’ampiezza del segnale proveniente dai pick-up della chitarra fosse particolarmente bassa
  • un primo stadio di ingresso che riceve il segnale dai pick-up della chitarra, lo amplifica e lo squadra
  • uno stadio adattatore di impedenza
  • un filtro passa basso con amplificatore operazionale in configurazione invertente che abbiamo già incontrato dell’articolo Ingegneria del suono: costruisci il tuo filtro passa basso con frequenza di taglio regolabile tramite potenziometro digitale con la differenza che in questo filtro, oltre che modificare la frequenza di taglio, è possibile variarne il guadagno in modo da dare più libertà di regolazione al chitarrista

Il primo stadio

Il primo stadio è il distorsore vero e proprio e possiamo osservarlo nello schema seguente:

Schema elettrico del primo stadio
Schema elettrico del primo stadio

La configurazione dell’amplificazione con transistor seguita dai diodi rappresenta una strategia ampiamente impiegata nell’universo delle chitarre rock per ottenere quel distintivo e potente suono “crunchy”. Questa configurazione sfrutta un transistor, spesso del tipo 2N2222 ad emettitore comune, come stadio iniziale di amplificazione. In questa fase, il segnale proveniente dalla chitarra elettrica subisce un’ amplificazione significativa, creando un’iniziale saturazione del segnale.

Lo schema è stato realizzato tramite LTSpice per fare qualche simulazione. In pratica abbiamo un transistor 2N2222 che riceve il segnale dal condensatore C4 e lo ripropone, fortemente amplificato, sul suo collettore. Il transistor è in configurazione ad emettitore comune, quindi inverte la fase del segnale. La retroazione tramite la resistenza R9 da 2.2MΩ determina un forte guadagno in questo stadio. Questo perchè deve amplificare i deboli segnali prodotti dai pick-up e portarli almeno ad un livello tale da essere poi trattati dai componenti successivi (i diodi). I diodi operano la vera e propria distorsione. Questi diodi agiscono come elementi di clipping, limitando l’ampiezza del segnale e generando così la distorsione desiderata. Come noterai, essi sono collegati in antiparallelo. Tipicamente un diodo fa passare la corrente solo in un senso (quando il potenziale sull’anodo è maggiore di quello sul catodo) mentre la blocca con polarizzazione opposta. Quindi, quando sul terminale OUT c’è una semionda positiva, il diodo D1 entra in conduzione mentre il D2 è interdetto (non conduce). Quando c’è una semionda negativa le parti si invertono: D1 è interdetto e D2 conduce. Questi due diodi di tipo 1N4148 sono al silicio, il che significa che quando conducono hanno una caduta di tensione di circa 0.6V/0.7V. Quindi le due semionde positiva e negativa vengono “tosate” a quel livello. Una sinusoide, per esempio, viene ridotta ad un’onda quadra di ampiezza di circa 0.6V/0.7V (per ciascuna semionda). Volendo accentuare la distorsione, si possono mettere diodi diversi, per esempio un diodo al silicio come l’1N4148 in un ramo e un diodo al germanio (come l’1N34a) nell’altro ramo (mantenendolo in antiparallelo). Questo perchè i diodi al germanio hanno una caduta di tensione di circa 0.2V/0.3V. Ne risulta un’onda quadra asimmetrica (con una semionda di 0.6V/0.7V e l’altra semionda di 0.2V/0.3V) aumentando ancora di più la distorsione.

Nel caso il segnale proveniente dai pick-up fosse troppo debole, si può anteporre all’ingresso un piccolo preamplificatore.

Il secondo stadio

Segue uno stadio adattatore di impedenza. Come noterai è costituito da un operazionale in configurazione invertente ma con guadagno unitario (le due resistenze sono uguali). Ciò significa che l’ampiezza del segnale rimane inalterata (ma non la fase che viene invertita). Questo stadio viene messo per adattare l’impedenza tra l’uscita del distorsore e l’ingresso del filtro. Questo perchè, a seconda di come è regolato, l’impedenza di ingresso del filtro può essere anche molto bassa (qualche decina di Ω) e questo fatto, se non ci fosse l’adattatore di impedenza, annullerebbe il debole segnale proveniente dai diodi. Invece, con lo schema attuale, i diodi (e quindi l’uscita del distorsore) “vedono” sempre un’impedenza costantemente uguale a 82kΩ.

In figura ne vediamo una rappresentazione:

Schema elettrico adattatore di impedenza
Schema elettrico adattatore di impedenza

Il terzo stadio

Esso consiste di un filtro passa basso con amplificatore operazionale in configurazione invertente che abbiamo già incontrato dell’articolo Ingegneria del suono: costruisci il tuo filtro passa basso con frequenza di taglio regolabile tramite potenziometro digitale.

Questo filtro però è stato leggermente modificato. Nel filtro dell’articolo citato, i potenziometri digitali sono regolati in modo da avere sempre lo stesso valore tra loro. Questo perché il terminale CS (chip select) di entrambi è collegato allo stesso GPIO della ESP8266. In questo modo con la loro variazione si può regolare la frequenza di taglio del filtro ma non il suo guadagno (che rimane sempre pari a 0dB per le frequenze molto al di sotto della frequenza di taglio).

Nel filtro attuale i due potenziometri digitali sono stati resi indipendenti (cioè i loro terminali CS fanno capo a due differenti GPIO dell’ESP8266) in modo da poter regolare non solo la frequenza di taglio ma anche il guadagno, dando molte più possibilità al chitarrista di regolare il tipo di suono del distorsore.

Nella figura seguente possiamo vedere lo schema elettrico completo:

Schema elettrico completo
Schema elettrico completo

A seguire una simulazione eseguita tramite LTSpice per vari valori della frequenza di taglio e del guadagno del filtro:

Simulazione eseguita per vari valori della frequenza di taglio e del guadagno del filtro
Simulazione eseguita per vari valori della frequenza di taglio e del guadagno del filtro

Aggiunta di un controllo remoto

Come facciamo a comandare i vari parametri del filtro collegato al distorsore? Come già anticipato nell’introduzione, possiamo sfruttare la capacità dell’ESP8266 di collegarsi al WiFi e di essere comandata tramite delle API REST. Ciò ci consente di inserire il nostro distorsore in un sistema più ampio e complesso dove moduli di questo genere vengono controllati e impostati in tempo reale da appositi programmi in modo da generare effetti diversi. Abbiamo già affrontato il discorso sulle API REST nell’articolo Come realizzare un server API REST con la ESP32 quindi ti consiglio di andare a dargli un’occhiata. Anche se lì si parla di ESP32 la base concettuale non cambia.

Come già evidenziato nell’articolo citato, le API REST sono un modo per far comunicare dispositivi diversi fra loro oppure per consentirci di interagirci. Nello sketch che useremo in questo articolo creeremo un server web con la ESP8266 in modo che questa esponga un set di API REST. Possiamo utilizzare queste API REST per interagire con la ESP8266 in modo da ricevere dati dal filtro o mandare dati verso il filtro. In particolare manderemo un valore compreso fra 0 e 255 per settare la resistenza di uno dei due potenziometri digitali con una POST per settare la frequenza di taglio del filtro e un altro valore, sempre compreso fra 0 e 255 con la stessa POST per regolare il guadagno del filtro. Nel caso volessimo ottenere i valori di frequenza di taglio, del corrispondente valore di resistenza e il codice tra 0 e 255 assegnato al guadagno useremmo un’opportuna API GET.

L’API di tipo GET avrà questo aspetto:

http://IP_ESP8266/getValues

ed invierà come risposta un file Json fatto così:

[
    {
        "name": "cutoffFrequency",
        "value": 338799.2813,
        "unit": "Hz"
    },
    {
        "name": "cutoffResistance",
        "value": 10,
        "unit": "Ω"
    },
    {
        "name": "gainCode",
        "value": 0,
        "unit": ""
    }
]

dove IP_ESP8266 è l’indirizzo IP assegnato alla board dal router, cutoffFrequency rappresenta il valore della frequenza di taglio calcolata mentre cutoffResistance rappresenta il valore della resistenza del potenziometro digitale corrispondente. Il valore gainCode è compreso tra 0 e 255 e regola corrispondentemente il potenziometro digitale che imposta il guadagno del filtro.

L’API di tipo POST ha questo aspetto:

http://IP_ESP8266/setCutoffFrequency

ed invierà alla nostra ESP8266 un file Json fatto così:

{
        "resistanceFrequencyCode": "1",
        "gainCode": "25"
}

dove IP_ESP8266 è l’indirizzo IP assegnato alla board dal router, resistanceFrequencyCode rappresenta il valore compreso fra 0 e 255 per settare la resistenza del potenziometro digitale che regola la frequenza mentre gainCode, compreso tra 0 e 255, regola corrispondentemente il potenziometro digitale che imposta il guadagno del filtro.

Per interagire con la ESP8266 tramite le API REST useremo un programma che si chiama Postman, di cui vedremo l’uso più avanti.

Anche per questo esempio realizzeremo il progetto utilizzando l’IDE PlatformIO.

Di che componenti abbiamo bisogno?

La lista dei componenti non è particolarmente lunga:

  • due breadboard per connettere la NodeMCU ESP8266 agli altri componenti
  • alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
  • 3 resistori da 47kΩ
  • 2 resistori da 10Ω
  • 2 resistori da 82kΩ
  • un resistore da 680Ω
  • un resistore da 2.2MΩ
  • 6 condensatori da 47nF
  • 2 diodi 1N4148 (o, in alternativa, un diodo 1N4148 e un diodo 1N34a)
  • un transistor 2N2222
  • un amplificatore operazionale LM833
  • due potenziometri digitali MCP41010
  • 2 connettori per batteria da 9V
  • 2 batterie da 9V
  • e, ovviamente, una scheda NodeMCU ESP8266 !

Realizzazione del progetto

Lo schema elettrico

Prima di realizzare il circuito vero e proprio diamo un’occhiata al pinout della board:

Pinout del NodeMCU ESP8266
Pinout del NodeMCU ESP8266

Vediamo ora lo schema elettrico Fritzing del progetto:

Lo sketch

Creiamo il progetto PlatformIO

Abbiamo già visto la procedura di creazione di un progetto PlatformIO nell’articolo Come creare un progetto per NodeMCU ESP8266 con PlatformIO.

Non installare le librerie indicate nell’articolo in quanto non useremo alcuna libreria.

Ora modifica il file platformio.ini per aggiungere queste righe:

monitor_speed = 115200
upload_speed = 921600
lib_deps = 
	bblanchon/ArduinoJson@^6.21.0
	https://github.com/tzapu/WiFiManager.git

in modo che abbia un aspetto del genere:

[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
upload_speed = 921600
lib_deps = 
	bblanchon/ArduinoJson@^6.21.0
	https://github.com/tzapu/WiFiManager.git

Ovviamente puoi scaricare il progetto dal link seguente:

Sostituisci il file main.cpp del progetto che hai creato con quello presente nel file zip.

Vediamo ora come funziona lo sketch.

Si inizia con l’inclusione della solita libreria Arduino.h e delle librerie per la gestione del webserver e del WiFi:

#include <Arduino.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
#include <WiFiManager.h>

Vengono poi definiti i GPIO di controllo dei potenziometri digitali:

int CS_signal_frequency = D2;                      // Chip Select signal frequency on pin D2 of ESP8266
int CS_signal_gain = D1;                      // Chip Select signal gain on pin D1 of ESP8266

int CLK_signal = D4;                     // Clock signal on pin D4 of ESP8266
int MOSI_signal = D5;                    // MOSI signal on pin D5 of ESP8266

e il command byte (di cui abbiamo parlato nel paragrafo dedicato ai potenziometri digitali) assieme al valore di inizializzazione:

byte cmd_byte2 = B00010001 ;            // Command byte
int initial_value = 0;                // Setting up the initial value

Vengono poi definiti altri due parametri:

#define RESISTANCE_STEP 30.5
double CAPACITY = 0.000000047;

Il CAPACITY è banalmente il valore del condensatore di retroazione (quello da 47nF) espresso in Farad (ci serve per il calcolo della frequenza di taglio).

Il parametro RESISTANCE_STEP è un parametro sperimentale. In realtà il valore massimo misurato sui potenziometri digitali MCP41010 si è rivelato diverso da 10kΩ (li ho misurati ponendo il valore di controllo al suo massimo, cioè 255) ma molto più prossimo a 7.8KΩ. Quindi lo step di incremento di resistenza non è dato (almeno nel mio caso) da 10000Ω/256 cioè circa 39Ω ma da 7800Ω/256 cioè circa 30.5Ω

Prova anche tu a misurare il valore massimo della resistenza dei potenziometri digitali (mandando loro tramite la porta SPI il valore 255) per vedere se corrisponde ai 10kΩ del datasheet e poi dividi il valore trovato per 256 in modo da avere il vero valore di RESISTANCE_STEP.

NOTA: è ovvio che se tra il cursore del potenziometro digitale e uno degli altri due terminali il valore di resistenza è massimo, tra il cursore e l’altro terminale il valore è nullo (o quasi).

Vengono poi definite le seguenti variabili che rappresentano i valori della frequenza di taglio e della corrispondente resistenza:

float cutoffFrequency;
float cutoffResistance;

Vengono definite poi le variabili

unsigned long measureDelay = 500;        // 0.5 seconds        
unsigned long lastTimeRan;

che decidono ogni quanto tempo la funzione loop deve comandare i potenziometri digitali.

Successivamente viene instanziato il server in ascolto sulla porta 80, viene definito un documento Json, un buffer da 1024 caratteri, la variabile che conterrà il codice (compreso fra 0 e 255) che imposterà la resistenza del potenziometro digitale che varierà la frequenza di taglio e quella che che conterrà il codice (compreso fra 0 e 255) che imposterà la resistenza del potenziometro digitale che varierà il guadagno del filtro:

// Web server running on port 80
ESP8266WebServer server(80);

StaticJsonDocument<1024> jsonDocument;

char buffer[1024];

int resistanceFrequencyCode = 0;
int gainCode = 0;

Segue la funzione handlePost che gestisce l’ API di tipo POST (adattata per i codici della frequenza di taglio e del guadagno):

void handlePost() {
  if (server.hasArg("plain") == false) {
    //handle error here
  }
  String body = server.arg("plain");
  deserializeJson(jsonDocument, body);
  
  // Get code for resistance
  resistanceFrequencyCode = jsonDocument["resistanceFrequencyCode"];
  gainCode = jsonDocument["gainCode"];

  // Respond to the client
  server.send(200, "application/json", "{}");
}

e le funzioni createJson, addJsonObject, getValues che gestiscono il documento Json e restituiscono, a seguito di richiesta GET, i valori di cutoffFrequency , cutoffResistance e gainCode:

void createJson(char *name, float value, char *unit) {  
  jsonDocument.clear();
  jsonDocument["name"] = name;
  jsonDocument["value"] = value;
  jsonDocument["unit"] = unit;
  serializeJson(jsonDocument, buffer);  
}

void addJsonObject(char *name, float value, char *unit) {
  JsonObject obj = jsonDocument.createNestedObject();
  obj["name"] = name;
  obj["value"] = value;
  obj["unit"] = unit;  
}

void getValues() {
  Serial.println("Get all values");
  jsonDocument.clear(); // Clear json buffer
  addJsonObject("cutoffFrequency", cutoffFrequency, "Hz");
  addJsonObject("cutoffResistance", cutoffResistance, "Ω");
  addJsonObject("gainCode", gainCode, "");
  serializeJson(jsonDocument, buffer);
  server.send(200, "application/json", buffer);
}

Segue la funzione setupApi che instrada gli url /getValues e /setCutoffFrequency verso le funzioni appropriate e inizializza il server:

void setupApi() {
  server.on("/getValues", getValues);
  server.on("/setCutoffFrequency", HTTP_POST, handlePost);
 
  // start server
  server.begin();
}

Seguono le funzioni spi_transfer e spi_out che gestiscono la trasmissione attraverso la porta SPI

void spi_transfer(byte working) {
    for(int i = 1; i <= 8; i++) {                                           // Set up a loop of 8 iterations (8 bits in a byte)
     if (working > 127) { 
       digitalWrite (MOSI_signal,HIGH) ;                                    // If the MSB is a 1 then set MOSI high
     } else { 
       digitalWrite (MOSI_signal, LOW) ; }                                  // If the MSB is a 0 then set MOSI low                                           
    
    digitalWrite (CLK_signal,HIGH) ;                                        // Pulse the CLK_signal high
    working = working << 1 ;                                                // Bit-shift the working byte
    digitalWrite(CLK_signal,LOW) ;                                          // Pulse the CLK_signal low
    }
}

void spi_out(int CS, byte cmd_byte, byte data_byte){                        // we need this function to send command byte and data byte to the chip
    
    digitalWrite (CS, LOW);                                                 // to start the transmission, the chip select must be low
    spi_transfer(cmd_byte); // send the COMMAND BYTE
    delay(2);
    spi_transfer(data_byte); // send the DATA BYTE
    delay(2);
    digitalWrite(CS, HIGH);                                                 // to stop the transmission, the chip select must be high
}

la funzione initialize che manda il valore iniziale alla porta SPI:

void initialize() {                     // send the command byte of value 0 (initial value)
    spi_out(CS_signal, cmd_byte2, initial_value);
}

e la funzione commandPotentiometer usata nel loop per impartire i vari valori ai due potenziometri digitali per regolare la frequenza di taglio e il guadagno del filtro e per calcolare la corrispondente frequenza di taglio impostata effettivamente sul filtro :

void commandPotentiometer(int step) {
    Serial.print("gainCode: ");
    Serial.println(gainCode); 
    spi_out(CS_signal_gain, cmd_byte2, gainCode);   // change gain
    spi_out(CS_signal_frequency, cmd_byte2, step);   // change cutoff frequency
    Serial.print("step: ");
    Serial.println(step); 
    Serial.print("approximate resistance value: ");
    cutoffResistance = 10 + (step * RESISTANCE_STEP);
    Serial.print(cutoffResistance); 
    Serial.println(" Ω");
    Serial.print("approximate cutoff frequency value: ");
    cutoffFrequency = 1/((10 + (step * RESISTANCE_STEP)) * 3.14 * 2 * CAPACITY);
    Serial.print(cutoffFrequency); 
    Serial.println(" Hz");
    Serial.println();
    Serial.println();
}

Successivamente, la funzione setup setta i vari GPIO come OUTPUT, inizializza la porta SPI, attiva la porta seriale:

pinMode (CS_signal_frequency, OUTPUT);
pinMode (CS_signal_gain, OUTPUT);
pinMode (CLK_signal, OUTPUT);
pinMode (MOSI_signal, OUTPUT);

initialize();

Serial.begin(115200);                                                     // setting the serial speed
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500); 
Serial.println("ready!");

Inoltre contiene la parte che si occupa della gestione del collegamento WiFi e chiama la funzione setupApi():

WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
// it is a good practice to make sure your code sets wifi mode how you want it.

//WiFiManager, Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wm;

// reset settings - wipe stored credentials for testing
// these are stored by the esp library
// wm.resetSettings();

// Automatically connect using saved credentials,
// if connection fails, it starts an access point with the specified name ( "AutoConnectAP"),
// if empty will auto generate SSID, if password is blank it will be anonymous AP (wm.autoConnect())
// then goes into a blocking loop awaiting configuration and will return success result

bool res;
// res = wm.autoConnect(); // auto generated AP name from chipid
// res = wm.autoConnect("AutoConnectAP"); // anonymous ap
res = wm.autoConnect("AutoConnectAP","password"); // password protected ap

if(!res) {
    Serial.println("Failed to connect");
    ESP.restart();
} 
else {
    //if you get here you have connected to the WiFi    
    Serial.println("Connected...yeey :)");
}

setupApi();

La funzione loop gestisce le chiamate del client da parte del server e, ogni measureDelay secondi, chiama la funzione commandPotentiometer(resistanceFrequencyCode) che imposta il valore contenuto in resistanceFrequencyCode (ricevuto dalla API POST) e il valore gainCode, sempre ricevuto dalla API POST:

  server.handleClient();

  if (millis() > lastTimeRan + measureDelay)  {
    commandPotentiometer(resistanceFrequencyCode);
    lastTimeRan = millis();

   }

Come connettere la board ad Internet

Dopo aver caricato lo sketch sulla board, apri il Serial Monitor per vedere i messaggi provenienti dal dispositivo.

Per prima cosa la board va in modalità Access Point e ci fornirà un indirizzo IP che useremo a breve. Questa operazione serve per connettere la board ad Internet senza dover inserire nel codice i parametri della rete WiFi (SSID e password).

La board ci fornisce il suo indirizzo IP
La board ci fornisce il suo indirizzo IP

In questo caso l’indirizzo IP è 192.168.4.1.

A questo punto la ESP8266 è in modalità Access Point (con SSID AutoConnectAP) e dobbiamo connettere il nostro computer alla rete AutoConnectAP. Se andiamo nel menu delle reti del nostro computer, dovremmo vedere anche la rete AutoConnectAP nell’elenco delle reti wireless.

Lista delle reti WiFi disponibili
Lista delle reti WiFi disponibili

Connetti il computer alla rete AutoConnectAP. Quindi vai sul tuo browser e inserisci l’IP precedentemente fornito dalla ESP8266 (che in questo esempio è 192.168.4.1)

Vedrai una schermata come questa:

La schermata del browser per scegliere la rete
La schermata del browser per scegliere la rete

Clicca il bottone ConfigureWiFi. Ti mostrerà le reti disponibili:

Lista delle reti disponibili
Lista delle reti disponibili

Scegli la SSID della tua rete:

Scegli la tua rete
Scegli la tua rete

Inserisci la password della tua rete e clicca il bottone save:

Inserisci la password
Inserisci la password

La risposta della board
La risposta della board

Il modulo ESP8266 conserva memorizzati i parametri di accesso anche se lo spegni, li ricorderà al riavvio e si ricollegherà automaticamente senza dover ripetere questa procedura. Solo se lo resetti rimuovendo il commento da questa riga

// wm.resetSettings();

perderà i parametri di connessione.

Nota Bene: il dispositivo può memorizzare solo una rete. Se successivamente lo colleghi a un’altra rete, dimenticherà le impostazioni della rete precedente.

Testiamo il progetto con le API REST

Una volta che la ESP8266 è stata connessa alla rete WiFi ci fornirà tramite il Serial Monitor di PlatformIO il suo indirizzo IP, come visibile nella figura seguente:

Ricaviamo l'IP della board
Ricaviamo l’IP della board

In questo caso l’IP assegnato dal router alla board è 192.168.1.9. Tale IP ci servirà per comporre le API REST.

Per interagire con la board abbiamo bisogno di un software apposito che si chiama Postman. Dopo aver installato il programma, siamo pronti ad usarlo.

Ecco come si presenta la sua schermata iniziale:

Schermata iniziale di Postman
Schermata iniziale di Postman

Nella finestra principale si trova una barra in cui dovrai inserire l’API.

Alla sinistra di questa barra c’è un menù a tendina che consente di scegliere il tipo di API (per esempio GET, POST, PUT…).

Scegli ora il tipo POST e inserisci l’API POST che avrà formato:

192.168.1.8/setCutoffFrequency

NOTA: negli esperimenti successivi è stato assegnato l’IP 192.168.1.8 quindi le immagini seguenti faranno riferimento a questo IP.

Ovviamente tu dovrai mettere l’indirizzo IP assegnato alla tua ESP8266.

Prima di premere il tasto Send, dovrai selezionare la voce Body che sta sotto la barra dell’URL. Poi seleziona la voce raw (sotto Body) e poi, sul menù a tendina sulla destra, seleziona la voce JSON al posto di Text, come mostrato in foto:

Selezione dei parametri per l'API di tipo POST
Selezione dei parametri per l’API di tipo POST

Nella finestra sottostante inserisci il Json:

{
        "resistanceFrequencyCode": "1",
        "gainCode": "25"
}

Ecco come dovrebbe apparirti la finestra di Postman:

La finestra di Postman con l'API POST
La finestra di Postman con l’API POST

Premi il tasto Send per mandare il Json con i parametri resistanceFrequencyCode e gainCode. Variando il valore del parametro resistanceFrequencyCode (compreso tra 0 e 255) varierai la resistenza del potenziometro digitale a lui associato e, di conseguenza, la frequenza di taglio del filtro. Più il resistanceFrequencyCode si avvicina a 255, più la frequenza di taglio si abbassa.

Variando il valore del parametro gainCode (compreso tra 0 e 255) varierai la resistenza del potenziometro digitale a lui associato e, di conseguenza, il guadagno del filtro. Più il gainCode si avvicina a 255, più il guadagno è alto.

Per vedere lo stato attuale del filtro (cioè per vedere che resistenza è stata impostata e, di conseguenza, che frequenza di taglio, e quale valore di gainCode) scegli ora il tipo GET e inserisci l’API GET che avrà formato:

http://IP_ESP8266/getValues

Per esempio, in questo caso, essendo l’IP assegnato 192.168.1.8, l’URL dell’API sarà:

http://192.168.1.8/getValues

Ovviamente tu dovrai mettere l’indirizzo IP assegnato alla tua ESP8266.

Premi il tasto Send sulla destra.

L’API restituirà un file Json che riporta i valori rilevati cutoffFrequency , cutoffResistance e gainCode come mostrato nella immagine seguente:

Risultato dell'API GET
Risultato dell’API GET

Video dimostrativo con gli strumenti di misura del distorsore per chitarra

Nel video che segue vedrai il dispositivo sotto test. In particolare gli verrà iniettato in ingresso un segnale sinusoidale di 100mVpp e 1 kHz e verrà mostrato il suo comportamento sullo schermo di un oscilloscopio, al variare dei parametri resistanceFrequencyCode e gainCode inseriti tramite Postman.

In particolare osserverai tre tracce: la traccia celeste è il segnale sinusoidale in ingresso, la traccia gialla è il segnale distorto all’uscita del distorsore (cioè ai capi dei diodi) mentre la traccia viola è il segnale in uscita al filtro passa basso (quindi il segnale distorto che è stato poi filtrato dal passa basso).

Come avrai modo di notare, tenendo fisso a 1 il valore di gainCode e mettendo il valore di resistanceFrequencyCode a 1, la traccia gialla e quella viola si sovrappongono. Questo perchè la frequenza di taglio del filtro è molto alta e quindi sta facendo passare praticamente quasi tutte le frequenze del segnale squadrato dai diodi. Se poi, tenendo sempre a 1 il valore di gainCode, aumenti fino a 255 il valore di resistanceFrequencyCode, la freqenza di taglio si abbasserà e il filtro attenuerà sempre di più le frequenze basse (compresa la fondamentale a 1 kHz), facendo somigliare sempre di più la traccia viola ad un’onda triangolare. Aumentando il valore di gainCode verso 255 si aumenta il guadagno del filtro, di conseguenza la traccia viola aumenta la sua ampiezza. Quindi per trovare il suono “giusto” bisogna provare un po’ di combinazioni di questi due parametri (considerato che anche l’amplificatore che riprodurrà il suono aggiungerà il suo timbro).

Video dimostrativo con chitarra elettrica

Nel video seguente mi cimenterò in una esibizione veramente indimenticabile (non sono per niente un chitarrista) per testare il nostro distorsore con vari valori della frequenza di taglio e del guadagno del filtro. Buona visione:

L’amplificatore Richardson usato per la riproduzione è un valvolare da 5W progettato e realizzato da me.

Newsletter

Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)

Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.

Inserisci il tuo nome
Inserisci la tua email
Torna in alto