2012-03-26 16:31:01 小鯨魚

Arduino 的MAP(資料自動對應轉換)

在使用arduino 的時候,常常會遇到一些比較難寫的問題

例如: analog 腳位讀進來是 10 bit 解析度 ,0~1024

但要使用analogWrite 時, 卻變成只能使用0~255去對腳位寫入

還得自己在那邊使用if ...else 推算對應的輸出值,或是自己掰公式

 

這種部分遇到馬達控制速度就更有難度

例如: 想要使用可變電阻來改變馬達的左右轉和速度

analog 腳位讀進來是 10 bit 解析度 ,0~1024

想要0~510 可以左轉,越接近0越快 ;512~1024 可右轉,越接近 1024 越快

通常我會自己掰公式去解決這個問題

初學者常常為了這種東西弄得很頭大

 

但其實arduino 內建的map指令可以輕鬆解決這個問題

他大約是這樣的函數原型

unsigned long map(unsigned long x, unsigned long in_min, unsigned long in_max, unsigned long out_min, unsigned long out_max) {

return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

 

所以上面的那個可變電阻要改變左右轉和速度的程式就可以輕易的寫成

r= analogRead (1);

if (r<512)

{

  digitalWrite(I1, HIGH); 
  digitalWrite(I2, LOW);
  analogWrite(5, map(r,0,510,0,255));

}

else  if (r >512)

{

digitalWrite(I2, HIGH);
digitalWrite(I1, LOW);
analogWrite(5, map(r,512,1024,0,255));

}

 

程式會比自己寫要簡單很多喔

當然自己寫的程式可以彈性較大

EX: 電阻越接近邊緣的加速度明顯大之類的,就不是MAP能辦到囉