2012-01-26 36 views
7

Estaba viendo un código de ejemplo y encontré una línea, no entiendo completamente por qué es necesario hacerlo. Entiendo que está tomando un valor analógico. Este valor está entre 0 y 1024 aparentemente? ¿Por qué es esto? ¿Por qué la salida necesita ser mapeada entre 0 y 255? ¿Qué dicta los argumentos que se utilizan aquí? La línea en cuestión:Arduino map() method - why?

// map it to the range of the analog out: 
     outputValue = map(sensorValue, 0, 1024, 0, 255); 

Destacado en el código:

created 29 Dec. 2008 
Modified 4 Sep 2010 
by Tom Igoe 

This example code is in the public domain. 

*/ 

// These constants won't change. They're used to give names 
// to the pins used: 
const int analogInPin = A0; // Analog input pin that the potentiometer is attached to 
const int analogOutPin = 9; // Analog output pin that the LED is attached to 

int sensorValue = 0;  // value read from the pot 
int outputValue = 0;  // value output to the PWM (analog out) 

void setup() { 
    // initialize serial communications at 9600 bps: 
    Serial.begin(9600); 
} 

void loop() { 
    // read the analog in value: 
    sensorValue = analogRead(analogInPin);    
    **// map it to the range of the analog out: 
    outputValue = map(sensorValue, 0, 1024, 0, 255);** 
    // change the analog out value: 
    analogWrite(analogOutPin, outputValue);   

    // print the results to the serial monitor: 
    Serial.print("sensor = ");      
    Serial.print(sensorValue);  
    Serial.print("\t output = ");  
    Serial.println(outputValue); 

    // wait 10 milliseconds before the next loop 
    // for the analog-to-digital converter to settle 
    // after the last reading: 
    delay(10);      
} 

Muchas gracias por las respuestas.

Respuesta

11

La salida analógica sólo tiene un rango aceptable entre 0 y 255.

Por lo tanto, el valor tiene que ser asignada dentro del rango aceptable.

documentación para el método de mapa está aquí: http://arduino.cc/en/Reference/map

Debido a que el Arduino tiene una resolución de analogRead de 0-1023, y una resolución de analogWrite de tan sólo 0-255, estos datos en bruto desde el potenciómetro debe ser escalado antes de usarlo ...

Esta explicación viene de un sensor de Arduino tutorial (bajo el encabezado 'Código'): http://arduino.cc/en/Tutorial/AnalogInOutSerial

+3

Se podría argumentar que la división entera por 4 también haría el trabajo, pero map() funciona bien también. – Mchl

+3

En la mano de agarre uno podría desplazar hacia la derecha el número entero en 2. –

+0

¿Por qué se permite la entrada analógica de 0-1024 si la salida debe estar entre 0-255? –

1

¿Por qué? A veces tendrá que traducir 0 a 1023 en un rango de valores DISTINTOS de 0 a 1023 y la función map() es un intento de facilitarle esto a usted, el ingeniero. I explain one situation in some detail on this forum post, donde puedo convertir los 0 a 90 o 100 índices de una matriz que tiene valores de 0 a 1023 enteros en una gráfica x-y!

idx rangos de 0 a algún valor cerca de 100.
test[idx] es los valores de ADC, por lo rango de 0 a 1023.

int x1= map(1, 0, idxmax, 0, 160); 
int y1= yf - 2 - map(test[1], TPS_floor[_tps], TPS_max[_tps], 0, dy); 
for(idx=0; idx < idxmax-1; ){ 
    int x0 = map(idx, 0, idxmax, 0, 160); 
    int y0 = yf - 2 - map(test[idx], TPS_floor[_tps], TPS_max[_tps], 0, dy); 
    tft.drawLine(x0, y0, x1, y1, YELLOW); 
    idx++; 
    x1 = map(idx+1, 0, idxmax, 0, 160); 
    y1 = yf - 2 - map(test[idx+1], TPS_floor[_tps], TPS_max[_tps], 0, dy); 
} 

Así el código anterior se traduce un x de 0- ~ 100 y y de 0-1023 en esto: map() translated an array's index and its values into that plot!

Mi construcción es write up is here. (y a partir del 31/07/2013, está en progreso)

Personalmente, encuentro que una clara ilustración de "por qué" es la mejor explicación. Espero que mi respuesta ayude a cualquiera a cuestionar este "por qué" en cuanto a ... por qué.

+0

Muy interesante e informativo.Todavía estoy trabajando en mi camino a través de la publicación del foro, ¡pero estoy encontrando esto muy absorbente! –

+1

¡Gracias, Simon! Piense en 'map()' como algún tipo de función de escalado ...? Puedes hacer preguntas, etc. en ese foro. :) –