variatore di frequenza

salve a tutti ho acquistato circa sei mesi fa una scheda arduino uno con lo scopo di creare un oscillatore che simuli un sensore di velocita'.
il range di frequenza deve poter variare con un potenziometro e darmi una frequenza in uscita che vada da 0 a 600Hz.
qua vi posto lo sketch.

/*
Body computer
*/
int frequenza=map(analogRead(A0),0,1023,0,600);
void setup()
{
pinMode(13,OUTPUT);
pinMode(A0,INPUT);
}

void loop()
{
frequenza=map(analogRead(A0),0,1023,0,600);
Serial.println(frequenza);
tone(13,frequenza);
}

Provato al banco tutto ok a parte la soglia di partenza che va da 30 a 600Hz ma questo dipende dall'istruzione tone
e poi alle basse frequenze altra anomalia variando il potenziometro oscilla rapidamente da 30 a 100 Hz e vice versa.
il problema principale pero' e che una volta collegato al body computer non mi da alcuna velocita', porovando invece con un oscillatore 555 funziona,a parte il range di frequenza che è proprio ingestibile.
avete consigli da darmi.
Vi ringrazio in anticipo.

Devi usare unsigned int per la frequenza e ti consiglio di provare altri pin.

per potenziometro prova uno log, non lineare..magari migliori la risoluzione nelle basse frequenze..se non lo usi già..oppure un multigiro.

Il top potresti inserire un encoder rotativo..cosi aumenti o diminuisci la varibile ad ogni "click".

unsigned int al osto del comando tone?
per il potenziometro non c'è un modo per poter linearizzare quello analogico mi servono anche i fine corsa del potenziometro cosi da capire quando la frequenza in uscita è bassa o alta.

se usi un potenziometro logaritmico hai una risoluzione alle basse frequenze più alta..

va bene sempre da da 10k?

sisi :wink: potresti creare anche un tempo di refresh del dato analogico in ingresso..perchè varierà continuamente di qualche punto anche se non tocchi il potenziometro..tu imponi tramite programma di leggere la variabile in ingresso ogni tot millisecondi (50-100)..cosi il programma non varia ad ogni loop la variabile in ingresso A0, creando "spurie" nella funzione..detta un po così..

mentre tornando al discorso software come faccio con il comando unsigned int a modificare il programma?

/*
Body computer
*/
unsigned int frequenza=map(analogRead(A0),0,1023,0,600);
void setup()
{
  pinMode(13,OUTPUT);
  pinMode(A0,INPUT);
}

void loop()
{
  frequenza=map(analogRead(A0),0,1023,0,600);
  Serial.println(frequenza);
  tone(13,frequenza);
}

penso volesse dire questo cyberhs..cosi imponi solo numeri positivi

questo gia' provato sostituendo int ad unsigned int,
ma i problemi principali restano devo arrivare ad 1Hz quindi devo sostituire la funzione tone con qualcosaltro ma non so cosa esattamente.

La frequenza più bassa per il tone è 31Hz.

Per ottenere frequenze inferiori devi programmare un timer a 16 bit oppure usare la libreria Tone: quella usata da Arduino è la versione semplificata, mentre la versione completa consente di ottenere una frequenza minima di 1Hz circa.

https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation

quindi dovrei includere una libreria tone completa nello sketch principalmente?

includendo la libreria tone mi da un errore di compilazione

potrei avere un esempio ancora sono alle prime armi

Che errore ti da in compilazione?

Errore durante la compilazione

Per poter amplificare il segnale che tipo di amplificatore dovrei aggiungere?

Essendo un segnale Digitale binario ..uno switch...un transistor o un mosfet, o altro, dipende da quello che vuoi ottenere

Ho provato un amplificatore lm386 però è durato poco forse un problema di impedenza? Adesso non saprei. Un altra alternativa?