Arduino入門:変数の修飾子

ArduinoのSketch(スケッチ)では、変数に修飾子をつけて変数を宣言する事ができます。

修飾子をつけて変数を宣言すると、そのキーワードに応じた性質を変数が持つ事になります。

static修飾子

関数内でstaticを付けて宣言するとスタティック変数になります。通常のローカル変数は、関数が呼ばれる度に生成と破棄が行われますが、スタティック変数は継続的で、関数が初めて呼ばれたときに1度だけ生成され、関数が繰り返し呼ばれても、ずっと値が保持されます。

/* RandomWalk
* Paul Badger 2007
* RandomWalk wanders up and down randomly between two
* endpoints. The maximum move in one loop is governed by
* the parameter "stepsize".
* A static variable is moved up and down a random amount.
* This technique is also known as "pink noise" and "drunken walk".
*/

#define randomWalkLowRange -20
#define randomWalkHighRange 20
int stepsize;

int thisTime;
int total;

void setup()
{
  Serial.begin(9600);
}

void loop()
{        //  tetst randomWalk function
  stepsize = 5;
  thisTime = randomWalk(stepsize);
  Serial.println(thisTime);
   delay(10);
}

int randomWalk(int moveSize){
  static int  place;     // variable to store value in random walk - declared static so that it stores
                         // values in between function calls, but no other functions can change its value

  place = place + (random(-moveSize, moveSize + 1));

  if (place < randomWalkLowRange){                    // check lower and upper limits
    place = place + (randomWalkLowRange - place);     // reflect number back in positive direction
  }
  else if(place > randomWalkHighRange){
    place = place - (place - randomWalkHighRange);     // reflect number back in negative direction
  }

  return place;
}

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:Static” by Arduino Team is licensed under CC BY-SA 3.0

上記の例では、31行目の、
static int place;
でstatic修飾子をつけて、変数placeを宣言しています。これにより場所を表す変数placeの値を継続的なものにしています。

volatile修飾子

volatile修飾子を型宣言の前に付けて宣言すると、変数をレジスタではなくRAMからロードするよう、コンパイラに指示する事ができます。この様な指示が必要になるのは、特定条件では、レジスタに記憶された変数の値は不確かになるからです。具体的には、変数がコントロールの及ばない別の場所(たとえば並行して動作するコード)で変更される可能性があるときです。Arduinoの場合、割り込みサービスルーチンと呼ばれる、割り込みに関連したコードが、これに該当します。

// toggles LED when interrupt pin changes state

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:volatile keyword” by Arduino Team is licensed under CC BY-SA 3.0

上の例では、4行目で、
volatile int state = LOW;
とvolatile修飾子付きで変数宣言しています。これで、割り込み発生時とメインループの双方から、安全にstateにアクセスする事が出来ます。

const修飾子

const修飾子をつけて変数を宣言すると、その変数は読み取りのみ可で実質的な定数になります。値は変更できなくなり、値を代入しようとすると、コンパイルエラーが発生します。

const float pi = 3.14;
float x;

// ....

x = pi * 2;    // it's fine to use const's in math

pi = 7;        // illegal - you can't write to (modify) a constant

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:const keyword” by Arduino Team is licensed under CC BY-SA 3.0

上の例では、1行目の
const float pi = 3.14;
で、piをconst付で宣言して使用していますが、8行目で値を代入しようとしていますので、コンパイルは通りません。

まとめ

必要に応じて修飾子をつけた変数宣言を行うと、効率および安全性を高めたプログラミングが可能になります。修飾子には上記以外にもPROBMEM等がありますが、別の機会に説明したいと思います。

→その他のArduino関連情報

Sponsored Link