今回はpinModeの復習をした後、スイッチの状態を読み取る命令を習得します。
pinModeの復習
第10回の記事でpinMode
を説明しましたが、その時は引数の「INPUT_PULLUP」の内容を説明していませんでした。
プルアップ機能が理解できると、「INPUT_PULLUP」の使い方も理解できます。まずは復習もかねてpinMode
の確認から始めましょう。
引数の「機能」には「OUTPUT」「INPUT」「INPUT_PULLUP」のいずれかを書きますが、それぞれの場合でArduinoボードの内部がどのようになるのかまとめておきます。
なお、Arduinoボード内部が複雑にならないように、内部の電圧計はデジタル電圧計のみ描いています。(それでも複雑ですが…)
引数「機能」が「OUTPUT」のときの内部のようす
pinMode
の第2引数で「OUTPUT」を指定すると、次のように内部の電池機能で出力電圧を制御できるようになります。
この状態にすると、digitalWrite
で端子の出力電圧制御ができるようになります。
この状態にすると、電圧計は出力電圧制御の影響を受けるので問題があるのでは?と思われた方もいるかもしません。確かに、digitalWrite(A5, HIGH);
で出力電圧をONにすると電圧計は「電圧あり」になりますが、これは特に問題はありません。
そもそも端子の出力電圧を制御したくてこの状態に設定します。端子の電圧を読み取る必要がありませんので電圧計が影響を受けても特に問題はありません。
ただ、この状態でも電圧計の電圧を読み取ることができます。電圧計を読み取ることにより、現在端子の出力電圧をONにしているのかOFFにしているのか、知ることができます。
引数「機能」が「INPUT」のときの内部のようす
pinMode
で「INPUT」を指定すると、次のように出力電圧制御の機能が切り離されます。
これにより、内部の電池機能の影響を受けずに端子の電圧を正しく読み取ることができます。
この状態にしたときの注意点として、端子に何も接続されていない場合、電圧計で読み取る値は不定になります。
引数「機能」が「INPUT_PULLUP」のときの内部のようす
pinMode
で「INPUT_PULLUP」を指定すると、「INPUT」の時と同じように電圧計機能が選択されますが、さらにプルアップ機能が有効になります。
Arduinoボードの端子に何も接続されていない場合は、電圧計の値は「あり」になります。
pinMode
の理解はこれで完璧です!
デジタル電圧計の読み取り
スイッチ状態を読み取るためには、あらかじめpinMode(A5, INPUT_PULLUP);
でA5端子を電圧読み取り機能にして、さらにプルアップ機能を有効にします。
最初に、この状態の時のArduinoボード内部の動作を確認しておきましょう。
端子に接続したスイッチがOFFのとき
接続したスイッチがOFFのとき、次のように端子には何も接続されていない状態になります。
このとき、端子はプルアップ機能で内部電池のプラス側に接続された状態になりますので、デジタル電圧計は「あり」になります。
端子に接続したスイッチがONのとき
スイッチをONにすると、端子は内部電池のマイナス側に接続されますので電圧計は「なし」になります。
ちょっと?と思った方もいるかもしれませんね。
一般的なスイッチのイメージは「スイッチがONのとき、電圧あり」で、「スイッチがOFFの時、電圧なし」って気がしませんか?
部屋の電気のスイッチをONにすれば電気はつきますし、OFFにすれば消えます。
でも上のようにスイッチを接続して、pinModeでINPUT_PULLUPの指定をするとイメージとは逆に、「スイッチがONのとき、電圧なし」で、「スイッチがOFFの時、電圧あり」になります。
電子工作が初めての場合、このような動作はややこしいと思われるかもしれません。
実は、電子回路の世界では、このように逆のイメージの動作が普通に出てきます。今回だけ特別、という動作ではありませんので、ぜひ慣れていただければと思います。
それでは、スケッチでこのデジタル電圧計の状態を読み取る方法を確認していきましょう!
digitalRead
デジタル電圧計を読み取るにはdigitalRead
(デジタルリード)という命令を使います。
digital(デジタル)は0か1か、ONかOFFかという2つの状態を意味する言葉でしたよね。Read(リード)は「読む」という意味です。
「digitalRead」は「ONかOFFかを読み取る」というイメージですね。
前回の記事でスイッチはA5端子に接続しましたので、A5端子内部のデジタル電圧計を読み取る場合は次のように書けばOKです。
digitalRead(A5);
あとはスケッチで確認するだけです!
スイッチ状態を読み取るスケッチ
それでは、0.5秒ごとにスイッチの状態を読み取るスケッチを作成してみましょう。
スケッチは新規作成して「switch」という名前で保存しておきます。
スイッチを接続している端子はA5ですので、次のように端子番号を定義しておこうと思います。スイッチなので「SWITCH」という名前にしてみました。
#define SWITCH A5
また、0.5秒ごとにスイッチの状態を読み取るので、この時間を次の定義をしてみました。読み取る時間、という意味で「READ_JIAKN」です。
#define READ_JIKAN 500
あとはpinMode
、digitalRead
、delay
を使ってスケッチを作成すればOKです。
次のように作成してみました。
/*
* 内容: スイッチの状態(内部のデジタル電圧計)を読み取る
*/
#define SWITCH A5 // スイッチを接続している端子名
#define READ_JIKAN 500 // スイッチの状態を読み取る時間間隔(単位:ms)
void setup() {
pinMode(SWITCH, INPUT_PULLUP);
}
void loop() {
digitalRead(SWITCH);
delay(READ_JIKAN);
}
スケッチの準備ができたら、Arduinoボードに送って動作確認してみましょう。
???????
何か起こりましたか?
何も起きませんよね…
実は、Arduinoボードはスケッチで指示された通り、せっせと0.5秒ごとにA5端子の電圧を読み取っているんです。
でも、、、
digitalRead
は、引数で指定した端子の電圧を読み取るだけなんです。それ以上のことはしません。なんだか気が利かないですね。
結局、このスケッチですとArduinoがちゃんと動作しているのかサボってるのかさっぱりわかりません。
でも、なんとかして読み取った結果を知りたいですよね。
そこで次回の記事では、digitalReadで読み取ったデジタル電圧計の値を教えてもらうことにします。
更新履歴
日付 | 内容 |
---|---|
2019.8.14 | 新規投稿 |
2021.8.22 | 新サイトデザイン対応 |
2024.11.28 | 端子名を変更 pinModeの各モードの説明イラストをより正確なものに更新 |