arduinoでプログラミングに触れてみよう 続編

Post on 16-Apr-2017

2.369 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Arduinoでプログラミングに触れてみよう

続編

2016/01/10 Hiromu Yakura

自己紹介

• 矢倉 大夢 (やくら ひろむ)

• 筑波大学 情報学群 情報科学類 1年

• 情報処理推進機構 未踏クリエイター

目的

• プログラミングとはどういう作業かを知ってもらう

• プログラミングで必要な論理的思考を感じてもらう

• プログラミングの指示したとおりに動くという楽しさに触れてもらう

Arduino

• マイクロコントローラ

• コンピュータの機能がひとつの基盤に

• 3000円くらいで買える

セットアップ• Internet Explorer   を起動する

• アドレスバーに arduino.cc と打ち込む

• 左上の「Download」をクリック

セットアップ• 中央右の「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