[動画]
今回のプログラムを書き込むとこのように動きます。
早速上のコードをコピペするなりしてArduinoIDEからKTR-1へ書き込んでみてください。
スイッチからの入力を受けてArduino側で処理を行います。
また、関数や変数と言った言葉の意味に触れてもらったり
if文、for文といった制御文も使ってみてもらいます。
本項はプログラムの基礎を詰め込む羽目になってしまったので結構長いです。
体力に余裕のあるときにお読みください。
今回のスケッチを解説していきます。
急にスケッチの頭に書いてあることが増えましたがこちらはKTR-1上でどのピンが何に割り当てられているかを書いたものです。
const int LED1 = 14;
const int LED2 = 15;
const int BUZZ = 5;
const int Trig = 7;
const int AIN1 = 3;
const int AIN2 = 6;
const int BIN1 = 9;
const int BIN2 = 10;
const int VR = A0;
const int SW1 = A1;
const int SW2 = A2;
const int ECHO = 8;
例えばSW1はA1ピンに割りついている事が分かります。
KTR-1にプログラムを書く場合冒頭は変わらないのでコピペしてしまって構いません。
実際にどう繋がっているか見たい場合は基板を気合で追ってみるかGitHubをご確認ください。
概念的には上の通りなのですが頭についてるconst intって何?と思った方も居るのではないでしょうか。
ここから軽くスケッチ中に出てくる見慣れない単語を説明したいと思います。
前項でもdigitalWrite”関数”とさらっと言ってしまったのですが
関数は呼び出されると決まった処理をしてくれるソフト上の装置のような存在です。
digitalWrite関数は
digitalWrite(ピン番号, HIGHかLOW)
このように呼ぶとピン番号の出力を変更できる関数でした。
delay関数は
delay(ミリ秒);
呼ぶと指定したミリ秒待機してくれる関数です。
こういう存在を関数と呼びます。難しそうな言葉ですがそんなに怖い存在ではありません。
どんな関数がArduinoにあるか知りたくなった場合は
Arduino 日本語リファレンスを読むと楽しいと思います。
また、実は関数は自分で作ることも可能です。
決まった処理を何回かしたい場合はそのブロックを関数にしてしまうと便利です。
例えば皿を洗うとき
手で洗うと毎回大量の食器を洗うのは面倒ですが、食洗機を使えば楽に一気に皿を洗うことが出来ますよね。
手で洗う方が毎回コードを書いて
食洗機で洗うのが関数を使うイメージです。
手で洗うときのほうが頑固な汚れなどの例外に融通が効くのも似てる点かもしれません。
関数という言葉に続き”変数”という言葉もよく登場します。
意味としては変化する数ってことなのですが、
変数はプログラム上だと箱に例えられることが多いです。
また、スケッチのなかで使う値に名前を付けて保存するという表現も見つけました。
例えばArduinoでLEDを一定の長さで光らせてほしいという変人のAくんとBくんがCくんが居るとします。
それぞれAくんが5秒
Bくんが10秒
Cくんが2秒とします。
わざわざ
digitalWrite(LED1,HIGH);//A君用
delay(5000);
digitalWrite(LED1,LOW);
delay(5000);
digitalWrite(LED1,HIGH);//B君用
delay(10000);
digitalWrite(LED1,LOW);
delay(10000);
digitalWrite(LED1,HIGH);//C君用
delay(2000);
digitalWrite(LED1,LOW);
delay(2000);
と書いても良いのですが誰が何秒だったかわかんなくなってくるので、それぞれの数字に名前をつける事が出来ます。
int A_KUN = 5000 ;
int B_KUN = 10000 ;
int C_KUN = 2000 ;
このように書くとA,B,C_KUNが変数です。
「=」はプログラム上では代入を意味します。
なんだか変なカンジですね。
等号「=」の右側の値を、左側の変数に格納します。
これを宣言した変数に数字を代入すると表現します。
これが変数が箱に例えられる理由です。
この辺りはみなさんがつまずくポイントなので覚ておいてもらいたいです。
そして、それぞれの秒数の数字が、宣言したA,B,C_KUNという変数に代入され
int A_KUN = 5000 ;
int B_KUN = 10000 ;
int C_KUN = 2000 ;
digitalWrite(LED1,HIGH);//A君用
delay(A_KUN);
digitalWrite(LED1,LOW);
delay(A_KUN);
digitalWrite(LED1,HIGH);//B君用
delay(B_KUN);
digitalWrite(LED1,LOW);
delay(B_KUN);
digitalWrite(LED1,HIGH);//C君用
delay(C_KUN);
digitalWrite(LED1,LOW);
delay(C_KUN);
このように書くことが出来ます。
また変数宣言の前についていた謎の「int」ですが
変数の大きさを宣言時にコレで決めます。
intだと中に-32768から32767 までの数字を入れることが出来ます。
(なんか中途半端な数字に見えますがコンピュータ時にはキリのいい数字です。気になる方は2進数などを検索してみてください。)
これを変数の型と呼びます。
型を意識してプログラムができればイケイケプログラマ間違いなしです。
Arduino等で宣言された変数はArduino上のメモリに保存されるため残念ながら無限に数を記憶できるわけではないのです。
犬小屋を作るときに入る犬の大きさを考慮するように
変数に合った大きさで型宣言するとスマートです。
もう一度本項のプログラム冒頭を見せます。
const int LED1 = 14;
const int LED2 = 15;
const int BUZZ = 5;
const int Trig = 7;
const int AIN1 = 3;
const int AIN2 = 6;
const int BIN1 = 9;
const int BIN2 = 10;
const int VR = A0;
const int SW1 = A1;
const int SW2 = A2;
const int ECHO = 8;
bool SW1_State = 0; //プッシュボタンステータスを読み取るための変数
int型での変数宣言が何となくわかったところですが今回は「const」という謎の文字がついています。
「const」をつけると変数のように扱える定数になります。(宣言時以外値を変更できない。)
ピン番号を文字に置き換えることでKTR-1の場合は無いのですが割当ピンが途中で変更になってしまった際に変更が容易になったりします。
やっておいて損はないです。
ですが慣れないうちは直接ピン番号を指定してもらっても構いません。お好きなように遊んでください。
最後にスイッチの状態を入れる変数SW_1Stateを宣言しておきます。
これはbool型で宣言しているため中に入れることができるのはtrueかfalse(1か0)どちらかです。
別にint型でも普通に動きますが、-32768から32767 の中の0と1しか使わないので
6LLDDKKの物件に一人で住むようなもんです!流石にヒカキンさんでさえ、まるお・もふこ(猫)と3人で住んでますね。
また変数は関数の中で宣言するとその関数の中でしか機能しないローカル変数になってしまうため、そうしたくないものは関数の外で宣言してしまいます。
void setup() {
// LEDピンを出力として初期化します
pinMode(LED1, OUTPUT);
//押しボタンピンを入力として初期化します
pinMode(SW1, INPUT);
}
pinModeをOUTPUTにするのは前回やりましたが
今回スイッチは入力になるのでINPUTを指定します。
void loop() {
//プッシュボタン値の状態を読み取ります
SW1_State = digitalRead(SW1);
//押しボタンが押されているかどうかを確認します。 押されている場合、SW1はHIGHです。
if (SW1_State == HIGH) {
// LEDを5回点滅させます。
for (int i=0; i <= 4; i++){
digitalWrite(LED1, HIGH);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
}
} else {
// LEDをオフにします:
digitalWrite(LED1, LOW);
}
}
まず変数SW1_StateにdigitalRead();関数で読んだ値が代入されます。
SW1ピンに加わった電圧によりHIGHかLOW(1か0)が返って来るのでSW1_State変数の中にはそれが入ります。
ちなみに下記が押しボタンスイッチ(タクトスイッチ)の回路図です。スイッチを押していないとピンに0Vが、押していると5Vが現れるため
電圧によりHIGH,LOWをArduinoに対して入力することが出来ます。
スイッチはKTR-1ではプルダウン接続という方法が取られています。
スイッチのつなぎ方によりdigitalReadで取得した際に何が返ってくるか変わるので(ボタンを押さないとHIGH、押すとLOWも可能)
Arduinoに直接スイッチをつなぎたくなった際には調べてみてください。
次にif文と呼ばれる制御文が書かれています。これ今後むちゃくちゃ使います。
if (条件式) {
// 条件式を満たしたとき実行される文
}
if (条件式) {
// 条件式を満たしたとき実行される文
}else{
// 条件式を満たさないとき実行される文
}
(条件式の例)
x == y (xとyは等しい)
x != y (xとyは等しくない)
x < y (xはy未満)
x > y (xはyを超過している)
x <= y (xはy以下)
x >= y (xはy以上)
まず条件式がOKかNGかの判断がされ、OKなら次の中括弧を。違うならelseの後の中括弧が実行されます。(else側は書かずに省略することも可能)
条件式は記載の通りでSW1_StateがHIGHである としたいときは
SW1_State == HIGH
と記述します。代入とでややこしいですね。
そしてif分のtrueの方に入ると今度はfor文が居ます。
こちらは決まった回数同じことを繰り返すときに使う制御文です。
for (初期化; 条件式; 加算) {
//実行される文;
}
特別な事がない限り
for (int i=0; i <= ??; i++)
このような記述で書かれることが多いです。
ゼロから始まるため条件式2つ目の数字に注意してください
((int i=0; i <= 5; i++)とすると6回実行されてしまう。)
このローカル変数iをfor文内で使う書き方もよく行われます。
for (int i=0; i <= 499; i++) { //Lチカの感覚がだんだん伸びてゆくプログラム例
degitalwrite(LED,HIGH);
delay(i);
degitalwrite(LED,LOW);
delay(i);
}
よくわからない場合はゴリ押しても同じ結果のスケッチを描くことが出来ます。
digitalWrite(LED1, HIGH);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
digitalWrite(LED1, HIGH);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
digitalWrite(LED1, HIGH);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
digitalWrite(LED1, HIGH);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
digitalWrite(LED1, HIGH);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
今回はここまでです。スイッチにより人間が動いているプログラムに指示を出せるようになりました!
これでArduinoの入出力を自在に操れるようになったため、作れるプログラムの幅が大幅に広がったと思います。
ボタンが押されたら三三七拍子でLEDを光らせてみよう