プログラムの作法 - no-ip › wordpress › wp-content ›...
TRANSCRIPT
プログラムの作法Arduinoのプログラミング
今回学ぶもの今回のセミナーで学ぶものは、
・プログラムの構造の要素(setupとloop) ・digitalWrite(ピン番号,状態); ・pinMode(ピン番号,モード); ・delay(待ち時間ミリ秒); ・Serial文による通信の設定 ・変数と定数 ・const文 ・変数の型の種類 ・変数の型で決められている扱える数値の範囲 ・ビットの考え方、計算の仕方 ・計算(演算)の仕方 ・条件分岐(if) ・繰り返し処理(for) ・繰り返し処理(while)
1.ArduinoのLEDを点滅させるプログラムArduinoにはプログラムから 制御できるLEDが1つ実装 されている ※場所はボードで異なります
このようなプログラムでLEDを1秒点滅で 動作させることができます。
delayはマイコンの処理を指定したミリ秒だけ 停止する命令です。
プログラムはすべて半角英数文字で書きます。 実験としてdelayの中の数値を10にしたり10000に したりしてどのように動くか確認してみましょう。
2.Arduinoのプログラムの構造Arduinoのプログラムは、初期化された時に呼び出される「void setup()」と実行時に常時呼び出される「void loop()」の 2つのブロックで構成されています。
}初期化時に呼び出し
}実行時に呼び出し
void setup()はarduinoの入出力の設定をしたり、パラメータの初期化をしたりします。
void loop()はarduinoで行いたい処理を書きます。
fig1のプログラムを書き換えて、loop()の中のLEDを点灯し1秒待つ部分をsetup()に持っていき動きがどのように変わるか確認する。
3.変数マイコンには変数という概念があります。 センサーからの情報や、スイッチの状態は気温や作業者の操作で状態が変わります。 このように状態が変わるものを覚えておく箱のようなものが「変数」になります。
スイッチは「デジタル」 で学んだ通り、押す=1 押さない=0の2つの状態が あります。 その状態を記憶するのが変数に なります。
作業者の操作 1
0arduinoにGROVEをセットし、D5にプッシュスイッチを繋いでfig-3を呼び出して転送した後に、シリアルモニタを呼び出して スイッチの操作をしたときにどのように表示が変わるかみてみましょう。
swという「変数」にdigitalRead(指定した場所からデジタル信号を入力する)コマンドによって、読み出されたスイッチの状態が代入されます。
swという変数の名前を別な名前(push_buttonなど)に変えて動作を確認してみましょう。
変数の名前は自由に付けることができますが、arduinoが初めから持っている命令語などは名前にすることはできません。 (変数名でSerialやintはつけられない)
覚えておこう!arduinoはデジタル入出力の設定を3パターンで設定できます。 簡単にいうとマイコンの1つの端子を2つの入力モードと1つの出力モード(計3パターン)で使うことができます。
命令語 pinModeで指定します。 (例) pinMode(5,INPUT_PULLUP); pinMode(3,INPUT); pinMode(13,OUTPUT);
モード 記述方法通常入力 INPUT
プルアップ入力 INPUT_PULLUP出力 OUTPUT
arduinoは様々な情報を扱うことができますが、その情報の種類の分だけ変数の種類があります。
種 類 変数の型名 値の範囲
整 数
int 変数名 -32768~32767byte 変数名 0~255char 変数名 -128~127
unsigned char 変数名 0~255unsigned int 変数名 0~65535word 変数名 0~65535long 変数名 -2147483648~2147483647
unsigned long 変数名 0~4294967295
実数 float 変数名 -3.4028235e38~+3.4028235e38
文字列 char 変数名[] “Arduino”等
fig-4を呼び出して、arduinoに転送し結果をシリアルモニタで見てみましょう。 そのあとに、a1=255;をa1=1000;にしてどうなるか確認しましょう。
そしてbyte をintにしたらどのように変わるか確認しましょう。
byte型に1000を入れたらどうして232になるのかな??
arduinoでは宣言された変数を超える値を入力されると、超えた分は無視されます。 byte型は1バイト(8ビット)で表される情報を取り扱います。
ビットというのはマイコンの処理の最低単位で1か0かを示す単位です。
128 64 32 16 8 4 2 1 10進数
8ビット 7ビット 6ビット 5ビット 4ビット 3ビット 2ビット 1ビット0 01 1
1 0 21 1 3
1 0 0 41 0 1 51 1 0 61 1 1 7
1 0 0 0 81 0 0 1 91 0 1 0 101 0 1 1 111 1 0 0 121 1 0 1 131 1 1 0 141 1 1 1 15
1 0 0 0 0 161 0 0 0 1 171 0 0 1 0 181 0 0 1 1 191 0 0 0 0 201 0 0 0 1 21
1000は左の2進数の表で言うと 1000-512 =1(引けたので1) 残り488-256=1 残り232-128=1 残り104-64=1 残り40-32=1 残り8-16=0(引けないので0) 残り8-8=1 残り0-4=0 残り0-2=0 残り0-1=0
2進数の 11 1110 1000 になる。 byte型は1バイト(255までの数)を記憶できるので、覚えられる範囲をみると 1110 1000になる。 つまり、
128+64+32+8=232になる。
変数の範囲を把握して プログラムを作る 必要がある!
変数の逆の機能は定数になります。 プログラム中に書かれている、a1=255;などの「255」が定数になります。 定数はプログラム中に書かれる数値などになりますが、名前がつけられません。 名前付きの定数を使いたいときはconstを使います。
D5の配線をLEDに変えてから、fig-5を開いてみてください。
pinModeのあとに「5」と書いてありますが、 これはarduinoの5番目のピンを示します。 先ほどまでは入力で使ってましたが、今度は 出力で使うので、OUTPUTと書きます。
LEDを点灯させて、 delayで1000を指定しているので1秒処理を待ち、 LEDを消灯させて、 また1秒待つ動作を5回繰り返すプログラムですが これのピン番号を6にしてdelayの待ち時間を 0.5秒にするのには全ての行を書き換えないと いけません。
とても大変な作業になりますね。
fig-6を開いてみましょう。 先頭に const int OUT_PIN=5; const int DELAY_TIME=500; と書いてあります。 ここの定数を書き換えるだけで済むので変更が楽に なりますし、多くの場所を書き換えないで済みます。
ここまでのまとめ
1.arduinoのプログラムはsetup()とloop()の2つのブロックで構成されていて、それぞれ初期化と実行処理を表す。
2.変数は状態が変化する値を入れる「箱」。
3.変数は扱う情報によって箱の種類が異なる。適した変数(箱)を使うこと。
4.名前付き定数を使うと、変更が楽になる。また打ち間違いのミスも防げる。
4.演算マイコンは情報を処理して制御を行うことから様々な計算をすることができる機能があります。
1)四則演算 足し算:a=5+1; 引き算:a=6-2; 掛け算:a=10*2; (*アスタリスクを使う) 割り算:a=100/5;(/ スラッシュを使う)
2)余りを求める a=10%3; 結果は1 a=9%5; 結果は4
3)代入する a=1; 変数aに1を代入。 a=digitalRead(5); 5番ピンの情報をデジタル入力として変数aに代入
(例) ・半径50mmの円の面積をbに代入する。 int r=50; const float pi=3.14; float b=r*r*pi;
(例) アナログ入力は0~1023までの値で入力が 行えますが、ボリュームは0~270度の可動域 を持っています。 そのため、1023を270で割った3.788で 入力値を割ると角度に換算することができます。
(例) 温度センサをA0に繋いだ状態で、室温が20度の時に読み取り値が387だった。 センサーの特性が温度に対して比例的に変化するのであれば、40度の時は 387*2=774になると思われる。
その場合に読み取り値を温度に換算するためには20/387=0.05167になるので、 読み取り値に0.05167を掛ければ温度にすることができる。
5.条件分岐制御は一般的に、「スイッチやセンサーの状態が変化したら、何かを動かす」という流れになっています。 例えば、水温センサーが97度を超えたらヒーターの電源を切る電気ケトルや、人体検出センサーの前を 人が横切ったらライトをつける防犯センサーなどがありますね。
ではこの防犯センサーをプログラムで考えてみるとどのような形になるでしょうか?
人がセンサーの前に いるか?
ライトをつけるいる
いない
このように、条件によって処理を変えることを「条件分岐」と言います。 arduinoの条件分岐は主に「if」というコマンドで行います。
if (条件) { ・条件が成立したときに処理する内容を書く。 } else { ・条件が成立しないときに処理する場合はここに内容を書く。 }
先ほどの防犯センサーをプログラム的に書いてみるとこのようになります。
loop(){ int センサーの変数=人体検出センサーからの入力;
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以上)
if 文の()の中の条件には上の例のように「>」の様な演算子と言われるものを使って分岐条件を書きます。 演算子は以下の種類があります。
fig-8を読み込んで書かれている処理を読み、理解できるか確認してください。 なお、人体検出センサーはキットに組み込まれていないので、 明るさセンサーを使います。
明るさセンサーを手で遮って暗くし、LEDが点灯するか確認してください。 なお、明るさセンサーはA0に、LEDはD6に接続します。
pinMode()関数は指定したピンを入力で使うか出力で使うか指定します。
digitalWrite()関数は指定したピンの出力をLOWにするかHIにするか指定 します。
analogRead()関数はアナログピンからの入力値を取得します。
6.繰り返し制御では繰り返し動作をさせたいときがあります。 例えば、車のワイパーはウインドウォッシャー液を出した時は3回程度往復運動をします。 また、パソコンなどは起動不能になって画面表示も行えない時は、ブザー音の回数で異常の 種類を通知します。
arduinoでは繰り返し処理を行う時にfor()命令やwhile()命令を使って行います。
カウンターを 初期設定する
・for()命令の書き方
for (カウンターの初期設定;条件式;加算・減算処理){ 繰り返し実行される処理; }
カウント条件が成立しているか?
カウンターを 加算・減算
いる
いない
繰り返しを 抜ける
i=1;
i<=10;
i=i+1;
i=10;
i>=0;
i=i-1;
for()命令は、繰り返す回数が決まっている時に便利!
for()命令の例
D6にブザーを繋いで実行すること。 実行すると、モールス信号のSOSの 音を出します。
条件が成立 したか?
・while()命令の書き方
while(条件式){ 繰り返し実行される処理; }
繰り返したい 処理
繰り返しを 抜ける
した
していない
while()命令は、繰り返す回数が決まっていない時に使う!
while()命令の例
D5にブッシュスイッチを繋ぎ、 D6にブザーを繋いで実行すること。
実行するとプッシュスイッチを押さない限り ブザーが止まない。
以上で今回の講義は 終了です。