↑どうぞ
はじめてのシリアル通信でarduinoIDE上のシリアルモニタで文字列の表示ができたでしょうか?
それがクリアできたら次はいよいよアナログ−デジタル変換(A/D変換)して、その値をシリアル通信によってシリアルモニタに表示させましょう。
これができるようになれば、単純に抵抗にかかる電圧、温度、湿度、CO2、可視光線、紫外線、近赤外線の強度などのアナログ量もarduinoに入力してデジタル量として扱えるようになりarduinoでできる事の幅が一気に広がります。
夢は無限大、人生は冒険や!! とりあえずやってみよ!
やる事の目標
この記事まで到達しているという事は臨床工学技士のアナタとそうでないアナタは、arduinoビギナーからarduino中級者へと変貌している事でしょう。
前回までのシリアル通信によってシリアルモニタ上で文字情報を表示させる事ができたんですから素晴らしいです。
今回は、センサの値をアナログ/デジタル変換して尚且つその値をPCにシリアル通信で表示させます。
まずね、電圧というのはアナログ量なんです。
アナログ量というのはデータ量が無限大なわけです。
”よくアナログは画質や音質がよくないと考えている方いますが、それは誤りです。本当はアナログの方が画質も音質も良いのですが、その昔、レコードやカセットテープなどにアナログ量の一部をアナログとして保存していた時代に、その当時発明されたデジタルデバイスと比べてそれまでのアナログ製品の質が悪いという事で誤解が生じたまでです。”
私たちが見て、感じている世界はアナログでできています。そんな無限大のデータ量をほこるアナログ量をarduinoで扱いたい、そしてその量を表示させたいというのが今回の目標です。
いるもの
- arduino UNO R3
- 可変抵抗 3本足のやつならなんでもOK 今回は10KΩを使用
- A/D変換の少しの知識(後述します)
- やる気
上記4つ必要です。
A/D変換の知識
まず、アナログ/デジタル変換する上で知っておく必要のある事はずばりA/D変換って何?って事です。
簡単にいうとarduinoでできるA/D変換は5Vという連続した電圧を10bitで限りある量に変換する事をいいます。
arduinoはデジタルの機器なので、アナログ量は扱えません、ですので電圧などもデジタルの数値に変換しないとプログラム上であつかえませーん。
そこでarduino UNO R3ではA/Dコンバータが内蔵されていて10bit(1024段階)のA/D変換ポートがA0-A5までの6ポート用意されております。
ちなみにですが、A/D変換にはもっと細かく変換するコンバーターを搭載するarduinoがあったり、arduinoに接続して使うA/Dコンバーターがあったりします。
そういうものがなぜ存在するかというと、より細かい値をセンサから読み取るといった場合に必要なんです。
さて、本題に戻りますが5Vを10bitでコンバートするとどうなるか?ですがまず、コンバーターに5Vの入力があればデジタル値は1023となります。
逆に0Vならデジタル値は0です。
そうです、5Vを1024で分割すると1デジタル値の値になります。
10bitでは5vならおおよそ1段階で5mv程度になります。
A/Dコンバーターに仮に2.5Vが入力されていれば2.5Vは2500mvなので、2500÷5でデジタル値としては500となります。
なんとなくわかりました?逆にデジタル値さえわかれば電圧の値にも変換できます。
デジタル値で600なら600×5mvで3000mvで3Vです。
arduinoが5vまでの電圧計に早変わりですね。
こんな感じで他のセンサも温度の変化で、例えば36度で2.5Vを出力するセンサがあったりとA/Dコンバーターが使えると色々できるという事がわかったと思います。
回路図
今回は可変抵抗をつかって0から5Vの電圧をA/Dコンバーターに入力します。
入力された電圧はA/D変換されて0−1023までのデジタル値へと変換され、シリアル通信によってシリアルモニタ上に出力します。
それでは回路図をどうぞ↓
むっちゃシンプルです。可変抵抗は10kΩから100kΩ程度でOKです。
真ん中の端子がA0ピンに行くようにします。
あと2つの端子に電源電圧の5VとGNDを繋ぐだけです。
プログラムについて
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); int volts = sensorValue*5; Serial.print("読み取ったデジタル値==>"); Serial.println(sensorValue); Serial.print("電圧は==>"); Serial.println(volts); delay(100); } |
シリアル通信の設定は前記事の通り、
今回はint sensorValue = analogRead(A0);という新しいプログラム文があると思います。
これはsensorValueという数値を入れる入れ物(intと宣言:変数のデータの一つです。)にanalogRead(A0)でA0ピンからアナログ値をコンバーターに入力させデジタル値をsenseorValueに入れるというプログラムです。
それだけでもいいんですが、入手したデジタル値から入力された電圧を計算してみます。
上記で触れましたが10bitで5vをA/D変換したら1段階あたりだいたい5mvですので
int volts = sensorValue*5;
↑のようにデジタル値に5をかけて電圧(mv)を計算しています。
arduinoに書き込んで本当に動くかやってみてください。
可変抵抗をグリグリ回すと200ms毎に値が動いて面白いと思います。
このようにして、入力されてたアナログ値から様々な計算をしてセンサーが得た情報から得たいセンサー数値に変換するという技法も学べましたね??
終わりに
ここまできたら結構なんでも作れるところまで来ています。
LEDを光らせ、A/Dコンバータも使え、シリアル通信もマスター!!!
すごいです。
今回は可変抵抗で可変した電圧をA/Dコンバートしましたが、ぜひ温度センサや光によって抵抗値が変わる素子があるのでそういったセンサも試してみる必要がありますね。
暗くなると反応して何かを行う装置を作ったり、温度がある一定以上になったらお知らせしたり、反応する装置を作ったりと色々できそうです。
そういう装置を作る際に役立つのがA/D変換なんですね。