記事

はじめてマイコン・ボードArduinoを使ってみる(8)

入出力命令とif文を使ったプログラム

プログラムを修正
 前回のプログラムは、スイッチが押されたときにLEDが点灯するという内容でした。プログラムのloop()関数は次に示すように、入力処理、if文による比較チェック、比較結果に基づき指定された方法でLEDの点滅を行います。
 sw_portは入力、led_portは出力のピンを割り当てていました。

void loop() {
   sl_data = digitalRead(sw_port);
   if (sl_data == 0) {
       digitalWrite(led_port, HIGH);
  }
   else {
       digitalWrite(led_port, LOW);
  }
   delay(30);
}

if文の中でスイッチの値を読み取る
 if文の式の中には変数や定数以外に関数を利用することもできます。上記のloop()関数の初めの2行は、次の1行にまとめることもできます。

if (digitalRead(sw_port) == 0) {


HIGH、LOWの代わりにdigitalRead()関数を用いる
 digitalWrite(pin,value)にはHIGH、LOWのシステム提供の定数以外にも、digitalRead(pin)の関数、整数も利用できます。整数の場合は0のLOW、0以外はHIGHとして扱われます。
 前回作成した、プログラムのloop()関数は、次のように記述することも可能です。

void loop() {
   digitalWrite(led_port,digitalRead(sw_port));
}


 このプログラムでは、スイッチを押していないときはLEDが点灯し、スイッチを押しているときだけLEDが消灯します。
 前回の回路で、スイッチが押されたとき入力はGNDとほぼ同じ値になります。そのため、digitalRead(sw_port)の値はLOWまたは整数型に読み込めば0となります。
 前回のテスト回路では、LEDの接続ポートでLOWを出力するとLEDは消灯します。そのためにはスイッチが押されていないとき、digitalRead(sw_port)の値はHIGHになり、その結果をLEDポートに書き出すとLEDが点灯します。
 スイッチとLEDの関係を逆にできると都合が良いので、スイッチを押したときにLEDが点灯するために否定の演算子  (not)を用います。
  演算子 !をLOWに付加して、!LOW とすると値はHIGHと同等になります。
 !HIGHはLOWと同等となります。
 ! digitalRead(sw_port)をvalueとして、次のように変更します。

digitalWrite(led_port,!digitalRead(sw_port));


 この変更で、スイッチを押したときにLEDが点灯するようになります。

アナログ入出力
 Arduinoのアナログ入力ポートは、A0~A5の六つが用意されています。デフォルトでは、アナログ入力ポートに加わる電圧を電源電圧の1/1024の分解能でアナログ-ディジタル変換して0~1023の整数値として得ます。0から電源電圧の5Vまでの電圧がアナログ入力ポートに加わっている場合、電圧の大きさに応じて0~1023の間の整数値が得られます。
 アナログ出力はPWMと呼ばれる手法で、0で0V~255で電源電圧となるように設定する数値に応じた大きさの電圧が出力されます。

led03.png


 上記のテスト回路を、次に示すようにブレッドボードに用意します。可変抵抗(ボリューム)は端子にリード線をはんだ付けしたものでも、写真のように半固定抵抗でも同じ結果が得られます。
 10kΩの半可変抵抗(ボリューム)の両端をGNDとプラスの電源に接続しています。中間タップはアナログ入力ポートA1に接続し、LEDを駆動するポートをアナログ出力(PWM)に対応しているD6に接続します。

ボリュームから読み取った値でLEDを点灯する
 ボリュームの電圧の変化をアナログ入力ポートで読み取り、その変化する値をアナログ出力ポートに出力します。アナログ出力に接続されてLEDの点灯状態がどのようになるか確認します。
 ボリュームから読み取った値は analogRead(A1) で求められます。この値をアナログ出力する命令は analogWrite(6,analogRead(A1)); となります。
 アナログ入力、アナログ出力の命令は、初期化することなく利用できます。そのため、ボリュームを変化させて、LEDの点灯状態を制御するプログラムは、次のように1行記述するだけのシンプルなものとなります。
 setup()関数は必須ですので、中身は何の命令も記述されていませんが用意されています。

led01.png

 このプログラムを次に示すArduinoのテスト回路に書き込みます。
 ボリュームのGND側に振り切るとLEDは消灯します。ボリュームを回していくだんだんLEDの明るさが増します。明るさが増しますが、途中3回明るさがピークになったと思われる時点で消灯し、ボリュームの回転に合わせて明るさが再度増し繰り返します。

led02.png


 この動作は、ボリュームから読み取った値は0~1023となりますが、LEDの明るさを制御するアナログ出力で設定する値は0~255となることによります。
 次に示すように、アナログ入力の値を1/4にするとボリュームの回転に合わせて消灯から最大の明るさになります。

analogWrite(6,analogRead(A1)/4);


 次回、上記の推論が正しいか確認するために、ボリュームから読み取った値をシリアル通信でPCに送りArduinoIDEのシリアル・モニタで確認します。


(2016/1/29 V1.0)

<神崎康宏>

バックグラウンド

1/1024の分解能;Arduino Unoに搭載されているマイコンは10ビットA-Dコンバータが内蔵されています。ディジタルに変換するときに2^10=1024の分解能があります。マイコンには1個のA-Dコンバータが入っています。入力部分に6入力の切り替え回路があるので、アナログは6チャネル扱えます。

半固定抵抗;プリント基板上などで、時々回す、という用途にはボリュームではなく、半固定抵抗がよく使われます。リード線は、ボリュームと同じく3本出ています。回路図記号で抵抗の中ほどにある中間タップの端子は「摺動子」と呼ばれ、回路図によって2番の番号が振られています。ドライバで表面のくぼみを回すと、摺動子の位置が変化します。

 ドライバで回しても両端の値10kΩは変わりません。回路図記号でみると、摺動子の上側と下側の抵抗値の比率が変化します。したがって、抵抗の両端に0Vと5Vをつなぐと、抵抗の比率に比例した電圧が2番に出ます。

vr1b.png

アナログ出力;Arduinoは、人の感覚的にはアナログの出力が出ます。精密にみれば出ているのはディジタル信号です。マイコンではよく使われる手法です。次回、実際の波形を見ます。

連載メニュー はじめてマイコン・ボードArduinoを使ってみる

(1)  マイコン・ボードArduinoの開発は無償ツールで行える

(2) 開発環境のArduinoIDEをインストール その1

(3) 開発環境のArduinoIDEをインストール その2

(4) 開発環境ArduinoIDEをマスタする

(5) 動作確認をするためにLEDの点滅を行う

(6) サンプル・プログラムBlinkの実行準備

(7) スイッチが押されたときにLEDが点灯するプログラムを作る

(8) 入出力命令とif文を使ったプログラム

(9) シリアル・モニタを使うとプログラムの動きがよくわかる