また茶色の積み木「入出力端子」という関数の項目を見てみると、
「デジタルで出力する」ものと、「アナログで出力する」ものがあった。
デジタルで出力する積み木をプログラムの記述領域に持ってきて、値のあたりをさわると、
スライドバーの右端にして1(逆に左にすると0)を出力できることとなっているが、実際にどんな電圧が出力されるのかを[ 前のページ ]で観察した。
もう一方のアナログ出力するものでは、
スライドバーの右端は1023である。こちらの関数では、0から1023までのどの値でも出力できることとなっている。
ところが、ここで見ている関数の端子名はどちらもP0であり、このP0は、デジタル・コンピューターのデジタル・出力端子GPIO(*1)に接続されていて、デジタル信号(真または偽)しか出せないはずだ。そこで、どのような波形が出力されるか見ていこう。
───
(*1)GPIO : general-purpose input/output 多目的入出力(端子)
───
そこで、マイクロビットにアナログ出力させるためのプログラムを作くる。
このプログラムで、変数[アナログ出力]は、どのような値をとるか?
fig.4で行う計算の進行にあわせてfig.5のプログラムにて変数[アナログ]出力を記録したものをfig.6に図示した。
変数[アナログ出力]の値は、プログラムの進行時間とともに63, 127, 255, 511となっていた。
さて、いよいよプログラムfig.4を実際にマイクロビットへインストールして、実行したときのP0の電圧波形を観測する。
青い線がP0の電圧をあらわしています。このグラフの横軸が時間、単位は秒、縦軸が電圧、単位がボルト。0Vと3.3Vとの間をカチカチと切り替わるような波形を示していることが見えました。この波形をパルスと呼びます。pulseは、心臓のドキドキをあらわすようなことばです。また、この波形は、前に見たデジタルで出力した場合と同じようなものです。
この波形の電圧が高い(high)部分をHレベルと呼びます。Hレベルの継続時間をパルス幅[秒]と呼びます(ここでは、角かっこ[と]で単位を記します)。アナログ出力の値が63、127、…増えると、パルス幅が大きくなっています。
逆に低い(low)部分をLレベルと呼びます。HレベルとLレベルの継続時間と合わせて周期[秒]と呼び、これはアナログ出力の値が増えてもかわりません。パルス周期を設定する積み木(関数)もありますが、このプログラムfig4 では、引用を省きましたので、あらかじめ設定されていた20[ms]となっています。このような値をデフォルト(default)の値と呼びます。
ここで、アナログ出力の積み木(関数)の値の欄に設定できる最大の値が1023となっていたのを思い出してください。この関数の仕組みのなかで、周期を1023に刻み、これに対して、アナログ出力関数の値は、何刻みのパルス幅を出すかを指示するものだったわけです。つまり周期にしめるパルス幅の割合(duty ratio)を示していることになります。
63 127 255 512
アナログ出力関数の値 = { ─────、─────、─────、───── } … 第1式
1023 1023 1023 1023
という分数の形に書ける比率を出力すると考えることができます。
パルス波形(fig.7)から「繰り返し」ループごとのパルス幅を測定すると、1.2、2.5、5.0、10[ms]でしたので、周期20[ms]で割ると、それぞれ、6%、12%、25%、50%ですので、第1式と合うことが確認できました。
このような方法は、パルスの幅に出力したいアナログ値を託するということから、パルス幅変調(Pulse Width Modulation)と呼ばれます。
また、デジタル計算から得られる数値を周辺機器へアナログ変換して送るという意味では、『デジタル・アナログ変換する』と言うこともあります。この言い方の場合、その分母にあたる1023は、量子化ビット数と言い、機器設計上の基本的な検討事項となります。
ところで、赤い線はトリガー信号と呼びます。triggerはものごとのきっかけという意味ですが、ここでは、アナログ信号を63, 127, 255, 512と出力する「ずっと」ループの開始を知るために発生させました。
また、緑色の線は、アナログで出力する値の変化させる「繰り返し」ループの開始を知るために発生させました。P0の波形を観察するときに、これらの信号を併せて使うことでプログラムとの対応がわかりやすくなりますので、このような実験を行うときには、併せて出力できるように仕組んで置くようにいたしましょう。
このあと、このプログラムで生成した信号波形でLEDを点灯します。
このプログラム(fig.4)では、出力する値の計算をする変数を「明るさ」と命名してありました。もしこの信号波形で白熱電灯の点灯ができれば、それにより「明るさ」をじょじょに増やしていくことができるからです。でもポートにはそのような重たい負荷は駆動できません(データーシート上は、全ポートの合計で100mA未満)ので、電力増幅器を介する必要があります。まだそのじゅんびが無いので、ここでは直接点灯できるLEDを負荷(約2mA)として観測します。
明るさをだんだん変えるように、dutyを6%、12%、25%、50%と変更してみたのだが、ビデオ映像ではむずかしいようだ。LEDを通過する電流値に変わりは無く、したがって、同じ光量で点滅する。直接観察するときにはそれを視覚が明るさの変化として感ずることができる。もっと応答速度の遅い負荷、例えば、小型の直流モーターの速度はこのようなパルス幅変調(PWM)で調節できる。
実験した回路について、ポートP0を理想電圧源3.3Vで置き換え回路図にするとこんなかんじになる。ノードN2の電圧が1.2V程度であったので、LEDを流れる電流はつぎのような式で計算できる。
1.2/470
約2.6mAである。
最後にデジタルポートに直接スピーカー(イヤーホーンにペットボトルのラッパを付けたもの)を鳴らす実験を見てほしい。真偽しか出さないポートでも平城山を歌っているのがなんとか聞き取れる。
───本項は、これでおしまいです。 2021/6/3───
あなたもジンドゥーで無料ホームページを。 無料新規登録は https://jp.jimdo.com から