Blinkから始まるArduino入門 その3 定数と変数
●LEDのピン番号を指定するセオリ
前回、BlinkしたいLEDが0番だったのですが、コンソールを使いたいので0、1番以外の番号に変更したいとすると、実に3か所をエディタで変更しなくてはなりません。たった10行のうち33%も修正するなんて大改修です。ミスも起こります。
スケッチの中で実行中に変更されない変数を定数と呼びます。LED_pin という名前に0を代入するという記述に、0番は最小の型であるbyte、定数の修飾子constをつけます。
const byte LED_pin = 0 ;
マイコンはプログラムを収納するROMエリアと作業用にRAMエリアがあります。ROMは名前のとおり読み出しだけができます。プログラムはバグがつきものですから、何度も書き換えたいので、40年前はPROMという三つの電源が必要な書き込み可能なROMが試作で使われました。データの消去には紫外線を使い、量産時にはマスクROMを使いました。現在では電気的に書き換えが可能なフラッシュROMが多くのマイコンに搭載されているので、USBケーブルさえあればプログラムを修正できます。AVRやPICなどでヒューズ・ビットを操作すれば、書き換えを不能にもできます。
ROMエリアはプログラムが収納されますが、ある領域から、定数がまとめて収納されます。
●全部変数でもかまわないが
変数は名前のとおりプログラムが動作する途中で書き換えられことを前提としているので、RAMエリアに領域がとられます。現在のコンピュータは8ビット単位で物事を扱います。8ビットは1バイトです。Arduinoではbyteは8ビットのことです。int=整数は16ビットです。intが32ビットのCPUもあります。
byteは2^8なので、0~256までの数値もしくは符号付きの-128~+127までの値を表します。ROMやRAMに領域を確保するために型を指定しないといけません。1byteなら8ビットの領域が確保されます。constをつけるとROMエリアに8ビット確保されます。定数なのに変数だと宣言してもプログラムの動作に何も問題はありません。領域が確保されるのがRAMだというだけです。RAM領域は物理的に2kバイトと狭いですが。
型は何とおりも指定の書き方がありますが、Arduinoはbyteとcharが古くから使われています。型の指定は、使い始める直前で行ってもよいですし、スケッチのはじめにまとめておいてもかまいません。
- 0~256の値は、unsigned char、byte、int8_t
- -128~+127の値は、char、uint8_t
0は注意します。byteだと勝手に思い込んでいると、コンパイラが16ビットなのか8ビットなのかわからないと警告が出ることがあります(Micro:bit Arduino IDE)。
イコールの右側は、
- 10進 そのままの数字
- 2進 Bから始まる
- 16進 0xから始まる
const byte LED_pin = 2 ;
は、次のようにも書けます。
const byte LED_pin = 0x2 ;
const byte LED_pin = B00000010 ;
これ以外に、
#define LED_pin 2
もOKです。LED_pinという単語があれば、’2’に置換してコンパイルします。したがって、メモリを消費しません。プログラムの実行中に変更はできないので、定数ですね。
●スケッチ
const byte LED_pin = 2 ;
void setup() {
pinMode(LED_pin, OUTPUT);
}
void loop() {
digitalWrite(LED_pin, HIGH);
delay(1000);
digitalWrite(LED_pin, LOW);
delay(1000);
}
ピン番号を修正したいときは、1回だけで済みますね。
●有効範囲スコープ
スケッチのsetup()が始まる前に、定数や変数を書くのが一般的です。そして、この最初に書くとグローバル変数になります。有効範囲はプログラム全体なので、いろいろな関数内で利用できます。
コラム NORとNAND
ROMは電源を切っても内容が保持されます。マイコンに内蔵されているフラッシュ・メモリROMはNOR型です。ATMega328では書き換えられる回数に1万回という制限がありますが、ふつうはその上限に達することはありません。
SDメモリやSSDに使われるのはNAND型で、製造コストが安いのですが、自然とデータが壊れます。なので、コントローラが、エラーが起こった部分があれば、読み出して正常な部分を書き換えなおすとかの作業を知らない間に行います。
フラッシュ・メモリは舛岡富士雄氏が発明しました。2018年現在、世界で使われるNAND型メモリの80%は韓国の会社が製造しています。
RAMはROMより高速に読み書きができます。マイコンではスタティックRAMが使われ、実装面積が大きいので、たくさん搭載するとICが高価になります。RAMは電源を切ると内容が失われます。高速に読み書きができて、電源を切っても内容が保持されるメモリ・デバイスが求められていますが、2018年現在、FRAMが実用化一歩手前です。