はじめに
ここでは、Arduino UNOで デジタル入力 の実験をします。
目次へ戻るには ここ をクリック
※本ページは実験のテキストです。
デジタル入力
Lチカ(デジタル出力)の解説 では、 デジタル出力 の機能を説明しました。
Arduinoの特定のピンを5VにしたりGNDにしたりすることで、LEDを点灯/消灯できました。
今回は、 デジタル入力 です。
入力なので、スイッチ等の人間の操作をマイコンで受け取ることになります。
スイッチをブレッドボートに配置し、
「スイッチの状態をシリアル通信でパソコンに送信する」
というプログラムを作成します。
実際の作業としては
- 【ハードウェアの作業】ブレッドボードに電子部品を配置し、適切に配線する
- 【ソフトウェアの作業】配線した状態に合わせて、プログラムを作成する
の2つの作業を行います。
ブレッドボートに部品を並べる
- プッシュスイッチ(タクトスイッチ)
- 抵抗(10kΩ) 茶黒橙 (抵抗早見表)
- ジャンパ線(何本か)
が必要です。
この実験で準備している「Arduinoスターターキット」では、
赤と黒の長いジャンパ線が用意されているので、これを電源のプラス(5V)とマイナス(GND)に使うと良いでしょう。
それでは、下の画像を参考に、ブレッドボードに配線してください。
ポイントは、「プルダウン抵抗」です。
ある端子を、普段使わないときは常時OFF側にしたい、入力値としてはゼロにしておきたい場合、
「GND(0ボルト)側に落とすために抵抗を入れるテクニック」が「プルダウン」です。
下側(ダウン)に引っ張る(プルする)、です。
「プルダウンするための抵抗」を略して「プルダウン抵抗」と呼んでいます。
また、「プルアップ抵抗」もあります。
プルダウンとは逆に、常時ON(常に1)にしておくために使うテクニックです。
プルダウン抵抗やプルアップ抵抗と言う名前の特別な抵抗が売っているわけではないことに注意してください(^^;
プルダウン/プルアップに使う抵抗は、普通のカーボン抵抗や金属皮膜抵抗です。
電子部品屋さんで「プルダウン抵抗ください」なんて言わないように注意です!
初心者丸出しで超恥ずかしいですよ。(電気街で何度かそういうシーンを見たことがあります)
今回、ブレッドボードで配線作業をする際に注意すべき点をいくつか挙げておきます。
スイッチの向きに注意
プッシュスイッチを使う際、スイッチの向きに注意してください。
下図の左の様に、プッシュスイッチの左右の足は内部的に導通しています。
4本の足がすべて独立しているわけではありません。
裏側を見て、スイッチが入っている方向をしっかり確認する必要があります。
もしスイッチの縦と横の向きを間違えると、おかしな動作をしてしまいます。
実物や写真の真似をしない
ブレッドボードを組む時に絶対にやってはいけないことは、
「知り合いの作った実物や、ネットにある写真と全く同じ配置にしようとしてはいけない」
です。
思考停止して「全く同じ場所に挿せばいいや」「全く同じ色のケーブルを使えば長さも同じだ」などと考えて真似をすると、
実際には1列ズレていたり、全然違う場所に挿さっていたりして、動作しない/ショートする
というトラブルが非常に多いです。
本実験はあくまで「入門」なので、この様な参考イメージを載せていますが、
本来は回路図だけをみてブレッドボードを組めるようになっておくことが重要です。
サンプルスケッチを読み込む
では次に、ソフトウェア側の作業を行います。
スイッチの状態をシリアルで送信するプログラムは、Arduino IDEの開発環境に予め用意されています。
用意されているサンプルプログラムは、メニューバー[ファイル]の中に「スケッチ例」としてまとめられています。
それでは、サンプルプログラムを開きましょう。
[ファイル]-[スケッチ例]-[01.Basics]-[DigitalReadSerial]を開きます。
#コンパイルと、プログラムの書き込み
それでは、Lチカのプログラムをコンパイルし、書き込んだ時と同様に、
コンパイルと、マイコンへの書き込みを行ってください。
COMポートは認識しているけどプログラムの書き込みが出来ない、という場合は、
ブレッドボード上の配線で+5VとGNDが繋がってしまった「ショート状態」にあるかもしれません。
Arduinoの電源ランプを確認しましょう(下図)
このLEDが消灯している場合、どこかでショートしているので、そもそもマイコンが動いていません。
このまま放置すると、マイコンが壊れてしまう、またはパソコンのUSBポートが壊れてしまう可能性があります。
すぐにUSBケーブルを外して電源供給を断ってください!
電源がなければ安全です。その後、ゆっくり原因を探しましょう。
実行結果
シリアル通信をしてみよう の時と同様に、シリアルモニタを開きましょう。
プログラムが実行されると、下図の様に、画面上にはひたすら0
という文字が表示されます。
そしてスイッチを押すと1
に変わります。
スイッチを離せば0
に戻ります。
これが確認できれば成功です。
- 1と0がグチャグチャに交じっている
- ずっと0のまま
- 最初から1が表示される
という場合は、ブレッドボードの配線にミスがあると思われます。
それぞれの対処例を以下に解説します。
1と0がグチャグチャに交じっている
2番ピンがスイッチの足に繋がっていない、あるいは、10kΩのプルダウン抵抗がきちんと接続されていない、ことが予想されます。
デジタル入力ピンはプルダウン抵抗に繋がっていないと、値が安定せず0と1を行ったり来たりしてしまいます。
- Arduinoの2番ピンはスイッチに繋がっているか
- プルダウン抵抗の片方の足が+5Vと繋がっているか
- プルダウン抵抗の反対側の足がスイッチと繋がっているか
を確認しましょう。
ずっと0が表示され続ける
プルダウン抵抗は2番ピンへとちゃんと接続されている様ですが、スイッチが機能していないと思われます。
- スイッチの反対側の足がGNDと繋がっているか
を確認しましょう
最初から1が表示される
スイッチの向きが間違ってるかもしれません。プッシュスイッチの4本足は横方向には導通しています。
- スイッチの向きを確認する。押したときに繋がる向きで設置する。
を確認しましょう。
スケッチの解説
実際のプログラムは英語で書かれているので、日本語に訳したものを下記に示します。
/*
DigitalReadSerial
ピン2のデジタル入力を読み込み、シリアルモニターへ結果をプリントする
このプログラム例はパブリックドメインです
http://www.arduino.cc/en/Tutorial/DigitalReadSerial
*/
// デジタルピン2に接続されているプッシュボタンに変数名を与える
int pushButton = 2;
// セットアップ関数はリセットボタンが押されると1回だけ実行される
void setup() {
// シリアル通信を初期化する。ボーレートは9600bps(ビット/秒)
Serial.begin(9600);
// プッシュボタンのピンを入力モードに設定する
pinMode(pushButton, INPUT);
}
// ループ関数は繰り返し呼び出される(永久ループ)
void loop() {
// 入力ピンの状態を読み取る
int buttonState = digitalRead(pushButton);
// 入力ピンの状態をシリアルでprintする
Serial.println(buttonState);
delay(1); // 読み取り関数の安定のために、ディレイを入れる
}
それでは、それぞれの関数を見ていきましょう。
まずはグローバル変数とsetup関数です。
// デジタルピン2に接続されているプッシュボタンに変数名を与える
int pushButton = 2;
// セットアップ関数はリセットボタンが押されると1回だけ実行される
void setup() {
// シリアル通信を初期化する。ボーレートは9600bps(ビット/秒)
Serial.begin(9600);
// プッシュボタンのピンを入力モードに設定する
pinMode(pushButton, INPUT);
}
まず、int型のグローバル変数pushButton
を定義し、中身を2とすることで、
「プッシュボタンはデジタル入出力ピンの2番に接続するよ」と表現しています。
次に、setup関数の内部では、
Serial.begin
関数で、シリアル通信を9600bpsで初期化しています。
pinMode
関数ではpushButton(=2番ピン)をINPUT(入力)に設定しています。
解説:pinMode解説
図で赤く囲われているデジタル入出力ピンの「2番を入力ポートとして使う」という事です。
次はloop関数を見ていきます。
// ループ関数は繰り返し呼び出される(永久ループ)
void loop() {
// 入力ピンの状態を読み取る
int buttonState = digitalRead(pushButton);
// 入力ピンの状態をシリアルでprintする
Serial.println(buttonState);
delay(1); // 読み取り関数の安定のために、ディレイを入れる
}
digitalRead
関数は、入力モードに設定したピンが、 HIGH の電圧(5V)か LOW の電圧(GND=0V)なのかを判定する命令です。
解説:digitalRead解説
digitalRead
関数が返す値は、5Vのとき1、0Vのとき0です。
すなわち、int型の変数buttonState
には、1か0の値が入ります。
「state
ステート」という「状態」を表す単語はプログラミングでよく使います。
皆さんに馴染み深いのは、RPGで使う「status
ステータス」ではないでしょうか?
status
はstate
の複数形の様な意味合いを持っています。
つまり「ちから」や「すばやさ」といった1つ1つの項目はstate
で、
それらを全部まとめて一覧で見るからstatus
というメニューがあるのです。
次に、Serial.println
関数で、取得したbuttonState
を送信しています。
関数の末尾にln
が付いているので、1か0を表示した後に改行してくれます。
もしln
が無いと、0000000001111111000000111...
と横に表示され続けます。
まとめ
デジタル入力では、
•pinMode でINPUT
を指定
•digitalRead で端子の状態を読む
という作業をする事が分かったと思います。
目次 へ戻って次の作業を行ってください。