2019年09月03日 | 公開。 |
前のページでは、GPIOをdigitalWrite関数やdigitalRead関数で制御する際に、制御したいI/Oピンをピン番号で指定していましたが、この項ではI/Oピンに名前を付け、その名前で制御したいI/Oピンを指定する方法を説明します。
さらに、後に述べる省略記法を使うと、スケッチの記述量が減ります。
なお、I/Oピンに名前を付ける方法であれ、ピン番号でI/Oピンを指定する方法であれ、FASTIOライブラリを使うなら、同じ様にGPIOのアクセスが高速化します。
I/Oピンに名前を付けるには、次の書式で、fastIoPin型の変数(fastIoPinクラスのインスタンス)を宣言します。この宣言は、スケッチの大域変数(グローバル変数)を宣言する場所で行ってください。
ピン番号には、名前を付けたいI/Oピンのピン番号を指定します。
ピンの名前には、指定されたピン番号のI/Oピンに付けたい名前(名称)を指定します。
例えば、13番ピン(Arduino Unoなど多くのArduinoで、内蔵LEDが接続されているI/Oピン)にLEDという名前を付ける場合は、
fastIoPin<13> LED;
と宣言します。
名前を付けたピンには、まず入力あるいは出力のモードを設定する事が必要です。このモード設定のために、次の書式でpinMode関数を呼びます。
pinMode関数の使い方は、Arduino標準のpinMode関数とほとんど同じです。
Arduino標準のpinMode関数では、ピン番号と入出力モードの2つの引数を取りますが、FASTIOライブラリでI/Oピンを名前で指定する場合は、ピン番号を指定する必要はないので、入出力モードのみをpinMode関数の引数に取ります。
入出力モードの指定の仕方はArduino標準のpinMode関数と同じです。表3に、入出力モードの指定に使える定数と、それらの意味の一覧表を示します。
定数 | 意味 |
---|---|
INPUT | I/Oピンを入力モードに設定(プルアップ抵抗なし) |
INPUT_PULLUP | I/Oピンを入力モードに設定(プルアップ抵抗あり) |
OUTPUT | I/Oピンを出力モードに設定 |
例えば、LEDという名前のI/Oピンを出力モードにするなら、次の様に記述します。
LED.pinMode(OUTPUT);
出力ピン(出力モードに設定したI/Oピン)にLまたはHの電圧を出力する場合は、digitalWrite関数を使います。I/Oピンの指定にピン番号ではなく名前を使う点を除けば、Arduino標準のdigitalWrite関数と使い方は同じです。
I/Oピンを名前で指定する場合のdigitalWrite関数の書式を次に示します。
電圧値には、LOW(0)またはHIGH(1)を指定します。
例えば、LEDという名前のI/OピンにHを出力するなら、次の様に記述します。
LED.digitalWrite(HIGH);
この記述法を使ったサンプルスケッチをリスト17に示します。このスケッチは、13番ピンに接続されたLEDを1秒周期で点滅させます。
#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秒待つ
}
例えば、
LED=HIGH;
の様に、ピンの名前(この場合はLED)に出力電圧を代入すると、digitalWrite関数を使って電圧を出力するのと同じになります。
つまり、この例の場合は、
LED.digitalWrite(HIGH);
と同じ意味になります。
また、代入演算子は、代入した値を返しますから、
LED1=LED2=LED3=LOW;
と表記すれば、LED1、LED2、およびLED3の3つの出力ピンにLを出力できます。
ただし、3つのピンにどの順でLが出力されるかはわかりませんので、出力するピンの順番が問題になる場合は、
LED1=LOW;
LED2=LOW;
LED3=LOW;
などと、3行に分けて記述すべきです。
リスト17のスケッチを、digitalWrite関数の省略記法を用いて書き直すと、リスト18の様になります。
#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秒待つ
}
入力ピン(入力モードにした)から入力電圧を読みたい場合は、digitalRead関数を使います。I/Oピンの指定にピン番号ではなく名前を使う点を除けば、Arduino標準のdigitalRead関数と使い方は同じです。
I/Oピンを名前で指定する場合のdigitalRead関数の書式を次に示します。
関数の返り値は、読んだ電圧値(LOWまたはHIGH)です。
例えば、INという名前のI/Oピンから電圧値を読み込み、int型の変数valに代入する場合は、次の様に記述します。
int val=IN.digitalRead();
この記述法を使ったサンプルスケッチをリスト19に示します。このスケッチは、2番ピンの値を読み込み、シリアルポートに出力します。入力電圧がLの場合は0と出力し、入力電圧がHの場合は1と出力します。
#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ピンから読んだ入力電圧をシリアルポートに出力
}
例えば、
int val=IN;
の様に、INという名前のピンの変数を読むと、digitalRead関数を使って入力ピンから入力電圧を読むのと同じになります。
つまり、この例の場合は、
int val=IN.digitalRead();
と同じ意味になります。
リスト19のスケッチを、digitalRead関数の省略記法を用いて書き直すと、リスト20の様になります。
#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ピンから読んだ入力電圧をシリアルポートに出力
}
Arduino標準のdigitalWrite関数やdigitalRead関数には、tone関数やanalogWrite関数で発振波形を出力していないかを調べ、発振波形を出力している場合は、波形出力を無効化してから出力(digitalWrite関数の場合)あるいは入力(digitalRead関数の場合)を行う機能があります。この様なチェック機能がある事が、Arduino標準のdigitalWrite関数やdigitalRead関数の処理速度の遅の原因のひとつです。
FASTIOライブラリの場合は、このチェック機能を省く事で入出力を高速化していますので、FASTIOライブラリで制御するI/Oピンに関しては、tone関数やanalogWrite関数を使わない様にしてください。
次のページでは、74HC595を用いてArduinoの出力ピンを拡張した場合に、FASTIOライブラリを使ってスケッチを作る方法について説明します。