スケッチ基本編1

 ここでは、Arduinoのスケッチを描く場合に必要な基本的な事項をまとめました。詳細はArduinoのホームページのリファレンスを参照してください。

スケッチの基本的な構成
 Arduinoのスケッチは、最小限次のsetup()とloop()の二つが必須で順番に実行されます。

void setup()


 電源投入、またはリセットされたあとスケッチの実行の最初に一度だけ実行されます。voidは関数の型で戻り値のない関数であることを示しています。

void loop()


 スケッチの処理を行うメイン部分です。先頭から順番に処理を実行し処理が終われば先頭まで戻り、電源が切られるかリセットされるまで繰り返します。

特殊記号

; セミコロン


 スケッチの各文はで終わります。このセミコロンで区切って1行に複数の文を記述することもできます。

{ } 中括弧


 複数の文をまとめて文ブロックとして取り扱う場合、ブロックの前後をこの中括弧で囲います。

コメント /*    */、 //


 /*  */で囲まれた複数行にまたがるものと、//から行末までがコメントとなります。 

 /* 例、コメントをここに記入

 */
 // この文字より右側の文字列がコメントとなります。各行の説明に適します。

【例】
int ledPin =0; //  = は代入を表し 変数ledPinに0をセットすることを示す
void setup(){
  pinMode(ledPin,OUTPUT);   // ディジタル・ポートを出力に設定
 } 
void loop(){
   digitalWrite(ledPin、HIGH);  // ディジタル・ポートをHIGHにする
   delay(500);           // 500ms待つ
   digitalWrite(ledPin、LOW);  // ディジタル・ポートをLOWにする
   delay(500);           // 500ms待つ
 }                  //この関数の中で繰り返す

●定数 
 システムであらかじめ用意されている定数として次のようなものがあります。INPUT、OUTPUT、HIGH、LOWなど。通常、定数は大文字で表記されます。

●システムが用意している定数
 あらかじめArduino IDEのシステムで、次の定数が用意されています。

HIGH ディジタル出力で出力ポートの電圧をハイ・レベルにするときこのHIGHを指定する。入力に指定したポートにdigitalWrite(pin,HIGH)を設定すると、内部のプルアップ抵抗が有効になる
LOW ディジタル出力でLOWを設定すると、出力ポートの電圧レベルをGNDレベルにする
INPUT ディジタル入出力のポートの設定を行うpinMode()関数で、この設定はポートを入力に設定する
OUTPUT ディジタル入出力のポートの設定を行うpinMode()関数で、この設定はポートを出力に設定する
OUTPUT_PULLUP pinMode()関数でこの設定を行うと、ポートは入力ポートとなり、内部プルアップ抵抗も有効になる
LED_BUILTIN ArduinoのオンボードでLEDに接続されているポートを示す
true trueは論理型の変数で真偽の真を表す。または整数型の0でないと同意になる
FALSE falseは論理型の変数で真偽の偽を表す。または整数型の0と同意になる
integer Constants 定数として直接数値を設定することができる。整数の場合2進数、8進数、10進数、16進数表示が行える
floating point constants 定数として直接数値を設定することができる。実数の場合小数点表示、指数標示が行える

●変数 

 いろんなデータを保存しておくことのできる箱みたいなもので、それぞれユニークな名前がつけられています。変数名を定義するときに保存するデータの型も定義します。Arduinoのスケッチで使用する変数および定数の型の主なものを示します。通常小文字で表記し、inputData、input_dataなどのように、_または大文字で区切り意味をわかりやすくする場合があります。

●変数、定数の有効範囲
 変数、定数の定義した場所によって有効範囲が異なります。
グローバル変数、定数
 関数のプログラムの記述で定義されたものは、定義された以後のどの場所で利用してもコンパイラは定義されたものとして認識し使用することができます。使用する変数、定数は使用する命令を記述する前に定義しなければなりません。そのプログラム全体で同じ意味で利用する変数、定数は、プログラムの最初に定義するのが間違いを少なく方法です。
ローカル変数、定数
 関数ので定義した変数、定数は、その定義された関数内でのみ有効です。ほかの関数内で定義した変数、定数をほかの関数などで利用すると、未定義のエラーとなりコンパイルが完了しません。新しくユーザ定義の関数を作るときは関数内で使用する変数、定数は、関数内で定義したものを利用するようにします。システムの用意した定数以外は、関数外のデータが必要な場合は関数の引数を利用するようにします。

●定数および変数の型

定義 解 説
Boolean 論理型 論理型の変数で「true、false」または「0以外(true)と0(false)」の二つの値を持つ
char char型 1バイトで文字コードが格納される変数、定数。-128から+127の数値として演算の対象にもなる
byte バイト型 1バイトのメモリを表現できる0から255の値をもつデータの型
int 整数型 2バイトで表現される符号付の整数で-32768~32767の値をもつデータの型
long 倍精度整数型 4バイトで表現される符号付き
unsigned int 符号なし整数型 2バイトの符号なしの整数、0~65535の値をもつデータの型
unsigned long 符号なし倍精度整数型 4バイトの符号なしの整数で0~4294967295の値をもつデータの型
float 単精度実数型 4バイトで-3.4028235E+38~3.4028235E+38の実数の値をもつ型
double 倍精度実数型 8バイトの-1.7976931348623157E+308~1.7976931348623157E+308までの実数の値をもつ型
string 文字列型 char型の配列で最後がヌルで終端されている
String オブジェクト オブジェクトの文字列として扱われる。stringと異なる
array 配列型 変数の集合体で個々の配列はインデックス番号を添えて指定する

符号;プラスとマイナスのために最上位のビットが使われる。符号なしであれば、扱える数値の範囲が広くなる。

●制御構文

if else

if ( 式 )
   { 文1 }
else
   { 文2 }


 式が成立する場合文1を実行し、式が成立しない場合文2を実行する。else以下は省略することができる。式が成立せずelse以下が省略されているときは何もせず、if文の次の文に処理が移ります。

【例】   

if (digitalRead(4)==HIGH){

digitalWrite(13,HIGH);  

} else {

digitalWrite(13,LOW);

}


for   

for (初期化 継続条件 増分){
文 または文ブロック
}


 for ( 初期化 継続条件 増分){文1  } 変数の初期値を設定し、継続条件が満たされる間は毎回 を実行し 変数を増分示された値を増加します。処理を繰り返すときに利用します。

【例】 1から10までを積算する例
si=0;
for (int i=1 i<=10 i=i+1) {
  si=si+1;
}


switch (var) case 式:
 varで示される変数の値と各caseに設定されている式と比較し、等しい場合そのcaseで示された文を実行します。

switch  (var){  // varは整数、文字型などの変数
   case 1:   //varと式を比較する、一致しない場合は次のcaseの式と比較する
    文      // varと式が一致したらこれらの文を実行する
   Break;    // このbreak文でswitchの制御構造から抜ける
   case 2;   //varと式を比較する、一致しない場合は次のcaseの式と比較する
    文      // varと式が一致したらこれらの文を実行する
   break     // このbreak文でswitchの制御構造から抜ける
   default     //一致するcaseがなかった場合、次の文の処理が実行される。
文  // default以下は省略できる

while    

while ( 式 ) { 文 }


 を評価し、成立すると次の文のブロックを実行します。文ブロックの実行を終えると再度の評価を行い、が成立しなくなるまで繰り返します。

【例】        

int n=0;
while (n<=9) {
    n=n+1;
}

do while

do {
    文ブロック } while( 式 );


 doの次の文ブロックの処理を実行し次にwhileのを評価し、成立する場合文ブロックの処理を繰り返します。最初の一度は条件に無関係に実行されます。

【例】

int n=0;
do {
   n=n+1;
}
while (n<=10) ; 

break     do、while、forなどの繰り返し処理の文の途中で、そのループを抜け出し次に進む場合に、このbreakを使用します。
continue   do、while、forなどの繰り返し処理の文の途中でループ内の以後の処理をスキップして、次のループに入ります。ループの繰り返し条件を満たしている間ループの繰り返し処理を続けます。
return   関数の処理を終えます。戻り値がある場合は、returnの後に戻り値を指定します。

return 戻り値;

算術演算子
 算術演算子として次のものがあります。

+ 加算
* 乗算
- 減算
/ 除算
% 剰余

比較演算子
 比較のときの等しいは==が用いられます。は代入の意味で用いられています。次のような比較演算子が用意されています。

== 等しい
!= 等しくない
<  左辺が右辺より小
>  左辺が右辺より大
<= 左辺が右辺より小か等しい
>= 左辺が右辺より大か等しい

●論理演算
 論理演算では、論理積と論理和のための次の命令が用意されています。

&&  論理積(and)
||  論理和(or)
!   否定(not)

●入出力
 Arduinoの入出力を行うための関数で、入力処理では入力が関数の戻り値として得られます。出力の場合は、対象の出力ポート番号と出力データの値をパラメータに渡します。
ディジタル入出力

pinMode(pin,mode) pinで指定されたディジタル入出力ポートの入力(INPUT)か出力(OUTPUT)を設定する。modeでINPUTまたはOUTPUTを指定する
digitalWrite(pin,value) pinで指定されたディジタル出力ポートにvalueで指定されたHIGHまたはLOWを出力する。入力に設定されたディジタル・ポートにdigitalWrite(pin,HIGH)を実行すると内部のプルアップ抵抗が有効になった入力ポートとなる
digitalRead(pin) pinで指定されたディジタル入力ポートの現在の値を読み取る。HIGHまたはLOWの値が得られる


アナログ入出力

analogReference() アナログ入力の基準電圧を設定する。設定値により次のようになる。DEFAULTで電源電圧、INTERNALで1.1V、EXTERNALで0から電源電圧の範囲内の外部基準電圧となる
analogRead(pin) pinで指定されたアナログ入力ポートの現在の値を読み取る。0~1023の値が得られる
analogWrite(pin,value) pinで指定されたアナログ出力ポートに、基本周波数490Hz でvalue(0~255)の比率のPWM出力のアナログ出力を行う

◆アドバンスド I/O

tone( pin,frequency, duration) 3から11のPWM出力が可能なディジタル・ポートをpinで指定し、frequencyで指定する周波数のパルスが出力される。durationで指定するms単位の時間パルスが発振される。この項目はオプションで省略するとnoTone(pin)で停止をするまで続く
noTone(pin) tone()関数で発振しているパルスを停止する
shiftOut(dataPin,clockPin,bitOrder,value) ほかのデバイスと同期シリアル通信を行うために、valueで示す1バイト分のデータをdataPinで指定されたディジタル・ポートから、clockPinで指定されるディジタル・ポートから出力されるクロック・パルスに合せて1ビットずつシフト・アウトする。bitOrderでMSBFIRST上位から、LSBFIRST下位からとシフト・アウトする順番を指定する
pulseln(pin,value,timeout) 入力に設定されたディジタル入力ピンにvalueで示すHIGHまたはLOWのパルスが入力されたとき、そのパルスの幅を計る。パルス幅の値が関数の戻り値となる。単位はマイクロ秒で3μsから3分くらいまでの計測が行える。関数の型は unsigned longで、タイムアウトは省略できデフォルトの値は1秒

●時間に関する命令

millis() スケッチの開始時からのms単位の経過時間を得ることのできる関数。unsigned longで0~4294967295のms単位の経過時間が得られる。約50日分になり、オーバフローすると0に戻る
micros() スケッチの開始時からのμs単位の経過時間を得ることのできる関数。unsigned longで0~4294967295のμs単位の経過時間が得られる。約71分になり、オーバフローすると0に戻る。ただしクロックが16MHzのとき4μs、8MHzのときは8μsの分解能となる
delay(ms) msで指定するmsの単位の時間で時間待ちする。ms はunsigned longで0~4294967295の値が設定できる。32767以上の数値を直接関数に設定する場合、数値の後にulを付け加えunsigned longであることを示す。割り込み処理は無効にしていないので、通信処理などはこの関数の実行の影響をうけない
delayMicroseconds(us) μs単位で時間待ちを行うための関数。16383以下の値を設定する。この値以上の時間待ちが必要な場合はdelay(ms)を利用する

●数学関数

min(x,y) 二つの値のうち小さいほうの値を関数の戻り値とする
max(x,y) 二つの値のうち大きいほうの値を関数の戻り値とする
abs(x) xの絶対値を関数の戻り値とする
constrain(x,a,b) xの値がa(下限)とb(上限)の範囲内に収める。センサの値などが測定限界外の場合にxを下限、上限の値に置き換える
pow(base,exponent) べき乗の計算を行う。baseが基数でexponentが指数となる。関数の型はdouble
sqrt(x) xの平方根の値が関数の戻り値となる。関数の型はdouble
sin(rad) radのsinの値が関数の戻り値となる。関数の型はdouble
cos(rad) radのcosの値が関数の戻り値となる。関数の型はdouble
tan(rad) radのtanの値が関数の戻り値となる。関数の型はdouble
randomSeed(seed) seedを初期値として擬似乱数ジェネレータにより乱数を発生できるようにする。テストなどで、同じ乱数の数列が必要な場合はseedの値を同じにする。通常は未接続のアナログ・ポートを読み込んだ値をseedとする
random(max) randomSeed(seed)で初期化された擬似乱数発生器で作られた、0からmax-1の値までの範囲の乱数が関数の戻り値となる。関数の型はlongとなる
long random(min,max) randomSeed(seed)で初期化された擬似乱数発生器で作られた、minからmax-1の値までの範囲の乱数が関数の戻り値となる。関数の型はlongとなる

●シリアル通信
 PCとの間でUSB経由の通信を行う場合このSerial.beginでシリアル・ポートの通信速度の設定を行います。

Serial.begin(speed) シリアル通信の通信速度を設定する。300,1200,2400,4800,9600,14400,19200,28800,38400,57600,115200の中から選ぶ。arduino IDEでシリアル通信のモニタの実施時に表示される通信速度と一致させる
Serial.print(data) データの値を10進数のテキスト表示データで送信する。
Serial.print(data,encoding)データをencodingで指定された表示形式のテキストとして送信する
Serial.println(data) dataの値を10進数のテキスト表示データで送信し、その後改行コードを送信する
Serial.println(data,encoding) データをencodingで指定された表示形式のテキストとして送信し、その後に改行コードを送信する
Serial.available() シリアル・ポートの受信バッファに受信され読み取ることのできるデータの数が関数の戻り値となる。戻り値のデータ型は整数型
Serial.read() 受信バッファから1バイトのデータを読み取る
Serial.flush() 受信バッファをクリアする