記事  TOPに戻る

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

■スイッチが押されたときにLEDが点灯するプログラムを作る
 今回は、ブレッドボード上のスイッチ(タクト・スイッチ)が押されている間はLEDが点灯するプログラムを作ります。

●プログラムの処理の概要

処理A スイッチの状態を読み取りデータに保存する
処理B 保存されたデータを調べてスイッチが押されていたらLEDを点灯
    保存されたデータを調べてスイッチが押されていなかったらLEDを消灯


以上の処理を繰り返します
 処理A、処理Bは独立した処理で、共有するデータを一つ有しています。

kyouyuu.png

スイッチの状態を読み取る方法
 押しボタンが押されたことが検出されたことをディジタル・ポートで読み取る回路を次に示します。抵抗とスイッチの接続点と入力ポートに設定したディジタル・ポートとを接続します。

image002.jpgスイッチがOFFの時はHIGH
 スイッチがOFFのときは、ディジタル入力ポートに接続するSW_OUTの電圧はほぼ電源電圧の値になります。ディジタル入力ポートには電流はほとんど流れません。流れても最大1μA以下です。そのため、100kΩ抵抗に1μAの電流が流れたときのこの抵抗の電圧降下は、次のように計算できます。

  E = 100kΩ×1μA
   = 100,000Ω×0.000001A
   = 0.1V


 この目的で利用する抵抗の、入力ポートの漏えい電流による電圧降下がHIGHのレベルが保たれる範囲にします。0.1Vですと悪影響を与えることはありません。

タクト・スイッチと抵抗で回路を作る
 上記の回路を前回、LEDを点滅させたブレッドボードの残りの部分に作りました。次の図の左半分です。スイッチはタクト・スイッチと呼ばれるものでボタンを押している間は接点が閉じ、ボタンから手を放すと接点は開きます。抵抗は33kΩを使用しました。

SW01a.png

●電源
 電源はArduinoの電源関係のピン・ソケットの5VとGNDから5Vは(赤いリード線)、GNDは(黒いリード線)でブレッドボードに接続しています。
信号線
 信号線はディジタル・ポートとブレッドボード間にリード線を2本配線しています。ディジタル・ポート8とスイッチの回路の抵抗とスイッチが接続された部分に茶色いジャンパ線で配線しています。ディジタル・ポート11とLEDの回路の抵抗に黄色のジャンパ線で配線しています。
 配線したブレッドボードとArduino Unoを次に示します。

haisen2.png
   ボタンを押していないとLEDは消灯

プログラム(スケッチ)の作成
 作成したプログラムは次のようになります。

image008.png

 //の1行コメントで作成日、プログラム名、作成者などをコメントで記入しておくと後で助かります。

// 2016/1/12 ardpre10010

 スイッチの状態を読み取る処理digitalReadでスイッチの状態を得ます。得た結果は、スイッチの状態を連絡するための変数に保存します。

 スイッチの状態を保存されたデータをチェックして、LEDを点灯/消灯をする処理を行います。連絡(通信する)ためのsl_data、変数を利用することでスイッチの読み取り、LEDの点滅の独立した処理にすることができます。ディジタル・ポートも変数で示すことにします。
変数は小文字表記、定数は大文字表記
 定数はINPUT、HIGHなどのシステムがあらかじめ値を決めて原則プログラムの中で変更しないものを定数と呼んでいます。定数は原則、大文字で変数名を定義しています。プログラムの中で入力ポートが読み込んだ値、計算結果などを保存するためのデータなどを格納するものを変数と呼んでいます。変数名は一般的に小文字で定義しています。

int sl_data;
int sw_port = 8;
int led_port = 11;

 ここまでが変数の定義です。ポート名を小文字にしたのは、ほかのポートをテストする場合、この変数の定義域を修正するだけで済むためです。
 Arduinoで扱うデータについての整理は、Arduinoの動きを一通り説明した後、リファレンスをベースに取りまとめる予定です。

 初期化処理(setup()関数)でディジタル・ポート、出力か入力かをpinMode()関数で指定します。pinMode()関数の一番目の引数はポート番号、入出力を定めるINPUT(入力)、OUTPUT(出力)のいずれかを指定します。

void setup() {
   pinMode(sw_port, INPUT);
   pinMode(led_port, OUTPUT);
}

void loop() {

処理A sw_portポートからスイッチの状態を読み取り、変数sl_dataに格納します。sl_dataを整数として指定しているので、HIGHなら1、LOW なら0になります。

sl_data = digitalRead(sw_port);

処理B sl_data が0ならスイッチがONなのでLEDを点灯します。
 それ以外はスイッチがOFFなのでLEDをONにします。

if (sl_data == 0) {
   digitalWrite(led_port, HIGH);
}
else {
   digitalWrite(led_port, LOW);
}

 その他必要な処理がある場合は、この部分に命令を追加します。

 次の命令はなくてもかまいません。

   delay(30);
}

 このプログラムをコンパイルしてArduino Unoにアップロードすると、ボタンを押している間、LEDが点灯します。

image010.jpg


 次回、このプログラムをほかの方法で記述することを検討し、そのジャンパ線の作り方などについて説明する予定です。

(2016/1/13 V1.0)

<神崎康宏>

バックグラウンド

押しボタン;押すと接点がONになるスイッチを指します。ここではタクト・スイッチを使っていますが、同様な動作をするプッシュ・スイッチと呼ばれるパーツもあります。タクト・スイッチの足は4本あります。回路図記号では2本しかありません。2本足のタクト・スイッチもありますが4本足のほうが多いです。

 テスタで測って確認できますが、長辺同士は内部でつながっています。押しボタンの部分は、長さが長いものや短いもの、黒色以外の色もあります。

タクトスイッチ2.png

後で助かります;助かるのは自分自身です。作成日とか、短いプログラムでも、なぜ、そうしたかなどを書いておくと、未来の自分が助かることがあります。もちろん、ほかの人がプログラムを読むときにも助けになります。コメントはプログラムの一部と考えます。

回路;電子工作では回路図を読むことは欠かせません。しかし、いろいろな記号があり、最初からは読めません。急いで専門書で勉強する方法もありますが、時間をかけてよいなら、

  • 部品と回路図記号
  • ブレッドボードの接続と回路図の配線

などは、いくつもの本Webの記事を読んでいるうちに覚えます。回路図の働きは読むだけではなかなかわからないこともあります。そのようなときは、同じように実験してみると理解が深まります。
 回路図が読めるようになったら、回路の設計へ進めます。

 なお、現在の回路図は、新旧の記号が混在しています。最新のルールに従えば、抵抗は細長い長方形の形状です。

VCC;電源のプラス側にVCCと書いてあることが多く、VDDと記述することもあります。マイナスの電源を使っているときはVEEと書き、VSSと記述することもあります。

 回路の基準電位がGNDです。なので、一般にGNDは電源のマイナスがつながりますが、そうでないときもあります。トランジスタ・ラジオが発明された当時は、GNDは電池のプラス端子がつながっていました。

GND;基準電位です。通常は0Vで、テスタで回路の電圧を測るときには黒いリード線をつなぎます。グラウンドでは、ディジタル・グラウンドとアナログ・グラウンドを区別することがあります。グラウンドには、シグナル・グラウンドとフレーム・グラウンドがあります。どちらの区別も、多くはノイズを考慮しないといけない場合に明確に分けて考えますが、通常の電子工作では区別しません。

※回路の変数は通常イタリックの書体を使います VCC 。コレクタの電圧なので、コレクタを添え字にします VCC 。また直流は大文字、交流は小文字というルールもあります。本Webでは、それらの表記ルールに従っていません。

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

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

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

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

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

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

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

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

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

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