FASTIOライブラリ(6)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
このエントリーをはてなブックマークに追加
目次へ  前のページへ (1) (2) (3) (4) (5) (6) 次のページへ
2019年09月03日 公開。

8-2-2.I/Oピンに名前を付ける方法

前のページでは、GPIOdigitalWrite関数digitalRead関数で制御する際に、制御したいI/Oピンをピン番号で指定していましたが、この項ではI/Oピンに名前を付け、その名前で制御したいI/Oピンを指定する方法を説明します。

I/Oピンに名前を付けると、スケッチ可読性が向上します。

さらに、後に述べる省略記法を使うと、スケッチの記述量が減ります。

なお、I/Oピンに名前を付ける方法であれ、ピン番号でI/Oピンを指定する方法であれ、FASTIOライブラリを使うなら、同じ様にGPIOのアクセスが高速化します。

広告
8-2-2-1.I/Oピンの名前の宣言

I/Oピンに名前を付けるには、次の書式で、fastIoPin型の変数(fastIoPinクラスインスタンス)を宣言します。この宣言は、スケッチの大域変数(グローバル変数)を宣言する場所で行ってください。

fastIoPin<ピン番号> ピンの名前;

ピン番号には、名前を付けたいI/Oピンのピン番号を指定します。

ピンの名前には、指定されたピン番号のI/Oピンに付けたい名前(名称)を指定します。

例えば、13番ピン(Arduino Unoなど多くのArduinoで、内蔵LEDが接続されているI/Oピン)にLEDという名前を付ける場合は、

fastIoPin<13> LED;

と宣言します。

8-2-2-2.pinMode関数によるI/Oピンのモード指定

名前を付けたピンには、まず入力あるいは出力のモードを設定する事が必要です。このモード設定のために、次の書式でpinMode関数を呼びます。

ピンの名前.pinMode(入出力モード)

pinMode関数の使い方は、Arduino標準のpinMode関数とほとんど同じです。

Arduino標準のpinMode関数では、ピン番号と入出力モードの2つの引数を取りますが、FASTIOライブラリでI/Oピンを名前で指定する場合は、ピン番号を指定する必要はないので、入出力モードのみをpinMode関数の引数に取ります。

入出力モードの指定の仕方はArduino標準のpinMode関数と同じです。表3に、入出力モードの指定に使える定数と、それらの意味の一覧表を示します。

表3、入出力モードの指定に使える定数とそれらの意味
定数 意味
INPUT I/Oピンを入力モードに設定(プルアップ抵抗なし)
INPUT_PULLUP I/Oピンを入力モードに設定(プルアップ抵抗あり)
OUTPUT I/Oピンを出力モードに設定

例えば、LEDという名前のI/Oピンを出力モードにするなら、次の様に記述します。

LED.pinMode(OUTPUT);
8-2-2-3.digitalWrite関数によるI/Oピンへの出力

出力ピン(出力モードに設定したI/Oピン)にLまたはHの電圧を出力する場合は、digitalWrite関数を使います。I/Oピンの指定にピン番号ではなく名前を使う点を除けば、Arduino標準のdigitalWrite関数と使い方は同じです。

I/Oピンを名前で指定する場合のdigitalWrite関数の書式を次に示します。

ピンの名前.digitalWrite(電圧値)

電圧値には、LOW(0)またはHIGH(1)を指定します。

例えば、LEDという名前のI/OピンにHを出力するなら、次の様に記述します。

LED.digitalWrite(HIGH);

この記述法を使ったサンプルスケッチをリスト17に示します。このスケッチは、13番ピンに接続されたLEDを1秒周期で点滅させます。

リスト17、1秒周期でLEDを点滅させるスケッチ(I/Oピンを名前で指定)
#include <fastio.h> // FASTIOライブラリを使う場合はfastio.hをインクルード

fastIoPin<13> LED; // 13番ピンにLEDという名前を付ける

void setup()
{
  LED.pinMode(OUTPUT); // LEDピンを出力モードに設定
  // 上の行は、FASTIOライブラリを使わずにpinMode(13,OUTPUT);と書いてもよい
}

void loop()
{
  LED.digitalWrite(LOW); // LEDピンにLを出力(LEDのアノード側が13番ピンにつながっているなら消灯)
  delay(500); // 0.5秒待つ
  LED.digitalWrite(HIGH); // LEDピンにHを出力(LEDのアノード側が13番ピンにつながっているなら点灯)
  delay(500); // 0.5秒待つ
}
8-2-2-4.digitalWrite関数の省略記法

例えば、

LED=HIGH;

の様に、ピンの名前(この場合はLED)に出力電圧を代入すると、digitalWrite関数を使って電圧を出力するのと同じになります。

つまり、この例の場合は、

LED.digitalWrite(HIGH);

と同じ意味になります。

また、代入演算子は、代入した値を返しますから、

LED1=LED2=LED3=LOW;

と表記すれば、LED1LED2、およびLED3の3つの出力ピンにLを出力できます。

ただし、3つのピンにどの順でLが出力されるかはわかりませんので、出力するピンの順番が問題になる場合は、

LED1=LOW;
LED2=LOW;
LED3=LOW;

などと、3行に分けて記述すべきです。

リスト17のスケッチを、digitalWrite関数の省略記法を用いて書き直すと、リスト18の様になります。

リスト18、1秒周期でLEDを点滅させるスケッチ(I/Oピンを名前で指定・省略記法使用)
#include <fastio.h> // FASTIOライブラリを使う場合はfastio.hをインクルード

fastIoPin<13> LED; // 13番ピンにLEDという名前を付ける

void setup()
{
  LED.pinMode(OUTPUT); // LEDピンを出力モードに設定
  // 上の行は、FASTIOライブラリを使わずにpinMode(13,OUTPUT);と書いてもよい
}

void loop()
{
  LED=LOW; // LEDピンにLを出力(LEDのアノード側が13番ピンにつながっているなら消灯)
  delay(500); // 0.5秒待つ
  LED=HIGH; // LEDピンにHを出力(LEDのアノード側が13番ピンにつながっているなら点灯)
  delay(500); // 0.5秒待つ
}
8-2-2-5.digitalRead関数によるI/Oピンからの入力

入力ピン(入力モードにした)から入力電圧を読みたい場合は、digitalRead関数を使います。I/Oピンの指定にピン番号ではなく名前を使う点を除けば、Arduino標準のdigitalRead関数と使い方は同じです。

I/Oピンを名前で指定する場合のdigitalRead関数の書式を次に示します。

ピンの名前.digitalRead()

関数の返り値は、読んだ電圧値(LOWまたはHIGH)です。

例えば、INという名前のI/Oピンから電圧値を読み込み、int型の変数valに代入する場合は、次の様に記述します。

int val=IN.digitalRead();

この記述法を使ったサンプルスケッチをリスト19に示します。このスケッチは、2番ピンの値を読み込み、シリアルポートに出力します。入力電圧がLの場合は0と出力し、入力電圧がHの場合は1と出力します。

リスト19、2番ピンの電圧をシリアルポートに出力するスケッチ(I/Oピンを名前で指定)
#include <fastio.h> // FASTIOライブラリを使う場合はfastio.hをインクルード

fastIoPin<2> IN; // 2番ピンにINという名前を付ける

void setup()
{
  IN.pinMode(INPUT_PULLUP); // INピンを入力モードに設定(プルアップ抵抗有効)
  // 上の行は、FASTIOライブラリを使わずにpinMode(2,INPUT_PULLUP);と書いてもよい

  Serial.begin(9600); // シリアルポートを9600bpsでオープン
}

void loop()
{
  Serial.println(IN.digitalRead()); // INピンから読んだ入力電圧をシリアルポートに出力
}
8-2-2-6. digitalRead関数の省略記法

例えば、

int val=IN;

の様に、INという名前のピンの変数を読むと、digitalRead関数を使って入力ピンから入力電圧を読むのと同じになります。

つまり、この例の場合は、

int val=IN.digitalRead();

と同じ意味になります。

リスト19のスケッチを、digitalRead関数の省略記法を用いて書き直すと、リスト20の様になります。

リスト20、2番ピンの電圧をシリアルポートに出力するスケッチ(I/Oピンを名前で指定・省略記法使用)
#include <fastio.h> // FASTIOライブラリを使う場合はfastio.hをインクルード

fastIoPin<2> IN; // 2番ピンにINという名前を付ける

void setup()
{
  IN.pinMode(INPUT_PULLUP); // INピンを入力モードに設定(プルアップ抵抗有効)
  // 上の行は、FASTIOライブラリを使わずにpinMode(2,INPUT_PULLUP);と書いてもよい

  Serial.begin(9600); // シリアルポートを9600bpsでオープン
}

void loop()
{
  Serial.println(IN); // INピンから読んだ入力電圧をシリアルポートに出力
}
広告

8-2-3.FASTIOライブラリでGPIOを制御する場合の注意点

Arduino標準のdigitalWrite関数やdigitalRead関数には、tone関数analogWrite関数で発振波形を出力していないかを調べ、発振波形を出力している場合は、波形出力を無効化してから出力(digitalWrite関数の場合)あるいは入力(digitalRead関数の場合)を行う機能があります。この様なチェック機能がある事が、Arduino標準のdigitalWrite関数やdigitalRead関数の処理速度の遅の原因のひとつです。

FASTIOライブラリの場合は、このチェック機能を省く事で入出力を高速化していますので、FASTIOライブラリで制御するI/Oピンに関しては、tone関数やanalogWrite関数を使わない様にしてください。

次回は、74HC595を使って出力ピンを拡張した場合に、それらの出力ピンをFASTIOライブラリで制御する方法について説明する予定です。続きを書くのはぼちぼちと。

このエントリーをはてなブックマークに追加
目次へ  前のページへ (1) (2) (3) (4) (5) (6) 次のページへ

このページで使われている用語の解説

関連ページ

このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。
こちらのページもおすすめです。