2012-01-26 11 views
7

私はいくつかのコード例を見ていて、行を見つけたので、なぜそれを行う必要があるのか​​完全に理解していません。私はあなたがアナログ価値を取り入れていることを理解しています。この値は0から1024の間です。どうしてこれなの?出力を0と255の間でマッピングする必要があるのはなぜですか?ここで使われている議論は何を指していますか?問題の行:コードで強調表示Arduino map()メソッド - なぜですか?

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

:回答について

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

どうもありがとうございました。

答えて

11

したがって、値が許容範囲内にマッピングされなければならない

0〜255のアナログ出力のみ許容範囲を有しています。マップ方法について

ドキュメントはこちらです:http://arduino.cc/en/Reference/map

Arduinoのは、0-1023のanalogReadの解像度を持ち、かつ唯一の0〜255のanalogWrite解像度なので、ポテンショメータからこの生データをスケーリングする必要がありますそれを使用する前に...

この説明は、( 'コード' ヘッダーの下)Arduinoのセンサーのチュートリアルから来ている:http://arduino.cc/en/Tutorial/AnalogInOutSerial

+3

4で整数除算を行っても問題はありませんが、map()もうまく機能します。 – Mchl

+3

グリップハンドでは、整数を2だけ右にシフトできます。 –

+0

出力が0〜255の間でなければならないのはなぜanalogInputは0〜1024ですか? –

1

なぜ?場合によっては、0から1023を0から1023以外の値の範囲に変換する必要があり、map()関数はこれをエンジニアにとって簡単にするための試みです。 I explain one situation in some detail on this forum postここで、0〜1023の整数値を持つ配列の0〜90または100のインデックスをx-yグラフィカルプロットに変換できます! 0から100
test[idx]周辺のいくつかの値に

idx範囲はADC値であるので、0から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); 
} 

したがって、上記のコードは、0〜約100のXを変換しyを0〜1023に設定します。 map() translated an array's index and its values into that plot!

マイビルドwrite up is here (および7-31-2013現在進行中)

私は、個人的に、「なぜ」が最も良い説明であることがわかります。私は私の答えが誰にも "なぜ"なぜこのような質問をするのを助けてくれることを願っています。

+0

非常に興味深く有益です。まだフォーラムのポストを通って私の方法を働いていますが、私はこれを非常に吸収していると感じています –

+1

ありがとう、サイモン! 'map()'をある種のスケーリング関数と考えてください...?あなたはそのフォーラムで質問などを歓迎します。 :) –

関連する問題