Per un mio simpatico progetto sto cercando di controllare il volume di un buzzer con oscillatore esterno e la frequenza a cui suona collegando
un pin del buzzer ad un pin digitale di arduino che utilizzo per la funzione "tone";
l'altro pin del buzzer è collegato ad un pin analogico di arduino al quale faccio variare progressivamente il livello in modo (secondo me :D) che la tensione ai capi del buzzer vari senza dover pacioccare con la funzione "tone".
Certo di non essermi spiegato, allego lo sketch:
// Scheda: Arduino Nano
#define buz 11
#define pinvol 14
void setup(){
pinMode(buz,OUTPUT);
pinMode(pinvol,OUTPUT); // so che non è necessario
tone(buz,5000);
analogWrite(pinvol,255);
delay(2000);
analogWrite(pinvol,125);
delay(2000);
noTone(buz);
}
void loop() {}
il problema che mi spinge a scrivere qui è che il volume del buzzer non varia ed anche il valore medio della tensione ai capi del buzzer, durante l'esecuzione del programma, rimane costante a 2,7V (questo, e vi prego di correggermi se sbaglio, perchè arduino per fare suonare il buzzer fornisce una tensione che non è costante, ma variabile nel tempo con una certa frequenza, impostata con la funzione "tone", che corrisponde a quella alla quale il buzzer suona. Il valore medio della tensione ai capi del buzzer è appunto 2,7V)
allora premetto che non ho cercato di fare un qualcosa del genere...
se vuoi fare degli schemi alla "veloce" e non con paint poi usare questo SW fidati molto meglio
il pin A0 è un ingresso analogico e non un'uscita, o meglio puoi essere usato anche come pin di uscita ma digitale... prendi tutto un po' con le pinze perchè non mi ricordo bene (magari arriva qualcuno in supporto )
infine ti consiglio di leggere questo, magari fa al caso tuo
Conoscevo Fritzing ma ieri sera piuttosto che installarlo ho preferito risolvere alla buona con paint... Comunque ora l'ho installato quindi, per fare le cose per bene, allego l'immagine del circuito fatto bene.
Grazie per il link, avevo già adocchiato quella libreria ma, avendo i pin 9 e 10 già occupati ho preferito arrangiarmi e cercare di risolvere il problema con l'espediente presente nel codice che ho postato (che non funziona :D).
Se l'unico modo per far variare il volume del buzzer è quello di utilizzare la libreria toneAC, allora modifico il mio hardware.
Mi piacerebbe però capire come mai la mia idea non funziona.... Ho qualche sospetto ma potrebbe essere senza alcun senso. Magari ha a che fare con il fatto che stia fornendo due onde quadre al buzzer anzichè un'onda quadra (pin buz) - e un livello di tensione costante, che decido io, che funge da GND (pin pinvol)?
... sulle MCU AVR, la funzione analogWrite() può essere utilizzata SOLO sui pin dotati di PWM dato che in realtà ... di analog NON ha assolutamente nulla
La MCU di Arduino (AVR) è dotata SOLO si un ADC (Analog to Digital Converter) e NON di un DAC (Digital to Analog Converter), quindi, mentre una analogRead() fa esattamente quello che dice il nome, analogWrite() è un nome un po .... "fasullo", dato che in realtà va solo a cambiare la percentuale del duty cicle del PWM
propifol:
Ah, mi sono anche dimenticato di dire che la mia idea di risolvere il problema mi sembrava fattibile conoscendo la funzione analogWrite ...
... mi sembra invece che tu la funziona NON la conosca : ... prova a rileggere con attenzione il reference e vedrai che c'è scritto quello che ho scritto sopra io.
gpb01:
... sulle MCU AVR, la funzione analogWrite() può essere utilizzata SOLO sui pin dotati di PWM dato che in realtà ... di analog NON ha assolutamente nulla
La MCU di Arduino (AVR) è dotata SOLO si un ADC (Analog to Digital Converter) e NON di un DAC (Digital to Analog Converter), quindi, mentre una analogRead() fa esattamente quello che dice il nome, analogWrite() è un nome un po .... "fasullo", dato che in realtà va solo a cambiare la percentuale del duty cicle del PWM
Guglielmo
Grazie mille per la risposta!
Wow, quindi con la mia ipotesi del post#4 ci sono andato vagamente vicino! certo, per onda quadra intendevo PWM, scusate ...
Potresti darmi un indizio su come risolvere il problema?
gpb01:
... mi sembra invece che tu la funziona NON la conosca : ... prova a rileggere con attenzione il reference e vedrai che c'è scritto quello che ho scritto sopra io.
Guglielmo
Ops, non ci siamo capiti: ho scritto quella risposta (post#6) prima di aver letto la tua (post#5).
Se pure uscisse una tensione continua, andresti a variare la componente continua ai capì della capsula, ma non l'ampiezza dell'onda quadra che produce il suono.
Per variare l'ampiezza, potresti sperimentare con un partitore con due o tre resistenze e uno o due pin che commuti fra massa (pinMode output) e alta impedenza (pinMode input).
Datman:
Se pure uscisse una tensione continua, andresti a variare la componente continua ai capì della capsula, ma non l'ampiezza dell'onda quadra che produce il suono.
Per variare l'ampiezza, potresti sperimentare con un partitore con due o tre resistenze e uno o due pin che commuti fra massa (pinMode output) e alta impedenza (pinMode input).
Ciao e grazie mille per la risposta!
Se non chiedo troppo, potresti farmi uno schemino di ciò che intendi?
Grazie
p.s.
Quindi è impossibile risolvere il problema senza modificare l'hardware
Metti una resistenza, ad esempio 1kohm, in serie al pin su cui mandi il tone(),
una resistenza (ad esempio 1kohm) in serie al primo pin di controllo (chiamiamolo VOL1)
e una resistenza (ad esempio 470 ohm) in serie al secondo pin di controllo (VOL2),
quindi colleghi i tre capi liberi delle resistenze al buzzer.
Se entrambi i pin di controllo stanno ad alta impedenza:
pinMode(VOL1,INPUT); pinMode(VOL2,INPUT)
hai il massimo volume;
se imposti il primo pin di controllo come uscita:
pinMode(VOL1,OUTPUT); digitalWrite(VOL1,LOW);
fai un partitore di tensione 2:1;
se imposti il secondo pin di controllo come uscita:
pinMode(VOL2,OUTPUT); digitalWrite(VOL2,LOW);
fai un partitore di tensione 3:1;
se imposti entrambi i pin di controllo come uscita:
pinMode(VOL1,OUTPUT); pinMode(VOL2,OUTPUT);
digitalWrite(VOL1,LOW); digitalWrite(VOL2,LOW);
fai un partitore di tensione 4:1.