本部落格已搬遷, 3秒後跳轉...

Arduino UNO:RGB模組、PWM、負數 | Laplace's Lab

Arduino UNO:RGB模組、PWM、負數

What happens if we give a negative value to analogWrite() ?當我看了learning kit提供的、關於RGB模組的範例,在輸出給RGB的數值變化過程中是有出現負值的,於是我困惑了很久,想弄明白analogWrite()如何處理負數。

PWM

PWM = Pulse Width Modulation,脈衝寬度調變,是一種利用數位脈衝訊號模擬類比訊號的技術,如何模擬呢?我們知道數位訊號只有0與1兩種狀態,也就是低電位與高電位,而在頻率不變的狀態下,改變工作週期大小,使整體平均電壓值上升或下降來做到控制或節能的行為,這就是PWM。白話點說呢,就是快速的開、關、開、關、開、關…以LED燈來說,就是快到肉眼無法察覺的程度,當我們調整工作週期中開和關的持續時間比例,若開的時間較長,那麼LED燈看起來就比較亮,反之則較暗。

在Arduino中可用PWM模擬0~5v之間的電壓。圖片連結自arduino.cc⬇︎

RGB Module

我手邊的是共陽極RGB模組,也就是其4根接腳為VCC、R、G、B。

RGB模組範例程式:
此範例使用有PWM功能的digital I/O pin 9 ~ 11,原始範例是有對這3個腳位設定pin mode,但Arduino官方說analogWrite()不需要設定pin mode喔

You do not need to call pinMode() to set the pin as an output before calling analogWrite().
The analogWrite function has nothing to do with the analog pins or the analogRead function.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#define PIN_G 9
#define PIN_B 10
#define PIN_R 11

void setup() {
Serial.begin(9600);
}

void loop() {
for (int i = 255; i > 0; i--) {
int blue = 128 -i;
//twos_complement(blue);

analogWrite(PIN_R, i);
analogWrite(PIN_B, blue); // 127 -> 0 -> 127
analogWrite(PIN_G, 255 - i);

delay(50);
}

for (int i = 0; i < 255; i++) {
int blue = 128 -i;
//twos_complement(blue);

analogWrite(PIN_R, i);
analogWrite(PIN_B, blue); // 128 -> 0 -> 126
analogWrite(PIN_G, 255 - i);

delay(50);
}
}

void twos_complement(int binary) {
if (binary < 0) Serial.println((~binary) + 1);
else Serial.println(binary);
}

analogWrite()

從上面的範例程式可以看到,analogWrite()寫入RGB module的B pin值,也就是for loop中的變數blue,它是會出現負值的。但analogWrite()只接受0 ~ 255之間的值呢???後來我找到一篇文章說Arduino使用二補數來處理負數,於是我寫了twos_complement()來計算二補數並print出實際上寫入B pin的值。

Ref.

https://www.arduino.cc/en/tutorial/PWM
http://wiki.csie.ncku.edu.tw/embedded/PWM
https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/
https://techexplorations.com/blog/arduino/blog-what-happens-if-you-give-a-negative-pwm-value-to-analogwrite/

0%