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;
c_cpp Arduino地图价值 - 来自https://www.arduino.cc/en/Reference/Map