arduinoでプログラミングに触れてみよう
TRANSCRIPT
自己紹介• 国際大会
• アジア太平洋情報オリンピック 2012 銅メダル
• Intel ISEF 2014 Fondazione Bruno Kessler Award
• CODEGATE Junior CTF 2014 7th
• DEFCON CTF 2014 13th
プログラミングの力
• 物理学
• CERNのLHCは1秒に300GBのデータを観測する
• 1時間で64GBのiPhone 2万台近くのデータ量
• 36ヶ国のコンピュータで分散して自動分析し1000分の1のサイズで必要なデータを抜き出す
http://www.ibtimes.co.uk/cerns-large-hadron-collider-re-starts-after-two-year-shutdown-1491826
プログラミングの力
• 地学
• 国立天文台は国内11位のスパコンを所有
• すばる望遠鏡の観測データの分析
• 宇宙現象のシミュレーション
http://www.nao.ac.jp/gallery/weekly/2014/20140422-aterui.html
プログラミングの力
• 化学
• 化学反応のシミュレーションがポピュラーに
• 「京」でも様々な反応シミュレーションが
• タミフルの設計にも使われた
http://www.nao.ac.jp/gallery/weekly/2014/20140422-aterui.html
プログラミングの力• 生物学
• バイオインフォマティクス
• たくさんの遺伝子解読ができるのはコンピュータとアルゴリズムのおかげ
• 細かい遺伝子の切れ端がうまく繋がるようにパズルを解く
http://www.bio-itworld.com/2014/12/22/nanopore-sequencing-here-stay.html
プログラミングの基本概念
• コンピューターが理解できるようにプログラミング言語を使う
• 人間はコンピューターにさせたい内容をプログラミング言語に翻訳して伝える
• コンピューターはプログラミング言語を0と1で表されるデータに翻訳して動かす
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
2つのグループに分けられる
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
最初の1回だけ 実行される
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
最初の1回だけ 実行される
繰り返し実行される
LEDを光らせるプログラムpinMode(13, OUTPUT);
digitalWrite(13, HIGH); digitalWrite(13, HIGH); digitalWrite(13, HIGH); digitalWrite(13, HIGH); digitalWrite(13, HIGH); digitalWrite(13, HIGH); digitalWrite(13, HIGH); digitalWrite(13, HIGH); …
← 最初の1回だけ 実行される
電源が切れるまで永遠に実行される
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
最初の1回だけ 実行される
繰り返し実行される
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを OUTPUTに使用する
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを OUTPUTに使用する
=
+として電流を出せるように
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを HIGHに設定する
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを HIGHに設定する
=
+から電流を出す
LEDを光らせるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← LOWにすると LEDは光らない
• 関数 = よく使う処理をまとめたもの
• 例: x = 1 ~ 3 について x3 + x2 + x を計算させたい
• 人間「13 + 12 + 1 は?」 コンピューター「3」人間「23 + 22 + 2 は?」 コンピューター「12」人間「33 + 32 + 3 は?」 コンピューター「18」
プログラミングの基本概念
• 関数 = よく使う処理をまとめたもの
• 例: x = 1 ~ 3 について x3 + x2 + x を計算させたい
• 人間「13 + 12 + 1 は?」 コンピューター「3」人間「23 + 22 + 2 は?」 コンピューター「12」人間「33 + 32 + 3 は?」 コンピューター「18」
プログラミングの基本概念
プログラミングの基本概念
• 関数 = よく使う処理をまとめたもの
• 例: x = 1 ~ 3 について x3 + x2 + x を計算させたい
• 人間「13 + 12 + 1 は?」 コンピューター「3」人間「23 + 22 + 2 は?」 コンピューター「12」人間「33 + 32 + 3 は?」 コンピューター「18」
プログラミングの基本概念
• 関数 = よく使う処理をまとめたもの
• 例: x = 1 ~ 3 について x3 + x2 + x を計算させたい
• 人間「f(x) = x3 + x2 + x とします」 人間「f(1) は?」 コンピューター「3」人間「f(2) は?」 コンピューター「12」人間「f(3) は?」 コンピューター「18」
プログラミングの基本概念
• 関数 = よく使う処理をまとめたもの
• 例: x = 1 ~ 3 について x3 + x2 + x を計算させたい
• 人間「f(x) = x3 + x2 + x とします」 人間「f(1) は?」 コンピューター「3」人間「f(2) は?」 コンピューター「12」人間「f(3) は?」 コンピューター「18」
プログラミングの基本概念
• 関数 = よく使う処理をまとめたもの
• pinMode()やdigitalWrite()も関数
• digitalWrite()を使うたびに処理をすべて書くのはしんどい
void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *out; if (port == NOT_A_PIN) return; // If the pin that support PWM output, we need to turn it off // before doing a digital write. if (timer != NOT_ON_TIMER) turnOffPWM(timer); out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { *out &= ~bit; } else { *out |= bit; } SREG = oldSREG; }
プログラミングの基本概念
• 関数 = よく使う処理をまとめたもの
• pinMode()やdigitalWrite()も関数
• digitalWrite()を使うたびに処理をすべて書くのはしんどい
LEDを光らせてみよう
void setup() { pinMode(2, OUTPUT); }
void loop() { digitalWrite(2, HIGH); }
← 13を2に変更する
← 13を2に変更する
LEDを点滅させる
• プログラミングでLEDを点滅させる
• 点滅 = 「一定時間点けて、一定時間消す」を 繰り返す
• delay(1000) ← 1000ミリ秒(=1秒)間 そのままの状態で待つ
LEDを点滅させる• クイズ: 次の3つの命令を使って LEDを点滅させるにはどうすればいい?
• digitalWrite(13, HIGH); 13番ピンをHIGHに設定 = LEDを光らせる
• digitalWrite(13, LOW); 13番ピンをLOWに設定 = LEDを消す
• delay(1000); 1000ミリ秒(=1秒)間そのままの状態で待つ
LEDを点滅させる
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); digitalWrite(13, LOW); delay(1000); }
①
LEDを点滅させる
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); }
②
LEDを点滅させる
void setup() { pinMode(13, OUTPUT); }
void loop() { delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); }
③
LEDを点滅させる
delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW);
③digitalWrite(13, HIGH); digitalWrite(13, LOW); delay(1000);
①
digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW);
②
繰り返し部分だけ抜き出すと以下のとおり
LEDを点滅させる
delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW);
③digitalWritedigitalWritedelay
①
digitalWritedelaydigitalWrite
②
繰り返し部分だけ抜き出すと以下のとおり
LEDを点滅させるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); }
LEDを点滅させるプログラムpinMode(13, OUTPUT);
delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); …
← 最初の1回だけ 実行される
電源が切れるまで永遠に実行される
LEDを点滅させるプログラムpinMode(13, OUTPUT);
delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); …
最初はそのまま← 待っても何もない
LEDを点滅させるプログラムpinMode(13, OUTPUT);
delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); …
最初はそのまま← 待っても何もない
この4行の繰り返しと考えてもほとんど変わらない
LEDを点滅させるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
LEDを点滅させるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
一定時間点けて一定時間消す
LEDを点滅させるプログラム
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
一定時間点けて一定時間消す
※資料と同じように 色がついているチェック
LEDを点滅させてみよう
• チャレンジ: プログラムを改造してみよう
• 0.1秒点灯 / 0.1秒消灯
• 1秒点灯 / 0.5秒消灯
• (0.5秒点灯 / 1秒消灯) x 2 → 1秒点灯 / 0.5秒消灯
LEDを点滅させてみよう• チャレンジ: 0.1秒点灯 / 0.1秒消灯
void loop() { digitalWrite(13, HIGH); delay(100); digitalWrite(13, LOW); delay(100); }
LEDを点滅させてみよう• チャレンジ: 1秒点灯 / 0.5秒消灯
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(500); }
LEDを点滅させてみよう• チャレンジ: (0.5秒点灯 / 1秒消灯) x 2 → 1秒点灯 / 0.5秒消灯
void loop() { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(1000); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(500); }
ボタンの状態を読み取ってみよう
• ここまでは回路に出力だけしてきた
• pinMode(13, OUTPUT); ← 13番ピンを出力設定
• ここからは回路から信号を読み取ってみる
• pinMode(1, INPUT); <- 1番ピンを入力設定
ボタンを押した時にLEDを光らせるvoid setup() { pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else {
}
条件にあてはまるとき ・処理1は実行される ・処理2は無視される
if (条件) {
処理1;
}
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else {
}
条件にあてはまらないとき ・処理1は無視される ・処理2は実行される
else { 処理2; }
ボタンを押した時にLEDを光らせるvoid setup() { pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
ボタンを押した時にLEDを光らせる
if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
ボタンを押した時にLEDを光らせる
if ( } else { }
digitalRead(1) == HIGH
• digitalRead(1): 1番ポートに電流がきているか
• digitalRead(1) == HIGH 1番ポートに電流がきているときにあてはまる
ボタンを押した時にLEDを光らせる
if ( } else { }
if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); }
• 1番ポートに電流がきているとき
• digitalWrite(13, HIGH);が実行される
ボタンを押した時にLEDを光らせる
if ( } else { }
else { digitalWrite(13, LOW); }
• 1番ポートに電流がきていないとき
• digitalWrite(13, HIGH);が実行される
ボタンを押した時にLEDを光らせるvoid setup() { pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
ボタンを押した時にLEDを光らせるvoid setup() { pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
← 1番ポートを入力に使用← 13番ポートを出力に使用
ボタンを押した時にLEDを光らせるvoid setup() { pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
← ボタンが押されたら LEDを点灯
← 1番ポートを入力に使用← 13番ポートを出力に使用
ボタンを押した時にLEDを光らせるvoid setup() { pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
← ボタンが押されたら LEDを点灯← ボタンが押されたら LEDを消灯
← 1番ポートを入力に使用← 13番ポートを出力に使用
ボタンを押した時にLEDを消す
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
クイズ: 逆に押した時にLEDを消すには?
ボタンを押した時にLEDを消す
void loop() { if (digitalRead(1) == HIGH) { digitalWrite(13, LOW); } else { digitalWrite(13, HIGH); } }
クイズ: 逆に押した時にLEDを消すには?
ボタンを押した時にLEDを消す
void setup() { pinMode(5, INPUT); pinMode(13, OUTPUT); }
クイズ: プログラム側のポートだけを 1番から5番に変えるとどうなる?
void loop() { if (digitalRead(5) == HIGH) { digitalWrite(13, LOW); } else { digitalWrite(13, HIGH); } }
ボタンを押した時にLEDを消す
void }
void if ( } else { }}
pinMode(5, INPUT);
if (digitalRead(5) == HIGH) {
クイズ: プログラム側のポートだけを 1番から5番に変えるとどうなる?
まとめ• プログラミングとは、プログラミング言語を使ってコンピューターに命令を与えること
• 基本は命令を順番に辿っていくが条件分岐や繰り返しを組み合わせ高度な制御をする
• プログラミングができなくてもプログラミングとはどういうものかプログラミングで何ができるのかを知るのが大切
ボタンでON/OFFを切り替えてみる
• ボタンを押した時の挙動を変える
• ONの状態で押された時 → LEDをOFFにする
• OFFの状態で押された時 → LEDをONにする
• いまどういう状態かを知る必要がある
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
int a;
a = 2;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
int a;
a = 2;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
← aという名前で変数を用意する
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
int a;
a = 2;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
← aという変数は2を意味することとする (aに2を代入する)
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
int a;
a = 2;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
← aという変数は2を意味することとする
← 「aが2と等しいか」 という条件分岐
int a;
a = 2;
if (a == 2) { digitalWrite(13, HIGH); }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
int
a = 2;
if } }
← aという変数は2を意味することとする
← 「aが2と等しいか」 という条件分岐
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
int a;
a = 2;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
int a;
a = 2; a = 1;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
int a;
a = 2; a = 1;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
← aという名前で変数を用意する
int a;
a = 2; a = 1;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
← aという変数は2を意味することとする (aに2を代入する)
int a;
a = 2; a = 1;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
← aという変数は1を意味することとする (aに1を代入する)
int a;
a = 2; a = 1;
if (a == 2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
← aという変数は1を意味することとする
← 「aが2と等しいか」 という条件分岐
int a;
a = 2; a = 1;
else { digitalWrite(13, LOW); }
int
a = 2; a = 1;
if } }
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
← aという変数は1を意味することとする
← 「aが2と等しいか」 という条件分岐
int
a = 2; a = 1;
if } }
a = 2; a = 1;
プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み
← aという変数は1を意味することとする
変数が指し示す値はいつでも変えられる
ボタンでON/OFFを切り替えてみる
• ボタンを押した時の挙動を変える
• ONの状態で押された時 → LEDをOFFにする
• OFFの状態で押された時 → LEDをONにする
• いまどういう状態かを保存する変数を使う
ボタンでON/OFFを切り替えてみる
• 変数 int state; を使用する
• state == 1 でボタンが押された時 → LEDをOFFにする
• state == 0 でボタンが押された時 → LEDをONにする
ボタンでON/OFFを切り替えてみる
• 変数 int state; を使用する
• state == 1 でボタンが押された時 → LEDをOFFにする state = 0; にする
• state == 0 でボタンが押された時 → LEDをONにする state = 1; にする
ボタンでON/OFFを切り替えてみる
• 変数 int state; を使用する
if (digitalRead(1) == HIGH) { if (state == 1) { digitalWrite(13, LOW); state = 0; } else { digitalWrite(13, HIGH); state = 1; } }
ボタンでON/OFFを切り替えてみる
int state;
void setup() { state = 0;
pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { if (state == 1) { digitalWrite(13, LOW); state = 0; } else { digitalWrite(13, HIGH); state = 1; } } }
ボタンでON/OFFを切り替えてみる
• ボタンを押した時に切り替わらない時がある
• 長押しするとチカチカしたり光らなかったり
• 正解のソースコードを掲載するので原因の究明は参加者への課題とします
ボタンでON/OFFを切り替えてみる
int state; int pressed;
void setup() { state = 0; pressed = 0;
pinMode(1, INPUT); pinMode(13, OUTPUT); }
void loop() { if (digitalRead(1) == HIGH) { if (pressed == 0) { if (state == 1) { digitalWrite(13, LOW); state = 0; } else { digitalWrite(13, HIGH); state = 1; } }
pressed = 1; } else { pressed = 0; } }