2012-01-26 21 views
7

Tôi chỉ đang xem xét một số mã ví dụ và đã bắt gặp một dòng, tôi không hiểu rõ tại sao nó cần được thực hiện. Tôi hiểu rằng bạn đang tham gia vào một giá trị tương tự. Giá trị này nằm trong khoảng từ 0 đến 1024? Tại sao điều này? Tại sao đầu ra cần phải được ánh xạ giữa 0 và 255? Điều gì ra lệnh cho các đối số được sử dụng ở đây? Các dòng trong câu hỏi:Phương thức Arduino map() - tại sao?

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

Nổi bật trong các mã:

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);      
} 

Cảm ơn rất nhiều cho các câu trả lời.

Trả lời

11

Các đầu ra analog chỉ có một phạm vi chấp nhận từ 0 đến 255.

Do đó, giá trị phải được ánh xạ trong phạm vi chấp nhận được.

Tài liệu cho phương pháp bản đồ là ở đây: http://arduino.cc/en/Reference/map

Vì Arduino có một độ phân giải analogRead của 0-1023, và độ phân giải analogWrite chỉ 0-255, đây dữ liệu thô từ các chiết cần được nhân rộng trước khi sử dụng nó ...

lời giải thích này xuất phát từ một hướng dẫn cảm biến Arduino (dưới tiêu đề 'Mã'): http://arduino.cc/en/Tutorial/AnalogInOutSerial

+3

Người ta có thể tranh luận rằng phân chia số nguyên của 4 sẽ thực hiện công việc, nhưng map() cũng hoạt động tốt. – Mchl

+3

Trên tay nắm chặt có thể dịch chuyển số nguyên theo 2. –

+0

Tại sao analogInput được phép là 0-1024 nếu đầu ra phải nằm trong khoảng 0-255? –

1

Tại sao? Đôi khi bạn sẽ cần dịch từ 0 đến 1023 thành nhiều giá trị KHÁC 0 đến 1023 và chức năng map() là một nỗ lực để giúp bạn, kỹ sư này dễ dàng hơn. I explain one situation in some detail on this forum post, nơi tôi có thể chuyển đổi 0 đến 90 hoặc 100 chỉ mục của một mảng có giá trị từ 0 đến 1023 số nguyên thành một đồ thị x-y!

idx dao động từ 0 đến một số giá trị gần 100.
test[idx] là các giá trị ADC, vì vậy dao động từ 0 đến 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); 
} 

Vì vậy, các mã trên chuyển một x 0- ~ 100 và y của 0-1023 vào điều này: map() translated an array's index and its values into that plot!

My build's write up is here. (và từ 7-31-2013, đang diễn ra)

Tôi, cá nhân, thấy rằng minh hoạ rõ ràng về "lý do" là giải thích tốt nhất. Tôi hy vọng rằng câu trả lời của tôi sẽ giúp bất cứ ai đặt câu hỏi này "tại sao" là ... tại sao.

+0

Rất thú vị và mang tính thông tin.Vẫn đang làm việc theo cách của tôi thông qua các bài diễn đàn nhưng tôi đang tìm kiếm này rất hấp thụ! –

+1

Cảm ơn, Simon! Hãy nghĩ về 'map()' như một dạng chức năng mở rộng quy mô nào đó ...? Bạn có thể đặt câu hỏi, v.v. trên diễn đàn đó. :) –