Arduinoでプログラミングに触れてみよう
続編
2016/01/10 Hiromu Yakura
自己紹介
• 矢倉 大夢 (やくら ひろむ)
• 筑波大学 情報学群 情報科学類 1年
• 情報処理推進機構 未踏クリエイター
目的
• プログラミングとはどういう作業かを知ってもらう
• プログラミングで必要な論理的思考を感じてもらう
• プログラミングの指示したとおりに動くという楽しさに触れてもらう
Arduino
• マイクロコントローラ
• コンピュータの機能がひとつの基盤に
• 3000円くらいで買える
セットアップ• 中央右の「Windows ZIP File for non admin install」
セットアップ• 右下の「JUST DOWNLOAD」
• ダウンロードしたファイルをダブルクリックで開き「ファイルをすべて解凍」をクリック
• ダイアログが出てきたら「展開」をクリック
• 解凍が終われば「arduino-1.6.7」フォルダを開く
セットアップ
• 付属のUSBケーブルでArduinoを接続する
• 「drivers」フォルダの「dpinst-x86.exe」を起動
• 「次へ」をクリックして、インストールを開始
セットアップ
セットアップ• 以下の様なダイアログが2-3回表示されるが すべて「インストールする」を選択する
セットアップ• 以下の画面になれば、インストール完了なので「完了」を押して終了する
セットアップ
• 「arduino-1.6.7」の「arduino.exe」を起動
• 「ツール」の「マイコンボード」を「Arduino/Genuino Uno」に 設定する
セットアップ
• 「ツール」の「シリアルポート」のうち 有効になっているものを 選択する
セットアップ
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
Breadboard
• はんだ付けせずに回路設計をするボード
• 裏側で配線されている
LEDを光らせてみよう
回路設計
262221
• LEDは足の長い方が21番にくるように
• 抵抗はどれでもOK
回路設計
• 13番ピンから赤
• + (電源供給) の役割
• GNDピンから青
• - の役割
LEDを光らせてみよう
• Arduino IDE
• Arduinoでプログラミングする用のソフトウェア
LEDを光らせてみよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
LEDを光らせてみよう
ここをクリック
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
回路を理解しよう
回路を理解しよう
• +から回路をたどる
• LEDを通る
• 抵抗を通る
• ーにたどりつく
• このような回路図
• 13番からLED
• LEDから抵抗
• 抵抗からGND
回路を理解しよう
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
2つのグループに分けられる
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
最初の1回だけ実行される
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
最初の1回だけ実行される
繰り返し実行される
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを OUTPUTに使用する
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを OUTPUTに使用する
=
+として電流を出せるように
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを HIGHに設定する
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← 13番ピンを HIGHに設定する
=
+から電流を出す
プログラムを理解しよう
void setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); }
← LOWにすると LEDは光らない
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); }
プログラムを理解しようvoid setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
← 13番ピンを HIGHに設定する
+から電流を出す
=
プログラムを理解しようvoid setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
← 1000ms (1秒間) そのままにする
プログラムを理解しようvoid setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
← 13番ピンを LOWに設定する
=+からの電流を止める
プログラムを理解しようvoid setup() { pinMode(13, OUTPUT); }
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
← 1000ms (1秒間) そのままにする
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を点滅させてみよう
• 上級者向け: 回路とプログラムを改造してみよう
• 2つのLEDを点灯させてみよう
• setupとpinModeを同様に使えばよい
• 2つのLEDを点滅させてみよう
LEDを点滅させてみよう• 上級者向け: 回路とプログラムを改造してみよう
• 2つのLEDを異なる周期で点滅させてみよう
• 1つ目は1秒ごと、2つ目は0.5秒ごとに点滅
• 1つ目は1秒ごと、2つ目は0.3秒ごとに点滅
• 変数と条件分岐(後述)を使えば良い
センサーを読み取ってみよう
• CdSセンサー
• 赤茶色の部分がCdS(硫化カドミウム)
• 明るいと抵抗値が低く暗いと抵抗値が高くなる
センサーを読み取ってみよう
回路設計
2923 28
• CdSセンサーはどっち向きに刺してもOK
• 抵抗はどれでもOK
回路設計• 5Vピンから赤
• + (電源供給) の役割
• GNDピンから青
• - の役割
• A0ピンから緑
• センサーの値を読み取る役割
センサーを読み取ってみようint val;
void setup() { Serial.begin(9600); }
void loop() { val = analogRead(0); Serial.println(val); delay(100); }
センサーを読み取ってみよう
ここをクリック
センサーを読み取ってみよう• 「ツール」の「シリアルモニタ」を選択
• 右下が「9600 bps」になっていることを確認
センサーを読み取ってみよう
• 手をかざして値の変化を見てみる
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• CdSセンサーを通る
• ーにたどりつく
回路を理解しよう
• +から回路をたどる
• 抵抗を通る
• 枝分かれ
• A0にたどりつく
• ーにたどりつく
回路を理解しよう
回路を理解しよう
• このような回路図
• 5Vから抵抗
• 枝分かれしてA0
• センサーからGND
センサーを読み取ってみよう
• CdSセンサー
• 赤茶色の部分がCdS(硫化カドミウム)
• 明るいと抵抗値が低く暗いと抵抗値が高くなる
センサーを読み取ってみよう
• CdSセンサー
• 赤茶色の部分がCdS(硫化カドミウム)
• 明るいと抵抗値が低く暗いと抵抗値が高くなる
回路を理解しよう
• 明るいとき
• センサーの抵抗値が高くなる
• A0の電圧が高くなる
回路を理解しよう
• 暗いとき
• センサーの抵抗値が低くなる
• A0の電圧が低くなる
int val;
void setup() { Serial.begin(9600); }
void loop() { val = analogRead(0); Serial.println(val); delay(100); }
プログラムを理解しよう← valという変数を宣言
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
← 変数宣言 valという領域を 作る
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
val
← 変数宣言 valという領域を 作る
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
← 代入 valを100と 設定する
← 変数宣言
val
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
← 代入 valを100と 設定する
← 変数宣言
val
100
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
← 変数宣言
val
100← 代入 ← 100ミリ秒待つ
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
← 変数宣言
val
100← 代入
← 代入 valを200と 設定する
← 100ミリ秒待つ
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
← 変数宣言
val
200← 代入
← 代入 valを200と 設定する
← 100ミリ秒待つ
← 代入
プログラミングの基本概念• 変数 = 情報を記録しておくための領域
int val; val = 100; delay(val); val = 200; delay(val);
← 変数宣言
val
200← 代入
← 200ミリ秒待つ
← 100ミリ秒待つ
int val;
void setup() { Serial.begin(9600); }
void loop() { val = analogRead(0); Serial.println(val); delay(100); }
プログラムを理解しよう← valという変数を宣言
int val;
void setup() { Serial.begin(9600); }
void loop() { val = analogRead(0); Serial.println(val); delay(100); }
プログラムを理解しよう
← シリアル通信の 速度を設定
• シリアル通信 = ArduinoとPC間での通信ができる シリアルモニタで送受信ができる
プログラミングの基本概念
• シリアル通信 = ArduinoとPC間での通信ができる シリアルモニタで送受信ができる
プログラミングの基本概念
Serial.begin(9600); - 通信の速度を設定する
• シリアル通信 = ArduinoとPC間での通信ができる シリアルモニタで送受信ができる
プログラミングの基本概念
← PC側の設定と 一致していないと 正しく通信できない
Serial.begin(9600); - 通信の速度を設定する
• シリアル通信 = ArduinoとPC間での通信ができる シリアルモニタで送受信ができる
プログラミングの基本概念
Serial.begin(9600); - 通信の速度を設定する
Serial.println(データ); - データを1行分PCへ送信する
Serial.print(データ); - データをPCへ送信する(改行されない)
int val;
void setup() { Serial.begin(9600); }
void loop() { val = analogRead(0); Serial.println(val); delay(100); }
プログラムを理解しよう
← A0ポートの電圧を 数値として読み取る 0~5Vが0~1023に対応
int val;
void setup() { Serial.begin(9600); }
void loop() { val = analogRead(0); Serial.println(val); delay(100); }
プログラムを理解しよう
← valに記憶された A0の値を シリアル通信で送信
int val;
void setup() { Serial.begin(9600); }
void loop() { val = analogRead(0); Serial.println(val); delay(100); }
プログラムを理解しよう
← 100ms (0.1秒間) 待つ
回路を理解しよう
• 明るいとき
• センサーの抵抗値が低くなる
• A0の電圧が低くなる
回路を理解しよう
• 暗いとき
• センサーの抵抗値が高くなる
• A0の電圧が高くなる
センサーを読み取ってみよう• 手をかざして値の変化を見てみる
• 明るい時に低く、暗い時に高くなっているはず
センサーを読み取ってみよう
• チャレンジ: プログラムを改造してみよう
• 0.5秒ごとに読み取った値を送る
• 送る値を明るい時は低く、暗い時は高いまま0~511にする
センサーを読み取ってみよう
• チャレンジ: 0.5秒ごとに読み取った値を送る
void loop() { val = analogRead(0); Serial.println(val); delay(500); }
センサーを読み取ってみよう
• チャレンジ: 送る値を0~511にする
void loop() { val = analogRead(0); Serial.println(val / 2); delay(100); }
analogReadで読み取る値は0~1023なので 2で割ると切り捨てられて0~511になる
センサーを読み取ってみよう
• 上級者向け: 回路を改造してみよう
• プログラムはそのままでLEDを追加して暗い時ほど明るく光るようにする
• ヒント: 暗い時ほどLEDに 高い電圧がかかればよい
センサーとLEDを組み合わせてみよう
回路設計
• 右半分はさっきと同じ
• LEDは21番に足の長い方を
• 抵抗はどれでもOK2115 20
回路設計
• A0ピンから緑
• センサーの値を読み取る役割
• 13番ピンから黄
• LEDに電気を流す役割
センサーとLEDを組み合わせてみようint val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(100); }
センサーとLEDを組み合わせてみよう
ここをクリック
• LEDの回路と センサーの回路をそのまま組み合わせた
• GNDは共通して-の列を使う
回路を理解しよう
• LEDの回路と センサーの回路をそのまま組み合わせた
• GNDは共通して-の列を使う
回路を理解しよう
← A0ポートの電圧を 数値として読み取る
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
← 条件分岐
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (条件) {
処理1;
} else { 処理2; }
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else {
}
条件にあてはまるとき ・処理1は実行される ・処理2は無視される
if (条件) {
処理1;
}
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else {
}
条件にあてはまらないとき ・処理1は無視される ・処理2は実行される
else { 処理2; }
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (条件) {
処理; }
条件にあてはまるときだけ 処理が実行される
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (条件1) {
処理1;
} else if (条件2) { 処理2;
} else { 処理3; }
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else if (
} else {
}
if (条件1) {
処理1;
} 条件1にあてはまるとき ・処理1は実行される ・処理2は無視される ・処理3は無視される
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else if (
} else {
}
else if (条件2) { 処理2;
} else { 処理3; }
条件1にあてはまらないとき
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else if (
} else {
}
else if (条件2) { 処理2;
}
条件1にあてはまらず 条件2にあてはまるとき ・処理1は無視される ・処理2は実行される ・処理3は無視される
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (
} else if (
} else {
}
else { 処理3; }
条件1にあてはまらず 条件2もあてはまらないとき ・処理1は無視される ・処理2は無視される ・処理3は実行される
プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える
if (条件1) {
処理1;
} else if (条件2) { 処理2; }
条件1にあてはまるとき 処理1が実行される
条件1にあてはまらず 条件2にあてはまるとき処理2は実行される
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
← valが800より大きいか
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
← valが800より大きいか
=
センサーの値が800より大きいか
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
← valが800より大きいか
=
センサーの値が800より大きいか
≒ある程度以上明るいか
int
void }
void val = } } }
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } delay(100); }
プログラムを理解しよう
← 明るい時は 13番ピンをHIGHに
int
void }
void val = } } }
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } delay(100); }
プログラムを理解しよう
← 明るい時は 13番ピンをHIGHに
LEDに電流を送る=
int
void }
void val = } } }
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
← 暗い時は 13番ピンをLOWに
int
void }
void val = } } }
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
← 暗い時は 13番ピンをLOWに
LEDへの電流を止める
=
int val;
void setup() { pinMode(13, OUTPUT); }
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(100); }
プログラムを理解しよう
← 100ms (0.1秒) 間待つ
センサーを読み取ってみよう
• チャレンジ: プログラムを改造してみよう
• 明るい時に点灯し、暗い時に消灯させる
int val;
void setup() { pinMode(13, OUTPUT); }
センサーを読み取ってみよう• チャレンジ: 明るい時に点灯・暗い時に消灯させる
void loop() { val = analogRead(0); if (val > 800) { digitalWrite(13, LOW); } else { digitalWrite(13, HIGH); } delay(100); }
HIGHとLOWを逆にすれば良い
センサーを読み取ってみよう
• 上級者向け: 回路とプログラムを改造してみよう
• 2つのLEDを使って明るい時は1つのLEDを点灯暗い時はもう1つのLEDを点灯させる
センサーを読み取ってみよう
• 上級者向け: 回路とプログラムを改造してみよう
• 3秒以上暗いと点灯
• ヒント: millis()で起動からの時間がわかる
• ヒント: 暗くなった瞬間の時間を記憶する変数
加速度を読み取ってみよう
VddEnableGND
Out XOut YOut Z
• 3軸加速度センサー
• タテ・ヨコ・奥行きにかかる重力の大きさがわかる
• どれくらいの割合でかかっているかで傾きがわかる
• スマートフォンにも搭載
加速度を読み取ってみよう
VddEnableGND
Out XOut YOut Z
• Vdd: 電源供給 (+)
• Enable: 通電しているときのみ 動作する
• GND: GNDにつなぐ (ー)
加速度を読み取ってみよう
VddEnableGND
Out XOut YOut Z
• Out X: X軸の加速度
• Out Y: Y軸の加速度
• Out Z: Z軸の加速度
X軸
Y軸
加速度を読み取ってみよう
回路設計
• 上半分
• センサーの1, 2に+を接続
• センサーの3にーを接続
3027
回路設計
• 下半分
• センサーの6が緑
• センサーの7が黄
• センサーの8が黒3027
回路設計• A0ピンから黒
• Z軸のデータ
• A1ピンから黄
• Y軸のデータ
• A2ピンから緑
• X軸のデータ
int x, y, z;
void setup() { Serial.begin(9600); }
加速度を読み取ってみようvoid loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z); delay(500); }
加速度を読み取ってみよう
ここをクリック
加速度を読み取ってみよう• 「ツール」の「シリアルモニタ」を選択
• 右下が「9600 bps」になっていることを確認
加速度を読み取ってみよう• ボードを傾けて変化を見てみる
• どの向きに傾けるとX軸, Y軸, Z軸がどう変化するか
回路を理解しよう
• 加速度センサーと対応するピンを素直につないでいる
プログラムを理解しよう
int x, y, z;
void setup() { Serial.begin(9600); }
← x, y, zという3つの変数を宣言
プログラムを理解しよう
int x, y, z;
void setup() { Serial.begin(9600); }
← シリアル通信の速度を設定
プログラムを理解しようvoid loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z); delay(500); }
← A2のX軸の値を読み取る
プログラムを理解しようvoid loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z); delay(500); }
← A1のY軸の値を読み取る
プログラムを理解しようvoid loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z); delay(500); }
← A0のZ軸の値を読み取る
プログラムを理解しようvoid loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z); delay(500); }
← 読み取った値を シリアル通信で送る
プログラムを理解しよう
Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z);
x = 50, y = 100, z = 150のとき
送信されたデータ「」
プログラムを理解しよう
Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z);
x = 50, y = 100, z = 150のとき
← 「X: 」を送信
送信されたデータ「X: 」
プログラムを理解しよう
Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z);
x = 50, y = 100, z = 150のとき
← 「50 」を送信
送信されたデータ「X: 50」
プログラムを理解しよう
Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z);
x = 50, y = 100, z = 150のとき
← 「, Y: 」を送信
送信されたデータ「X: 50, Y: 」
プログラムを理解しよう
Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z);
x = 50, y = 100, z = 150のとき
← 「100」を送信
送信されたデータ「X: 50, Y: 100」
プログラムを理解しよう
Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z);
x = 50, y = 100, z = 150のとき
← 「, Z: 」を送信
送信されたデータ「X: 50, Y: 100, Z: 」
プログラムを理解しよう
Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z);
x = 50, y = 100, z = 150のとき
← 「150」を送信して 改行する
送信されたデータ「X: 50, Y: 100, Z: 150」
プログラムを理解しようvoid loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z); delay(500); }
← 読み取った値を シリアル通信で送る
プログラムを理解しようvoid loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); Serial.print("X: "); Serial.print(x); Serial.print(", Y: "); Serial.print(y); Serial.print(", Z: "); Serial.println(z); delay(500); }
← 500ms (0.5秒間) 待つ
加速度とLEDを組み合わせてみよう
底面上面
• ブレッドボードをイラスト右側が底面になるように立てるとLEDが点灯するようにしたい
加速度とLEDを組み合わせてみよう
回路設計
• さっきの回路にLEDを足す
• 黄色の線がLEDの足の長い方と繋がる
• GNDはセンサーと共有
25
19
回路設計
• さっきの回路にLEDを足す
• 黄色の線が13番ピンに
int x, y, z;
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); }
加速度とLEDを組み合わせてみよう
void loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); if (x > 700) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(500); }
加速度とLEDを組み合わせてみよう
ここをクリック
回路を理解しよう
• さっきの回路にLEDを足しただけ
プログラムを理解しよう
int x, y, z;
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); }
← 13番ピンをOUTPUTに使用
プログラムを理解しよう
← x軸の値が700を 超えたら 13番ピンのLEDを点灯
void loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); if (x > 700) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(500); }
プログラムを理解しよう
← x軸の値が700より 低ければ 13番ピンのLEDを消灯
void loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); if (x > 700) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(500); }
加速度とLEDを組み合わせてみよう
上面
底面
• ブレッドボードをイラスト上部が底面になるように立ててもLEDが点灯するようにしたい
加速度とLEDを組み合わせてみよう
void x = y = z = } } }
if (x > 700 || y > 700) { ← この1行だけ 変更する
加速度とLEDを組み合わせてみよう
ここをクリック
プログラムを理解しよう
← 条件が 変更されている
void x = y = z = } } }
if (x > 700 || y > 700) {
プログラミングの基本概念
x > 700 || y > 700
= x > 700 または y > 700
x > 700 && y > 700
= x > 700 かつ y > 700
• 二項演算子 = 「もしくは」「かつ」を表す
プログラミングの基本概念
x > 700 || y > 700 || z > 700
= x > 700 または y > 700 または z > 700
x > 700 && y > 700 && z > 700
= x > 700 かつ y > 700 かつ z > 700
• 二項演算子 = 「もしくは」「かつ」を表す
プログラミングの基本概念• 二項演算子 = 「もしくは」「かつ」を表す
x > 700 || y > 700 && z > 700
= x > 700 または「y > 700 かつ z > 700」
(x > 700 || y > 700) && z > 700
=「x > 700 または y > 700」かつ z > 700
プログラミングの基本概念
x > 700 || y > 700 && z > 700
= x > 700 または「y > 700 かつ z > 700」
(x > 700 || y > 700) && z > 700
=「x > 700 または y > 700」かつ z > 700
「もしくは」より「かつ」が優先される
• 二項演算子 = 「もしくは」「かつ」を表す
プログラムを理解しよう
← x > 700 または y > 700 のとき LEDが点灯する
void x = y = z = } } }
if (x > 700 || y > 700) {
センサーを読み取ってみよう
• チャレンジ: 回路とプログラムを改造してみよう
• 上下をひっくり返したときにLEDが点灯するようにする
• ヒント: シリアル通信でひっくり返した時の 数値を確認するとよい
int val;
void setup() { pinMode(13, OUTPUT); }
センサーを読み取ってみよう• チャレンジ: 上下ひっくり返すと点灯
zについての 条件を指定する
void loop() { x = analogRead(2); y = analogRead(1); z = analogRead(0); if (z < 100) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } delay(500); }
センサーを読み取ってみよう
• 上級者向け: 回路とプログラムを改造してみよう
• LEDを3つ使って、それぞれの方向に傾けた時にそれぞれ別のLEDが点灯するように
• ある方向に1回転した時にLEDが点灯するように
モーターを使ってみよう
• まずワイヤー線2本の先っぽを切り取り軽くハサミを当てて皮膜を1cmほど外す
モーターを使ってみよう
• ダブルギアボックスからモーターを1つ取り出しそれぞれの端子に線を刺して軽くねじる
モーターを使ってみよう
• 電池ボックスをつなげて接続を確認する
モーターを使ってみよう
• TA7291P - モータードライバ
• モーターの制御に使う1 10
モーターを使ってみよう• TA7291P - モータードライバ
• 1 - GND
• 4 - 回転速度制御
• 今回は使わないので8につなぐ
• 8 - モーター用電源入力
• 電池ボックスにつなぐ
1 84
モーターを使ってみよう
• TA7291P - モータードライバ
• 5, 6 - 回転方向制御
• Arduinoのピンにつなぐ
• 7 - 制御用電源入力
• Arduinoの5Vにつなぐ5 6 7
モーターを使ってみよう
• TA7291P - モータードライバ
• 2, 10 - モーター制御
• モーター端子につなぐ2 10
モーターを使ってみよう
モーターを使ってみよう
• ブレッドボードにモーターと電池ケースをつなげる
モーターを使ってみよう
• 上の+とーの列に電池ボックスの+とーを刺す
モーターを使ってみよう
• モータードライバを外すとこうなる
• 21から30の部分にモータードライバ
21 30
モーターへ
13番ピン
GND
12番ピン5V
void loop() { digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(1000); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(1000); }
void setup() { pinMode(12, OUTPUT); pinMode(13, OUTPUT); }
モーターを使ってみよう
モーターを使ってみよう
ここをクリック
モーターを使ってみよう
• 1秒ごとに止まり、回転の向きが逆になるはず
• 部品が熱くなったり、焦げた匂いがしたりすればすぐに電池ボックスと5Vのピンを抜く
プログラムを理解しようvoid loop() { digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(1000); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(1000); }
モータードライバの 回転方向制御ピンにつながっている Arduinoの12,13番ピンの HIGH, LOWを制御する
プログラムを理解しようvoid loop() { digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(1000); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(1000); }
ブレーキ
プログラムを理解しようvoid loop() { digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(1000); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(1000); }
ブレーキ
逆転
プログラムを理解しようvoid loop() { digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(1000); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(1000); }
ブレーキ
逆転
ストップ
プログラムを理解しようvoid loop() { digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(1000); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(1000); }
ブレーキ
逆転
ストップ
正転
プログラムを理解しようvoid loop() { digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(12, HIGH); digitalWrite(13, HIGH); delay(1000); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(1000); }
ブレーキ= 電気的な抵抗で止める
逆転
ストップ = 摩擦のみで止める
正転
モーターを使ってみよう
• チャレンジ: プログラムを改造してみよう
• 2秒正転→2秒逆転
モーターを使ってみよう
void loop() { digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(2000); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(2000); }
正転
逆転
• チャレンジ: 2秒正転→2秒逆転
モーターを使ってみようvoid }
切り替える際に ブレーキを挟んだほうが モーターの摩耗が 少なくなる
digitalWrite(12, LOW); digitalWrite(13, LOW); delay(100);
digitalWrite(12, LOW); digitalWrite(13, LOW); delay(100);
2つのモーターを使ってみよう
• もう1つのモーターについても線をつける
2つのモーターを使ってみよう
• これも電池ボックスをつなげて接続を確認する
2つのモーターを使ってみよう
• 説明書に従ってダブルギアボックスを組み立てる
• ギア比は114.7:1(Cタイプ)となるようにする
• 細かい部品が多いので無くさないようにすること
2つのモーターを使ってみよう
• 6角ネジの位置は短いシャフトで合わせるとよい
2つのモーターを使ってみよう
• これも電池ボックスをつなげて接続を確認する
2つのモーターを使ってみよう
2つのモーターを使ってみよう
• 線対称的にモーターとモータードライバーを配置
• 電源・GNDは共有
2つのモーターを使ってみよう
• モータードライバーを外すとこうなる
• 21から30の部分にモータードライバ
モーターへ
13番ピン
GND
12番ピン5V
11番ピン10番ピン
モーターへ
void setup() { pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); }
2つのモーターを使ってみようvoid loop() { digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(1000); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(1000); }
2つのモーターを使ってみよう
ここをクリック
2つのモーターを使ってみよう
• チャレンジ: プログラムを改造してみよう
• 2秒正転→2秒逆転
2つのモーターを使ってみよう
digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, LOW); digitalWrite(13, HIGH); delay(2000); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(100); }
void loop() { digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(13, LOW); delay(2000); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(100);
2つのモーターを使ってみよう
• 上級者向け: プログラムを改造してみよう
• 2つのモーターが異なる周期で動くようにする
• 1つのモーターは2秒正転→1秒逆転
• もう1つのモーターは1秒正転→1秒逆転
独立して動くようにしてみよう
独立して動くようにしてみよう
• 9V電池の赤をVinに黒をGNDにつなぐ
• USBを外しても動くようになる
車輪をつけてみよう
車輪をつけてみよう
車輪をつけてみよう
• 必要な部品は、以下のとおり
• スポーツタイヤセット
• ユニバーサルプレート: 2チームで1箱
• ボールキャスター: 2チームで1セット
車輪をつけてみよう• まず、裏側にダブルギアボックスをつける
• 説明書と違い、以下のように支えをつけるとよい
車輪をつけてみよう
• 次に、ボールキャスターをつける
• 37mmになるように組み立てる
• 電池ボックスも両面テープで裏側につけておく
車輪をつけてみよう
• Arduino、ブレッドボード、9V電池は表面に
• 先ほどと全く同じように配線する
• 左右で回転の向きが違う場合はモーターの接続先を逆にすればよい
2つのモーターを使ってみよう
• チャレンジ: プログラムを改造してみよう
• 2秒右折→2秒左折
• ヒント: 左右のタイヤを逆向きに回転させると 曲がることができる
2つのモーターを使ってみよう
}
void
digitalWrite(12, HIGH); digitalWrite(13, LOW);
digitalWrite(12, LOW); digitalWrite(13, HIGH);
加速度センサーを載せてみよう
加速度センサーを載せてみよう
• 加速度センサーのVccは3.3Vに接続する
• 3.3Vでも動作する
• GNDも忘れずにA0ピンA1ピンA2ピン
3.3V
加速度センサーを載せてみよう
• アクティビティ: 自動で高いところへと向かう車を 作ってみよう
• 加速度に応じて進行方向を変える
• ヒント: 条件分岐と車の制御を組み合わせる
加速度センサーを載せてみよう
• 上級者向け: 高いところで自動で止まるには?
• 上級者向け: 山が複数あるところで 一番高いところを見つけるには?
• ヒント: プログラミングでいうところの 最適化問題を物理的に再現してみました
• キーワード: 山登り法、焼きなまし法
Top Related