Arduino map() 方法 - 为啥?

Posted

技术标签:

【中文标题】Arduino map() 方法 - 为啥?【英文标题】:Arduino map() method - why?Arduino map() 方法 - 为什么? 【发布时间】:2012-02-19 21:37:20 【问题描述】:

我只是在查看一些示例代码并遇到了一行,我不完全理解为什么需要这样做。我了解您正在接受模拟值。这个值显然在 0 到 1024 之间?为什么是这样?为什么输出需要映射在 0 到 255 之间?什么决定了这里使用的论点?有问题的行:

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

非常感谢您的回复。

【问题讨论】:

【参考方案1】:

模拟输出的可接受范围仅在 0 到 255 之间。

因此,该值必须映射在可接受的范围内。

地图方法的文档在这里:http://arduino.cc/en/Reference/map

由于 Arduino 的analogRead 分辨率为0-1023,analogWrite 分辨率仅为0-255,因此电位计的原始数据需要在使用前进行缩放...

此解释来自 Arduino 传感器教程(在“代码”标题下):http://arduino.cc/en/Tutorial/AnalogInOutSerial

【讨论】:

有人可能会说,整数除以 4 也可以,但 map() 也可以正常工作。 如果输出必须在 0-255 之间,为什么模拟输入允许为 0-1024? @SimonKiely 我不确定技术限制或导致这些限制的设计决策。如果我猜的话,这与微控制器因尺寸、内存等各种原因而受到限制的事实有关,设计人员认为更高的输入分辨率比高输出分辨率更有用。 @SimonKiely 这个链接解释了输入分辨率:arduino.cc/en/Tutorial/AnalogInputPins我确定输出也有类似的限制。 非常感谢,非常有趣且内容丰富的回复! :)【参考方案2】:

为什么?有时您需要将 0 到 1023 转换为 0 到 1023 以外的值范围,而 map() 函数试图让工程师更容易做到这一点。 I explain one situation in some detail on this forum post,我可以将具有 0 到 1023 个整数值的数组的 0 到 90 或 100 个索引转换为 x-y 图形图!

idx 范围从 0 到接近 100 的某个值。test[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 和 0-1023 的 y 转换为:

我的构建是write up is here。 (截至 2013 年 7 月 31 日,正在进行中)

我个人认为,“为什么”的清晰说明是最好的解释。我希望我的回答能帮助任何质疑这个“为什么”的人......为什么。

【讨论】:

非常有趣且内容丰富。仍在努力通过论坛帖子,但我发现这非常吸引人! 谢谢,西蒙!将map() 视为某种缩放功能...?欢迎您在该论坛上提问等。 :)

以上是关于Arduino map() 方法 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用串行通信在 python 和 arduino 之间进行同步

arduino定义引脚为啥要用const??不用可以吗 const int ledPin=13;

Arduino上输入数字,蓝牙里为啥返回的是字母?

Arduino开发-TFT_eSPI库学习

为啥arduino uno只能保留两位小数

c_cpp Arduino地图价值 - 来自https://www.arduino.cc/en/Reference/Map