プログラムの作法
Arduinoのプログラミング今回学ぶもの
今回のセミナーで学ぶものは、・プログラムの構造の要素（setupとloop）
・digitalWrite(ピン番号,状態）;
・pinMode(ピン番号,モード）;・delay(待ち時間ミリ秒）;
・Serial文による通信の設定
・変数と定数・const文
・変数の型の種類
・変数の型で決められている扱える数値の範囲
・ビットの考え方、計算の仕方
・計算（演算）の仕方
・条件分岐(if)・繰り返し処理（for)・繰り返し処理（while)1.ArduinoのLEDを点滅させるプログラム
Arduinoにはプログラムから制御できるLEDが１つ実装されている※場所はボードで異なります

このようなプログラムでLEDを１秒点滅で動作させることができます。
delayはマイコンの処理を指定したミリ秒だけ停止する命令です。
プログラムはすべて半角英数文字で書きます。
実験としてdelayの中の数値を10にしたり10000にしたりしてどのように動くか確認してみましょう。

2.Arduinoのプログラムの構造
Arduinoのプログラムは、初期化された時に呼び出される「void setup()」と実行時に常時呼び出される「void loop()」の２つのブロックで構成されています。

void setup()はarduinoの入出力の設定をしたり、パラメータの初期}初期化時に呼び出し 化をしたりします。
}実行時に呼び出し

void loop()はarduinoで行いたい処理を書きます。

ﬁg1のプログラムを書き換えて、loop()の中のLEDを点灯し1秒待つ部分をsetup()に持っていき動きがどのように変わるか確認する。

3.変数
マイコンには変数という概念があります。
センサーからの情報や、スイッチの状態は気温や作業者の操作で状態が変わります。
このように状態が変わるものを覚えておく箱のようなものが「変数」になります。
作業者の操作スイッチは「デジタル」

１

で学んだ通り、押す＝１押さない＝０の２つの状態があります。

0

その状態を記憶するのが変数になります。

arduinoにGROVEをセットし、D5にプッシュスイッチを繋いでﬁg-3を呼び出して転送した後に、シリアルモニタを呼び出してスイッチの操作をしたときにどのように表示が変わるかみてみましょう。
swという「変数」にdigitalRead(指定した場所からデジタル信号を入力する）コマンドによって、読み出されたスイッチの状態が代入されます。
swという変数の名前を別な名前（push̲buttonなど）に変えて動作を確認してみましょう。
変数の名前は自由に付けることができますが、arduinoが初めから持っている命令語などは名前にすることはできません。
（変数名でSerialやintはつけられない）

覚えておこう！
arduinoはデジタル入出力の設定を３パターンで設定できます。
簡単にいうとマイコンの１つの端子を２つの入力モードと１つの出力モード（計３パターン）で使うことができます。
命令語

pinModeで指定します。

（例）
pinMode(5,INPUT̲PULLUP);
pinMode(3,INPUT);
pinMode(13,OUTPUT);

モード

記述方法

通常入力

INPUT

プルアップ入力

INPUT̲PULLUP

出力OUTPUTarduinoは様々な情報を扱うことができますが、その情報の種類の分だけ変数の種類があります。

種類変数の型名

unsigned long 変数名

値の範囲-32768~32767
0~255-128~1270~2550~65535
0~65535-2147483648~2147483647
0~4294967295

実数

ﬂoat 変数名-3.4028235e38~+3.4028235e38

文字列char 変数名[]“Arduino”等

int 変数名
byte 変数名
char 変数名

整数

unsigned char 変数名
unsigned int 変数名
word 変数名
long 変数名

ﬁg-4を呼び出して、arduinoに転送し結果をシリアルモニタで見てみましょう。
そのあとに、a1=255;をa1=1000;にしてどうなるか確認しましょう。
そしてbyte をintにしたらどのように変わるか確認しましょう。

byte型に1000を入れたらどうして232になるのかな？？

1000は左の2進数の表で言うとarduinoでは宣言された変数を超える値を入力されると、超えた分は無視されます。

1000-512 =1(引けたので1)byte型は１バイト(8ビット)で表される情報を取り扱います。

残り488-256=1
残り232-128=1
残り104-64=1

ビットというのはマイコンの処理の最低単位で１か０かを示す単位です。

残り40-32=1
1288ビット

6432

1684217ビット 6ビット 5ビット 4ビット 3ビット 2ビット 1ビット
01101110010111011110001001101010111100110111101111100001000110010100111000010001

10進数

残り8-16=0(引けないので0)
残り8-8=10123456789101112131415161718192021

残り0-4=0
残り0-2=0
残り0-1=0
2進数の11 1110 1000 になる。
byte型は1バイト(255までの数）を記憶できるので、覚えられる範囲をみると1110 1000になる。
つまり、232になる。

128+64+32+8=

変数の範囲を把握してプログラムを作る必要がある！

変数の逆の機能は定数になります。
プログラム中に書かれている、a1=255;などの「255」が定数になります。
定数はプログラム中に書かれる数値などになりますが、名前がつけられません。
名前付きの定数を使いたいときはconstを使います。
D5の配線をLEDに変えてから、ﬁg-5を開いてみてください。
pinModeのあとに「５」と書いてありますが、これはarduinoの5番目のピンを示します。
先ほどまでは入力で使ってましたが、今度は出力で使うので、OUTPUTと書きます。
LEDを点灯させて、delayで1000を指定しているので1秒処理を待ち、LEDを消灯させて、また１秒待つ動作を５回繰り返すプログラムですがこれのピン番号を６にしてdelayの待ち時間を0.5秒にするのには全ての行を書き換えないといけません。
とても大変な作業になりますね。
ﬁg-6を開いてみましょう。
先頭にconst int OUT̲PIN=5;
const int DELAY̲TIME=500;と書いてあります。
ここの定数を書き換えるだけで済むので変更が楽になりますし、多くの場所を書き換えないで済みます。

ここまでのまとめ
1.arduinoのプログラムはsetup()とloop()の２つのブロックで構成されていて、それぞれ初期化と実行処理を表す。
2.変数は状態が変化する値を入れる「箱」。
3.変数は扱う情報によって箱の種類が異なる。適した変数（箱）を使うこと。
4.名前付き定数を使うと、変更が楽になる。また打ち間違いのミスも防げる。

4.演算
マイコンは情報を処理して制御を行うことから様々な計算をすることができる機能があります。
(例）１）四則演算アナログ入力は0~1023までの値で入力が足し算：a=5+1;行えますが、ボリュームは0~270度の可動域

引き算：a=6-2;を持っています。

掛け算：a=10*2; (*アスタリスクを使う）

そのため、1023を270で割った3.788で割り算：a=100/5;(/ スラッシュを使う）

入力値を割ると角度に換算することができます。

２）余りを求める
a=10%3; 結果は1
a=9%5; 結果は4３）代入する
a=1; 変数aに1を代入。
a=digitalRead(5); ５番ピンの情報をデジタル入力として変数aに代入(例）・半径50mmの円の面積をbに代入する。
int r=50;
const ﬂoat pi=3.14;
ﬂoat b=r*r*pi;(例）温度センサをA0に繋いだ状態で、室温が２０度の時に読み取り値が387だった。
センサーの特性が温度に対して比例的に変化するのであれば、４０度の時は387*2=774になると思われる。
その場合に読み取り値を温度に換算するためには20/387=0.05167になるので、読み取り値に0.05167を掛ければ温度にすることができる。

5.条件分岐制御は一般的に、「スイッチやセンサーの状態が変化したら、何かを動かす」という流れになっています。
例えば、水温センサーが９７度を超えたらヒーターの電源を切る電気ケトルや、人体検出センサーの前を人が横切ったらライトをつける防犯センサーなどがありますね。
ではこの防犯センサーをプログラムで考えてみるとどのような形になるでしょうか？

人がセンサーの前にいるか？

ライトをつけるいるいない

このように、条件によって処理を変えることを「条件分岐」と言います。
arduinoの条件分岐は主に「if」というコマンドで行います。

if (条件) {・条件が成立したときに処理する内容を書く。
} else {・条件が成立しないときに処理する場合はここに内容を書く。
}

先ほどの防犯センサーをプログラム的に書いてみるとこのようになります。
loop(){
int センサーの変数=人体検出センサーからの入力；
if (センサーの変数＞人を検出するしきい値）{ライトをつける;}}
if 文の（）の中の条件には上の例のように「>」の様な演算子と言われるものを使って分岐条件を書きます。
演算子は以下の種類があります。

条件演算子

例

等しい

＝＝

x==y(xとyは等しい）

等しくない

!=

x!=y(xとyは等しくない）小さい<

x<y(xはyより小さい）

大きい>

x>y(xはyより大きい）以下<=

x<=y(xはy以下)

以上>=

x>=y(xはy以上）

ﬁg-8を読み込んで書かれている処理を読み、理解できるか確認してください。
なお、人体検出センサーはキットに組み込まれていないので、明るさセンサーを使います。
明るさセンサーを手で遮って暗くし、LEDが点灯するか確認してください。
なお、明るさセンサーはA0に、LEDはD6に接続します。

pinMode()関数は指定したピンを入力で使うか出力で使うか指定します。
digitalWrite()関数は指定したピンの出力をLOWにするかHIにするか指定します。
analogRead()関数はアナログピンからの入力値を取得します。

6.繰り返し制御では繰り返し動作をさせたいときがあります。
例えば、車のワイパーはウインドウォッシャー液を出した時は３回程度往復運動をします。
また、パソコンなどは起動不能になって画面表示も行えない時は、ブザー音の回数で異常の種類を通知します。
arduinoでは繰り返し処理を行う時にfor()命令やwhile()命令を使って行います。

・for()命令の書き方
for (カウンターの初期設定;条件式;加算・減算処理）{
繰り返し実行される処理;}

i<=10; i>=0;
カウンターを初期設定する

i=1;

カウント条件が成立しているか？

いない

i=10;

いる

カウンターを加算・減算

i=i+1;
i=i-1;

繰り返しを抜ける

for()命令は、繰り返す回数が決まっている時に便利！

for()命令の例

D6にブザーを繋いで実行すること。
実行すると、モールス信号のSOSの音を出します。

・while()命令の書き方
while(条件式）{
繰り返し実行される処理;}

条件が成立したか？

した

繰り返したい処理

していない

繰り返しを抜ける

while()命令は、繰り返す回数が決まっていない時に使う！

while()命令の例

D5にブッシュスイッチを繋ぎ、D6にブザーを繋いで実行すること。
実行するとプッシュスイッチを押さない限りブザーが止まない。

以上で今回の講義は終了です。