アナログ入出力について(Grove Beginner Kit For Arduino検証報告)

Grove Beginner Kit For Arduino(以下、Beginner Kit)検証報告の4番目です。前回の記事はこちらです。
hirocom777.hatenadiary.org

以前にも書きましたが、僕は、これとは別にマイコンボードArduinoUNOの連載記事を書いています。

hirocom777.hatenadiary.org

この連載では、僕の勉強がてらArduinoUNOを使っての開発の始め方から基本的な内容をまとめていって、最後には極簡単なツールを作ってみようという感じで進めています。でも、この連載では基本の一部であるアナログ入出力の処理について触れていません。自分でも、どう書き進めていけばいいか悩んでおりましたのです。僕自身、あまり積極的にアナログ入出力を使用した経験もありません。
 そこにこのBeginner Kit。程よい感じでアナログ関係の入力、センサーモジュールが接続されています。

と言う訳で今回は、アナログ入出力について見ていきたいと思います。

f:id:HiroCom777:20200810233023j:plain

Beginner KitのCPUボードアナログ入出力

 他のCPUでも大概そうなのですが、Beginner KitのCPUボードアナログ入出力も本当のアナログ回路が搭載されているわけではありません。一般のデジタル入出力が0か1(0Vか5V)の2つだけなのに対して、アナログ入出力は信号を様々な工夫で入力は0~1023の1024段階、出力は0~255の256段階で処理しています。(本当のアナログ回路が実装されているものもあります。)では、どのような工夫をしているのか見てみましょう。

アナログ入力

 まずはアナログ入力から見てみましょう。Beginner KitのCPUボードには、0~20の番号が振られている21本のに入出力ピンがあります。この内、14~20については、アナログ入力機能が備わっています。具体的にはADコンバーターという機能が実装されており、この機能を使用すると入力ピンにかかっている電圧(通常は0~5V)を0~1023の1024段階の数値で返します。0Vなら0、2.5Vなら512、5Vなら1023みたいな感じです。つまり、検出値によって0~5Vの電圧を返してくれるセンサーであれば、電圧を読み取ってCPUボードで処理できると言う訳です。14~20番ピンをアナログ入力として使用する際にはスケッチ内でA0~A6と書いたりします。(14~20でも問題ありません)

アナログ出力(PWM-パルス幅変調)

 それではアナログ出力はどのようにして実現しているのでしょうか?こちらはPWM(パルス幅変調)という機能を使用して実現しています。3, 5, 6, 9, 10, 11番ピンにはこの機能が備わっていて0~255の数値を指定すると、数値に合わせた信号を出力します。その信号とは、繰り返しの矩形波(0V-5Vを一定の周期で繰り返す)なのですが、設定された数値によって以下のように波形が変わります。

LOWの比が多い(設定値0に近い)
f:id:HiroCom777:20200327221813j:plain
HIGH/LOW半々(設定値127くらい)
f:id:HiroCom777:20200327221906j:plain
HIGHの比が多い(設定値255に近い)
f:id:HiroCom777:20200327221745j:plain

設定値が0の時は0V固定。255の時には5V固定になります。波形を変えることによって出力先に供給する電気量を変えているのです。因みに3, 9, 10, 11番ピンは490 Hz。5, 6番ピンは980 Hzで出力します。

動かしてみる

 それでは実際に動かしてみましょう。CPUボードの14番ピン(A0)には、ポテンショメーターが接続されています。これを使って0~5Vの電圧を入力して。LEDモジュールの明るさを変えてみましょう。ポテンショメーターのつまみを回すことによって、14番ピンに0~5Vの電圧を調整して入力することが出来ます。入力された電圧は入力ピンのADコンバーターで0~1023の値に変換されます。この値をLEDが繋がっているピンにアナログ出力の形で出力すればいいという寸法です。

ちょっと問題

 でも、ちょっと問題があるんです。Beginner Kitでは、LEDモジュールは4番ピンに接続されています。アナログ出力に対応しているのは3, 5, 6, 9, 10, 11番ピン。4番ピンは非対応です。そこでちょっと考えました。アナログ出力対応の6番ピン(CPUボード上でD6と表示のあるGROVEコネクタ)と、LEDモジュールのGROVEコネクタを添付のGROVEケーブルで接続してしまいましょう!!

スケッチの準備

以下のスケッチを準備しました。

void setup() {
  pinMode(4, INPUT);
  pinMode(6, OUTPUT);
  pinMode(A0, INPUT);
}

void loop() {
  analogWrite(6, (1023 - analogRead(A0)) / 4);
}

LEDがパターン接続してある4番ピンは、使用しないので入力に設定しています。(6番ピンをケーブルで繋げるので故障防止のため入力に設定します。出力同士でピンを接続すると故障の原因になります)
GROVEケーブルでCPUボードのD6コネクタと、LEDモジュールを繋げてから書き込み、実行してください。ポテンショメーターを回すにしたがってLEDの点灯明るさを調整できます。

・analogRead()
 analogReadはArduinoのアナログ入力対応ピン(ArduinoUNOの場合14番以降)の入力状態を返します。以下のように記述します。

 analogRead(ピン番号);

入力された電圧に対して、0~1023の値を返します。

・analogWrite()
 analogWriteはArduinoのPWM出力対応ピン(ArduinoUNOの場合5, 6, 9, 10, 11番)に出力状態(0〜255)を設定するコマンドです。以下のように記述します。

 analogWrite(ピン番号、出力状態(0〜255));

以上の2つのコマンドでアナログ信号を(疑似的に)処理しています。

その他のアナログモジュール

 アナログ入出力について大体わかりました。次回はアナログ入出力で使用されているその他のモジュールについて見ていきます!!
hirocom777.hatenadiary.org


Arduino Grove Beginner Kit For Arduinoの連載記事はコチラからどうぞ!!