buzzer e "rumore"

Ciao a tutti.

ieri ho finalmente azionato un buzzer, tutto ok con lo sketch di esempio che riproduce una piccola melodia.

Mi chiedevo: è possibile generare un "rumore", simile a quel rumore acustico "di una volta", dovuto alla scarsa sintonizzazione (vi ricordate quando si sintonizzavano i TV con la scansione dei canali "fine"... ah sembra un secolo!! :)) ?

Il mio componente credo sia il tipico buzzer (cilindro nero di circa 1cm di diam., con 2 pin), e non so se con il tone si possa generare dell'altro.

Pensavo di creare una sequenza veloce di note (frequenze), meglio se random entro un range, per ingannare l'udito, ma se non sbaglio il rumore è uno spettro e dovrei generare simultaneamente più frequenze.

L'intento sperimentale era quello di generare un rumore, appunto, meglio se sempre diverso (e qui sarebbe da definire meglio il "diverso"), in risposta ad un evento (i bimbi che si avvicinano, toccano un pulsante, fanno ombra su un fotoresistore, ecc.)

Grazie

A.

Intendi tipo "statica" ? ... credo che il sistema migliore sia un generatore di rumore bianco ... con arduino non saprei se e' possibile, il rumore bianco e' un mix di tutte le possibili frequenze in ordine assolutamente casuale ...

Se non puoi usare un diodo per generarlo analogicamente, forse (ma se dico ca**ate gli esperti mi correggano :stuck_out_tongue: XD), si possono usare un paio di routines per generare numeri casuali sempre variabili da assegnare alle frequenze di un paio dei pin PWM impostati con il duty-cycle al 5% o meno, per sommarli poi all'uscita (magari anche piu di due, se gli altri non sono usati) ... non sarebbe rumore "bianco", ma forse si riesce a simulare qualcosa di simile ...

Etemenanki:
Intendi tipo "statica" ? ... credo che il sistema migliore sia un generatore di rumore bianco ... con arduino non saprei se e' possibile, il rumore bianco e' un mix di tutte le possibili frequenze in ordine assolutamente casuale ...

Se non puoi usare un diodo per generarlo analogicamente, forse (ma se dico ca**ate gli esperti mi correggano :stuck_out_tongue: XD), si possono usare un paio di routines per generare numeri casuali sempre variabili da assegnare alle frequenze di un paio dei pin PWM impostati con il duty-cycle al 5% o meno, per sommarli poi all'uscita (magari anche piu di due, se gli altri non sono usati) ... non sarebbe rumore "bianco", ma forse si riesce a simulare qualcosa di simile ...

grazie!

Non so se intendiamo lo stesso rumore, proprio per questo - non sapendolo definire - ho portato l'esempio del rumoraccio tipico delle sintonizzazioni.

Inoltre, non essendo pratico, ho postato in SW, volendo tentare la strada del codice, se possibil :slight_smile:

Tempo fa avevo fatto una "finta esplosione" per un aggeggino che faceva anche il conto alla rovescia su un display, usando un generatore di rumore bianco basato su un algoritmo di Galois con LFSR (Linear Feedback Shift Register)

Il codice centrale è questo:

//prepare the timer to generate the nois
void startNoiseGeneration() {
    cli();
    TCCR1A = 0; //disconnect all the pins
    TCCR1B = ((1<<WGM12) | (1<<CS10)); //CTC mode w/top set to OCR1A - prescaler set to /1
    OCR1A = 16000; //800 -> F = 20 kHz (T=50 us) // 16000 -> F = 1 kHz
    TIMSK1 = (1<<OCIE1A); //activate ISR on OCRA compare match
    sei();
    pinMode(9, OUTPUT);
}

//white noise generation using a Galois 32-bit LFSR algorithm (from en.wikipedia)
//this takes less flash than the previous
ISR(TIMER1_COMPA_vect) {
    volatile static unsigned long lfsr = 1;
    lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xD0000001u); 
    digitalWrite (9, lfsr & 1);
}

Per attivare il generatore, basta chiamare la funzione startNoiseGeneration().
Una volta fatto questo, facendo

pinMode(9, OUTPUT);

fai uscire il suono sull'altoparlante.
Per fermarlo metti in input il pin:

pinMode(9, INPUT):

PS: se "giochi" con il registro OCR1A del timer, puoi variare la frequenza prodotta.
Vedi infatti nei miei commenti come varia la frequenza in base al valore di OCR1A. Io avevo selezionato 1 kHz perché volevo un suono grave, ma mettendo qualcosa che genera una frequenza più alta dovresti riprodurre la statica che ti serve.

grazie leo!

Ma parli di altoparlante, io ho (a mala pena) un buzzer...

O forse non ho capito che il codice funziona anche con un buzzer :blush:

Se per "buzzer" intendi uno di quei cicalini dotati di oscillatore interno, ottieni un "troiaio" :wink:
Essi sono fatti per fare una tonalità ad una determinata frequenza fissa (per via dell'oscillatore). Se li piloti con un'altra frequenza, quella generata dall'Arduino si mescola con quella generata dal buzzer... :sweat_smile: :sweat_smile:

Procurati o un buzzer senza oscillatore oppure un altoparlantino da 8 ohm e 1/2 watt. Li piloti entrambi con con un transistor.
Metti tutto sul pin 9 (il mio sketch necessita di quel pin).

Probabilmente intende uno di quelli con la cialdina piezo, ma senza oscillatore interno ... altrimenti non so come avrebbe potuto riprodurre una melodia :wink:

Etemenanki:
Probabilmente intende uno di quelli con la cialdina piezo, ma senza oscillatore interno ... altrimenti non so come avrebbe potuto riprodurre una melodia :wink:

io credo intenda questo

che riproduce più o meno la melodia :grin:

Madwriter:

Etemenanki:
Probabilmente intende uno di quelli con la cialdina piezo, ma senza oscillatore interno ... altrimenti non so come avrebbe potuto riprodurre una melodia :wink:

io credo intenda questo

che riproduce più o meno la melodia :grin:

esatto, un robo così http://homotix.it/upld/catalogo/original/Buzzer%20Piccolo.jpg

la "melodia" è quella di esempio (function melody, appunto)

@etemenanki: non ho un altoparlante, e volevo capire se quel cicalino poteva creare un noise via software, ma mi sembra di capire che la risposta è no

@leo72: troiaio "ragguardevole quantità di sozzura"...potrebbe andar bene! :stuck_out_tongue:

in sintesi:

  • un buzzer/cicalino/piezo produce singole frequenze con il metodo tone
  • per qualcosina giusto un pelino più complesso bisogna passare ad un altoparlante

ottimi contributi, come sempre :wink:

grazie a tutti

comunque ti consiglio di provare col buzzer giocandoci un pò qualcosa riesci a produrre :wink:

Madwriter:
comunque ti consiglio di provare col buzzer giocandoci un pò qualcosa riesci a produrre :wink:

si, appena rientro in possesso dei pezzi, provo a inviare una "melodia" :smiley: costituita da suoni casuali e brevissimi, questa è l'idea che mi sono fatto via software per provare

poi se ci riesco tento l'opzione "leo"

Usando un buzzer (cilindretto nero della foto sopra) ottengo con codice di @Leo una insieme di rumori che mi sembra
quello che voleva @andreino, il rumore di una vecchia tv su un canale analogico non sintonizzato.
Se cambi frequenza sembra un pò il rumore che facevano i vecchi modem di una volta.

Qui, seguendo consigli @leo, esempio di rumore bianco

@nid69:
sì, giocando con la frequenza ottieni un pò tutti gli effetti, io a basse frequenze ci ho simulato una esplosione.

@andreino:
quello della foto è sia con che senza oscillatore interno, dipende dal modello che hai comprato.
Se lo colleghi a +5V e GND, emette un suono di suo oppure resta muto? Se resta muto, puoi usarlo col codice che ti ho dato, se emette un suono allora inserendoci sull'alimentazione un'altra frequenza, questa si mischia a quella generata dal buzzer, e ti viene il... troiaio :wink:

provato adesso, non fa rumore, forse un piccolissimo tic, comunque nessuna frequenza mantenuta con 5V e GND collegati

ottimo, funziona!

ho provato velocemente con:

int pinBuzzer = 8;
long int rnd;

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(5));
}
  
  
void loop() {
  delay(1000);
    for (int i=0; i <= 255; i++){
      rnd = random(300,20000);
      startNoiseGeneration(rnd);
      delay(10);
      pinMode(pinBuzzer, INPUT);
   }   
}

e ottengo cicli di tr***aio :smiley: casuale, 256 frequenze random (o pseudo-random) per ciclo, giusto per provare

A questo punto, via software è possibile assegnare valori random tra ranges sempre crescenti/decrescenti e ottenere per esempio il "boom" :slight_smile: