マイコンのI/Oの基本となる「GPIO」の使い方今岡通博の俺流!組み込み用語解説(5)(2/2 ページ)

» 2024年08月29日 07時00分 公開
[今岡通博MONOist]
前のページへ 1|2       

GPIOを入力端子として用いる

 GPIOを入力端子として用いると、この端子に印加できる電圧の上限はこのマイコンに供給している電源の電圧となります。この端子に閾値より高い電圧を印加すると、マイコンがこのポートを読み出す際に1の値を取得できます。また、閾値より低い電圧を印加すると、マイコンからは値として0が検出されます。この閾値は0か1を判断するボーダーの値となるわけですが、一般的にはマイコンに供給する電圧の半分より少し上回る電圧となります。例えば、Arduinoに多く搭載されているマイコンのAtmega328シリーズだと、VCCが5Vの場合、約2.87Vとなります。

 正確な値はお使いのマイコンのデーターシートで確認してください。英語では閾値は“threshold”ですので、データーシートが英語の場合はこのキーワードを手掛かりに検索してみてください。

 さて図2は、タクトスイッチの押下をGPIOで検出するための回路図です。

図2 図2 タクトスイッチの押下をGPIOで検出するための回路図[クリックで拡大]

 入力端子に設定されたGPIOはタクトスイッチの一端に接続します。そしてタクトスイッチのもう一端はグランドに接続します。タクトスイッチが押下されるとスイッチの両端が導通しますのでマイコンの入力端子はグランド電位に落ちます。この時点で、入力端子をマイコン側から読み込むとその値は0となります。それでは、タクトスイッチが押下されていない場合はどうでしょうか。その場合、連載第3回で紹介したプルアップ抵抗によりVCC電位に引っ張られていますので、入力端子は高電位になり、マイコンから読み込むとその値は1となります。

 リスト2はタクトスイッチの押下の有無を読み込むプログラムとなります。まずsetup関数内では指定したピン番号を入力端子として設定しています。第1引数のinPinで入出力を設定したいピン番号を指定しています。第2引数はINPUTを指定していますので、指定したピンは入力に設定されます。

void setup() {
  pinMode(inPin, INPUT);
}
void loop() {
  val = digitalRead(inPin); 
}
リスト2 図2におけるタクトスイッチの押下の有無を読み込むプログラム

 setup関数がマイコンが起動して一度だけ実行される関数でしたが、次のloop関数は一定時間で何度も実行される関数です。

 この関数内では指定した入力ピンの値をval変数に代入しています。digitalRead関数で指定した入力ピンの値を読み込みます。

 図3はマイコン内でGPIOにプルアップ抵抗を設定した場合の回路図です。

図3 図3 マイコン内でGPIOにプルアップ抵抗を設定した場合の回路図

 これはマイコン内部で入力端子をプルアップ設定していますので、マイコン外部にプルアップ抵抗を付ける必要がなくなります。

void setup() {
  pinMode(inPin, INPUT_PULLUP);
}
void loop() {
  val = digitalRead(inPin); 
}
リスト3 GPIOを入力端子にプルアップ抵抗を配したプログラム

 リスト3は指定したGPIOを入力端子に設定し、さらにその端子にプルアップ抵抗を配したプログラムになります。それらはリスト上のsetup関数で行っています。先に示したリストと異なるところはpinMode関数の第2引数が“INPUT”だったところが“INPUT_PULLUP”に置き換わっています。それ以外のところはリスト2と同じです。

 この機能を使えば外付け抵抗を1つ減らすことができるので電子工作的にはとても楽になります。また複数の入力端子を用いる場合は、その端子ごとにプルアップ抵抗を付ける必要がありますが、この機能を用いればさらに楽になります。

おわりに

 ここで、やっと「おわりに」に到達しました。皆さんもここまで到達されたということで、それは何より筆者にとってうれしいことです。ここまでお付き合いいただきありがとうございました。

 今回はマイコンの入出力端子の中で最も基本的なGPIOを取り上げました。次回以降はその応用やさらに高度な入出力端子などについて解説していきたいと思います。

⇒MONOist編集部へのご意見はこちらまで

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.