Simulare un suono robotico

Salve, avrei la necessità di creare un specie di suono robotico con la libreria Tune oppure in altro modo non so, l'effetto che vorrei ottenere e quello che si sente in questo video: Mei2dling2 - YouTube

qualcuno potrebbe darmi una mano, grazie.

Puoi usare l'istruzione tone(pin, frequency, duration)
Peraltro ci sono delle limitazioni:
1-non è possibile generare toni al di sotto di 31 Hz
2-non è possibile usare il PWM dei pin 3 ed 11

Ciao cyberhs grazie per la risposta, utilizzo già l'istruzione: tone(pin, frequency, duration), il problema è che ottengo solamente un suono fisso, mentre quello che si sente nel video sembra sia una frequenza che varia velocemente in modo random, dico sembra perché non so in che modo esattamente venga fatto ed è proprio quello che vorrei riuscire a capire e mettere in pratica.

La Tone varia solo la frequenza perché usa un timer in modalità PWM.
Per cambiare un suono devi variarne anche il periodo, non solo la frequenza.

Ad esempio, una stupidissima applicazione è questa:
http://www.leonardomiliani.com/2013/una-atari-punk-console-con-un-attiny85/

L'ho chiamata Attiny Punk Console, perché basata su un Attiny85.

Un altro bel progetto è Nebulophone:

Trovi schemi e sketch.

Se invece non vuoi/sai spippolare con i timer, puoi usare un chip apposito come il Ginsing:
http://www.ginsingsound.com/

E' venduto anche come shield da infilare sull'Arduino e permette non solo di riprodurre suoni simili ai giochini ad 8 bit degli anni 80 ma anche una sintesi vocale di base.

leo72:
Per cambiare un suono devi variarne anche il periodo, non solo la frequenza.

Questa non l'ho capita.
Ma la frequenza non è l'inverso del periodo?

Per generare una sequenza casuale puoi usare la funzione random(100, 3000) per ottenere una nota tra 100 e 3000 Hz.

paulus1969:
Questa non l'ho capita.
Ma la frequenza non è l'inverso del periodo?

Si è espresso male, sicuramente intendeva la durata del suono :slight_smile:

paulus1969:
Questa non l'ho capita.
Ma la frequenza non è l'inverso del periodo?

Ho sbagliato a scrivere. :sweat_smile: :sweat_smile:
Non so perché pensavo al periodo.

Comunque altra cosa fondamentale nella generazione di un suono è l'inviluppo, il caratteristico grafico ADSR (Attack-Decay-Sustain-Release), ossia come un suono raggiunge il livello massimo di intensità, per cui calare, mantenere il valore raggiunto e poi estinguersi.
Non è facile fare tutto questo via software.

leo72:
Non è facile fare tutto questo via software.

Non a caso esistono appositi chip dedicati alla generazione di effetti sonori, oltre al già citato Soundgin, in realtà è un PIC 18F1320 appositamente programmato, c'è anche lo Speakjet che oltre a suonare può sintetizzare il parlato in Inglese tramite fonemi.
Attualmente il Soundgin è stato sostituito dal GinSing che ne eredita il firmware e la GUI.

Avevo visto il Ginsing, e' basato sull'HT8950 della Holtek ... ma mi sembra che quel componente sia fuori produzione ormai ...

Davide, e' una mia impressione, o stai cercando di costruirti un "clone" di R2D2 ? :wink: XD ...

C1-P8, per favore :wink:
Vogliamo snaturare la traduzione originale? Vabbè che la nuova trilogia ha cambiato tante cose, ma C1-P8 è e resta C1-P8 :wink:

leo72:
C1-P8, per favore :wink:
Vogliamo snaturare la traduzione originale? Vabbè che la nuova trilogia ha cambiato tante cose, ma C1-P8 è e resta C1-P8 :wink:

Giusto, chiedo scusa :wink:

leo72:
C1-P8, per favore :wink:
Vogliamo snaturare la traduzione originale? Vabbè che la nuova trilogia ha cambiato tante cose, ma C1-P8 è e resta C1-P8 :wink:

Intanto è l'unico personaggio della precedente esalogia ad essere confermato ufficialmente per il nuovo film, questi droidi vivono a lungo se sono disponibili i ricambi :grin:

Salve, ringrazio tutti per la risposta, quello che sto cercando di fare e solo ottenere il suono che si sente nel video che ho passato sopra niente di più, non dovrebbe essere difficile da ottenere il problema è che nn so in che modo procedere, comunque quello che sto facendo in pratica è sostituire tutta l’elettronica di un robot giocattolo chiamato Emiglio che devo regalare a mio fratello piccolo per natale, per adesso per generare un sono ho scritto questo codice:

for(int i=0;i<20;++i){
    delay(100);
    tone(spaeker, i);
  }
  for(int i=20;i<0;++i){
    delay(100);
    tone(spaeker, i);
  }
  noTone(spaeker);

Saluti
Davide.

La Tone, come detto, è limitata. Devi giostrarti con i Timer, guarda i progetti che ti ho linkato e studia un pò il loro codice

Ecco un aiutino, prova…

byte TonePin = 4;

unsigned int FreqMin = 300;
unsigned int FreqMax = 3000;

unsigned int Tono;
unsigned long Durata = 100;

void setup() {
  randomSeed(analogRead(0));
}

void loop() {
  for (byte I = 0; I < 6; I ++) {
    Tono = (unsigned int) random(FreqMin, FreqMax);
    tone(TonePin, Tono, Durata)
  }
}

Ciao cyberhs grazie per la risposta e per il codice, ho provato il codice ma non mi funziona, dallo speaker si sente solo un forte rumore continuo tipo radio, non so da cosa possa dipendere.

Saluti
Davide.

Ti ho detto che era solo un piccolo aiuto nelle direzione giusta, ma non ho avuto modo di testarlo.
Probabilmente occorre inserire un ritardo pari almeno alla Durata (100ms) con l'istruzione delay() tra la generazione di un suono e l'altro.
Per essere sicuro che il Tono sia giusto, puoi inserire una Serial.print(Tono) nel loop, dopo aver inizializzato ovviamente la porta seriale.

Ciao cyberhs, finalmente ho risolto e sembra che tutto funzioni alla perfezione adesso grazie.

Saluti
Davide.