Problema con la funzione map()

Ciao a tutti,
sono nuovo nel mondo di Arduino è leggendo il libro dello Starter Kit, non riesco proprio a capire la funzione map().
Ho visto sul questo sito, ma non ci ho capito nulla ugualmente c'è qualche anima buona che mi potrebbe spiegare questa funzione, grazie in anticipo.

PS: Un'altra cosa c'è qualche buon libro (in italiano) che piega le basi di Arduino e dell'elettronica?

Ciao.
In soldoni map non fa altro che fare una semplice proporzione fra i valori impostati.

y = analogRead(0);
x = map(y, 0, 1023, 0, 255);

Gli ingressi analogici hanno valori che vanno da 0 a 1023, se a te servisse una scala più ridotta (come nell'esempio 0-255), map ti ritorna il valore di y nella scala 0-1023, adeguatamente proporzionato alla scala 0-255.

Riguarda ancora l'esempio scritto sopra.
y = 512;
x = map(y, 0, 1023, 0, 255);

Il valore di x sarà 128.

Qui c'è il Reference del linguaggio:

Sono spiegate tutte le funzioni proprie dell'ambiente Arduino.

Come libri ce ne sono tanti, potresti iniziare con la guida di Massimo Banzi, che è disponibile anche in italiano. Oppure tanti altri volumi che trovi spulciando con "arduino" nelle più fornite librerie online.

MatrixLPUX:
PS: Un'altra cosa c'è qualche buon libro (in italiano) che piega le basi di Arduino e dell'elettronica?

Per programmazione Arduino puoi cercare in internet "Tiziana Marsella Programmazione Arduino". Ha scritto un buon pdf free che ha reso disponibile.

Brado:
Ciao.
In soldoni map non fa altro che fare una semplice proporzione fra i valori impostati.

y = analogRead(0);

x = map(y, 0, 1023, 0, 255);




Gli ingressi analogici hanno valori che vanno da 0 a 1023, se a te servisse una scala più ridotta (come nell'esempio 0-255), map ti ritorna il valore di y nella scala 0-1023, adeguatamente proporzionato alla scala 0-255.

Riguarda ancora l'esempio scritto sopra.
y = 512;
x = map(y, 0, 1023, 0, 255);

Il valore di x sarà 128.

Quindi se ho capito male la funzione map() mi diminuisce il valore 1023 dei pin analogici, ho fatto un piccolo esempio con il servo e il potenziometro. Il servo motore da quello che ho letto sul libro dello starter kit può arrivare fino ad massimo di 180°, quindi ho utilizzato la funzione map() per far bloccare il pin analogico su 180, ho fatto giusto?

#include <Servo.h>

Servo myServo;

const int potPin = A0;
int valore = 0;
int valoreServo = 0;

void setup() {
 
 Serial.begin(9600);
 myServo.attach(2);

}

void loop() {
   
  valore = analogRead(A0);
  valoreServo = map(valore, 0, 1023, 0, 180); 
  
  myServo.write(valoreServo);
  
  Serial.print("Valore: ");
  Serial.print(valore);
  
  Serial.print(" - Angolo: ");
  Serial.println(valoreServo);
  
  delay(1000);
   
}

leo72:
Qui c’è il Reference del linguaggio:
http://arduino.cc/en/Reference/HomePage
Sono spiegate tutte le funzioni proprie dell’ambiente Arduino.

Come libri ce ne sono tanti, potresti iniziare con la guida di Massimo Banzi, che è disponibile anche in italiano. Oppure tanti altri volumi che trovi spulciando con “arduino” nelle più fornite librerie online.

Per il libro l’ho trovato alla Feltrinelli, è questo qui: http://www.lafeltrinelli.it/libri/massimo-banzi/arduino-guida-ufficiale/9788848127264

Grazie mille per gli aiuti

MatrixLPUX:
Quindi se ho capito male la funzione map() mi diminuisce il valore 1023 dei pin analogici, ho fatto un piccolo esempio con il servo e il potenziometro. Il servo motore da quello che ho letto sul libro dello starter kit può arrivare fino ad massimo di 180°, quindi ho utilizzato la funzione map() per far bloccare il pin analogico su 180, ho fatto giusto?

Non solo.
Traduce qualsiasi range in un altro, anche per esempio da 0 a 255 in 0 a 255 oppure 0 a 255 in -127 a 128 ecc.
Lavora con variabili di tipo INT, non float

Ciao Uwe

MatrixLPUX:
Quindi se ho capito male la funzione map() mi diminuisce il valore 1023 dei pin analogici,

Non è che lo diminuisce, lo proporziona.
Se sulla scala 0-1023 hai un valore che è al 37% (379) ti restituisce un valore al 37% sulla scala impostata 0-255 > 95, 0-512 > 190, -128+128 > -33

Esattamente la map() è:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

nid69ita:
Esattamente la map() è:

Molto importante, la map() lavora esclusivamente con numeri interi a 32bit signed (long int), non può essere utilizzata con i float e non può ritornare un valore con i decimali.

A meno che non te ne fai una macro, identica, usando una più semplice #define
Anche se come macro bisogna fare più attenzione ai parametri passati.

nid69ita:
A meno che non te ne fai una macro, identica, usando una più semplice #define

La map può benissimo essere una macro, però servono i float come tipo dati se deve lavorare con valori float.

Grazie mille a tutti, finalmente ho capito ahah
grazie ancora

MatrixLPUX:
Grazie mille a tutti, finalmente ho capito ahah
grazie ancora

Bene, l'importante è questo. :wink:
Ciao.