Map() da lineare a logaritmico

La funzione inversa del logaritmo e' l'esponenziale, cioe' Y = BASE elevato X.
IL quadrato, Y = X elevato 2, o il cubo, Y = X elevato 3, sono un'altra cosa.

L'op ha sempre parlato di logaritmo inverso (cioe' esponenziale), poi che gli vada bene anche un'altra cosa questo lo deve dire lui ...

Per quanto ho capito non gli serve che la risposta segua una curva perfettamente rispondente a una funzione matematica, ma che sia simile a quella di un potenziometro logaritmico, la cui curva è solo vagamente simile a una funzione esponenziale:
Log pot curve

L'obiettivo, quindi, è solo ottenere un funzionamento piacevolmente graduale nell'applicazione specifica. Penso che:
y=x^2/4100 (naturalmente x^2 è solo una simbologia matematica)
dia risultati molto soddisfacenti.
N.B.: dividendo per 4096, potenza di 2, si otterrebbe un'escursione da 0 a 256, che supera 255, anche se la formula diventerebbe una più rapida:
y=(x*x)>>12;

Qualcosa come un'anno fa avevo letto di sfuggita un'articolo di uno dei moderatori stranieri di qui, su una funzione map piu "estesa", fammi vedere se riesco a ritrovarlo in qualche segnalibro ...

EDIT: trovato questo, relativo a qualcosa chiamato "multimap", prova a vedere se ti puo servire a qualcosa per il tuo problema

dunque .... come è andata a finire ?
Ho fatto numerose prove prendendo come input tutti gli esempi da voi riportati.
Quello che si è avvicinato di più (in pratica mi ha risolto la questione) è stato l'input dato in prima battuta da J-M-L .
Gli altri esempi funzionano ma non riflettono in modo chirurgico quello che volevo ottenere.

Ho diviso in modo virtuale la scala del potenziometro in due parti : quella bassa l'ho fatta andare da 0 a 25 e l'altra - il rimanente - da 26 a 100.
Nella prima (zona corta) ho fatto in modo che il map fosse da 0 a 800: così la "curva-poco curva" è stata racchiusa tutta dentro quel poco spazio.
Nella seconda (zona lunga) ho messo il rimanente 224 (tot 1024) , nella quale la curva in pochi spostamenti cresce esponenzialmente.
In questo modo ho dato più spazio al pot di controllo nella zona logaritmica ed ho ottenuto un andamento quasi lineare nel muoverlo.
Naturalmente cambiando i parametri dei due map si può giocare sul confine tra le due zone e l'attacco di una con l'altra, in modo che non si crei troppa differenza durante il passaggio tra la bassa e la alta.

Il pot logaritmico inverso è una bella gatta da pelare ...
Quanto fatto mi conferma che questa cosa doveva essere risolta NECESSARIAMENTE via software perchè temperatura e tolleranza dei componenti porterebbe a valori differenti per ogni eventuale applicazione che potrebbe necessitare di uno standard costruttivo seriale.

Nel messaggio n.15 avevi scritto che dovevi trasformare una variazione da 0 a 1023 in una da 0 a 255...

Quindi hai fatto:
0 - 800 -> 0 - 25;
801-1023 -> 26 - 100

Quindi piu’ che una curva hai fatto una approssimazione lineare con due segmenti.
Per rendere la funzione un po’ meno spigolosa potresti aumentare il numero di segmenti: basta aggiungere degli altri “else if”.

Potresti provare anche questa funzione f(x) = ln(x^2) x 111.07 che ti da questo grafico.

Il valore costante 111.08 è calcolato (con abbondante arrotondamento) in questo modo 1023 / ln(100^2) per fare in modo che quando X = 100 -> Y = 1023

Certo tutti questi calcoli in virgola mobile con un piccolo ATMega328 richiederanno un po' di cicli clock, ma se non ci sono dei timing stringenti... anche perché immagino che tu non stia li continuamente a variare il potenziometro, ed il calcolo lo fai solo quando realmente necessario.

save

In C++ diventa cosi. Con x = 25 il risultato è 715

int x,y;
x =  valore_da_0_a_100;
y = log(x*x)*111.08;