2019年1月16日水曜日

光を追いかける自動走行車:(2)A/D変換とは?

Raspberry Pi でアナログセンサの値を取得するために、前回掲載したA/Dコンバータを使います。

arduinoをよく使う人は、ここで「あれ?」と思うかもしれません。
と言うか、私は思いました。

Arduino UNOなどのアナログ入力ピンは、A/Dコンバータ(ADC)なしでアナログセンサを接続することができます。
実は、Arduino UNOなどに使われているマイコンチップ ATmega328P は、チップにADCが埋め込まれているので
アナログ入力ピンに繋ぐといきなりA/D変換後の値を取得できます。

ところで、ハードウェア屋さんにとってはA/D変換は常識ですが、IT屋さんは、
A/D変換というのを分かっているようで分かっていないことが多いです。
そもそも、「アナログ」と「デジタル」の違いも実は怪しい人が少なくありません。
と言うか、私は分かっていませんでした。

と言うわけで、今回はA/D変換について。
  1. 材料を揃える
  2. A/D変換とは?(今回)
  3. コンバータからSPI通信で値を取得する
  4. Raspberry PiのPWMで擬似アナログ出力する
  5. モータドライバでモータ制御する
  6. 光センサからの入力とモータ制御を連動させる

アナログ値とデジタル値とA/D変換

意外とよくあるのが「実数値=アナログ値」という勘違いです。
プログラム中で値を参照できている時点でそれは全て「デジタル値」です。

また、「アナログ入力から取得した値は連続値が取れる」という勘違いもよくあります。
アナログ値がA/D変換された時点で実数の離散値になります。

さらに厄介なのが「A/D変換後の値は工学値ではない」という罠。
当然ですが、デジタル値 20(0x14) は温度20度ではありません。

ざっくり絵で描くとこんな感じ。
(1) センサの役割
大抵のアナログセンサは環境変化によって抵抗値が変化します。
この変化の仕方はセンサの特性として決まっていて、非線形なことが多いようです。
例えば、明るさが2倍になっても抵抗が2倍や0.5倍になるわけではありません。
ここまでがアナログセンサのお仕事。

(2) A/Dコンバータの役割
次に、アナログセンサをA/Dコンバータに繋いでA/D変換します。
センサの抵抗値が変わると言うことは、その両端での電圧の値が変わります。
A/Dコンバータはそれを決められたビット数に量子化します。
例えば、最大5Vの8bit A/Dコンバータなら0〜5Vを256分割。(たぶん)
本当はもっと賢いことをやっているらしいのですがイメージとしてはそんな感じ。

(3) 工学値変換の役割
最終的に摂氏などの工学値が欲しい場合はデジタル値を工学値に戻します。
センサ特性が非線形なので工学値変換も非線形になります。
また、(2)の時点で離散値になっているので、変換した工学値も離散値です。

多くの場合、A/D変換後の値をソフトウェア的に変換してやる必要がありますが、この工学値変換曲線を作るのが結構難しいと思います。
モジュール化して売られているアナログセンサの中にはは、メーカーから配られているライブラリを使うと(1)〜(3)をまとめてやってくれるものもあるようです。(温湿度センサのDHT11など)

小学生に説明してみた

A/D変換について小学四年生に説明してみました。
どこまで伝わったかは謎。



A/D変換の話が長くなってしまったので、A/Dコンバータの使い方はまた次回。
次回はSPI通信を使ってA/Dコンバータから値を取得します。

0 件のコメント:

コメントを投稿