アナログ信号入力
wikiを見ても,電圧値に対してどんな数値が得られるのかわからなかったので,テストしてみました
ソースコードはwikiそのまま
void setup() {
Serial.begin(115200);
pinMode(A0, INPUT);
}
void loop() {
int loudness = analogRead(A0);
Serial.print("Loudness: ");
Serial.println(loudness);
delay(50);
}
適当なPINとアナログ信号入力用PINのA0
をつないでみると,
- GND接続 :
loudness = 0
- 3V3接続 :
loudness = 1023
- 5V接続 :
loudness = 524
となり,おそらく0~1023の間の数値として得られます.
また,3.3Vを超えるとオーバーフローするみたいです.
線形性の確認
5Vの入力値を,オーバーフローを考慮して loudness = 524 + 1024
とすると,
線形になり,単純な変換で電圧値を得られそうです.
今回必要な電圧は3.3V以下だったので,とりあえず以下のような関数を作成しました.
double AIN2V(double AIN){
// V is 0[V] <= V <= 3.3[V]
// 3.3[V] -> AIN = 1023
// 5.0[V] -> AIN = 524 = (1023 + 524) - 1023
double V = 3.3/1023 * AIN;
return V;
}
入力値AIN
と電圧値V
の関係は以下の通り.
\begin{align}
3.3 : 1023 &= V : AIN \\
V &= \frac{3.3}{1023} \times AIN
\end{align}
電圧測定
最終的なソースコードは以下の通り.
double AIN2V(double AIN){
// V is 0[V] <= V <= 3.3[V]
// 3.3[V] -> AIN = 1023
// 5.0[V] -> AIN = 524 = (1023 + 524) - 1023
double V = 3.3/1023 * AIN;
return V;
}
void setup() {
Serial.begin(115200);
pinMode(A0, INPUT);
}
void loop() {
double loudness = analogRead(A0); //型を int から double に変えている
double V = AIN2V(loudness);
// serial output
Serial.print("Loudness: ");
Serial.println(loudness);
Serial.print("V: ");
Serial.println(V);
delay(50);
}
適切に出力できています.
Loudness: 232.00
V: 0.75