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

180
Arduinoプログラミングに触れてみよう 2015/11/01 Hiromu Yakura

Upload: hiromu-yakura

Post on 16-Apr-2017

1.927 views

Category:

Technology


0 download

TRANSCRIPT

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

2015/11/01 Hiromu Yakura

自己紹介

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

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

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

自己紹介

• 国内大会

• 日本OSS奨励賞 2012

• SuperComputing Contest 2012 優勝

• 情報オリンピック 2013/2014 優秀賞(代表候補)

自己紹介

• 国内大会

• 高校生科学技術チャレンジ 2012: 文部科学大臣賞・富士通賞  2013: 科学技術政策担当大臣賞・富士通賞

• U-20 プログラミングコンテスト 経済産業大臣賞

自己紹介• 国際大会

• アジア太平洋情報オリンピック 2012 銅メダル

• Intel ISEF 2014 Fondazione Bruno Kessler Award

• CODEGATE Junior CTF 2014 7th

• DEFCON CTF 2014 13th

自己紹介

プログラマ

プログラミングの力

• プログラミングを学ぶということ

• プログラミング言語を学ぶことではない

• プログラミングという概念を学ぶ

プログラミングの力

• プログラミングを学ぶということ

• 世界中のコンピュータを制御する能力を得る

• 最近はスマートフォンや家電にも届くように

プログラミングの力

• プログラミングを学ぶということ

• 日本語が通じるのは、1億3000万人程度

• Javaが使えるのは、30億のデバイス

プログラミングの力

• プログラミングを学ぶということ

• プログラミングは世界共通

• 世界中の誰もが参加できるOSS開発

• Linux Kernelは世界中から6000人以上が参加

プログラミングの力

• プログラミングを学ぶということ

• プログラミングは様々な分野で必要とされている

• プログラミングができなくてもプログラミングで何ができるかを知ることが重要

プログラミングの力

• 物理学

• 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

プログラミングの力

• プログラミングを学ぶということ

• プログラミングという概念を学ぶ

• 制御する楽しさをより実感してもらうために電子回路と組み合わせたプログラミングをします

Arduino

• マイクロコントローラ

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

• 3000円くらいで買える

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

Breadboard

• はんだ付けせずに回路設計をするボード

• 裏側で配線されている

LEDを光らせてみよう

回路設計

262221

• LEDは足の長い方が21番にくるように

• 抵抗はどれでもOK

回路設計

• 13番ピンから赤

• + (電源供給) の役割

• GNDピンから青

• - の役割

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• +から回路をたどる

• LEDを通る

• 抵抗を通る

• ーにたどりつく

回路を理解しよう

• このような回路図

• 13番からLED

• LEDから抵抗

• 抵抗からGND

回路を理解しよう

LEDを光らせてみよう

• Arduino IDE

• Arduinoでプログラミングする用のソフトウェア

LEDを光らせてみよう

ここをクリック

LEDを光らせてみよう

• 動作が確認できたらArduinoとブレッドボードの接続を外す

• 大きな電流は流れていないが安全のため

プログラミングの基本概念

• コンピューターに命令を与えること

• コンピューターは人間の扱う言語を理解できない

• 人間の扱う言語は一意的ではない

プログラミングの基本概念

• コンピューターが理解できるようにプログラミング言語を使う

• 人間はコンピューターにさせたい内容をプログラミング言語に翻訳して伝える

• コンピューターはプログラミング言語を0と1で表されるデータに翻訳して動かす

LEDを光らせるプログラム

void  setup()  {      pinMode(13,  OUTPUT);  }  

void  loop()  {      digitalWrite(13,  HIGH);  }

LEDを光らせるプログラム

void  setup()  {      pinMode(13,  OUTPUT);  }  

void  loop()  {      digitalWrite(13,  HIGH);  }

2つのグループに分けられる

LEDを光らせるプログラム

void  setup()  {      pinMode(13,  OUTPUT);  }  

void  loop()  {      digitalWrite(13,  HIGH);  }

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は光らない

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()を使うたびに処理をすべて書くのはしんどい

• 13番ポートから2番ポートに+を付け替える

LEDを光らせてみよう

LEDを光らせてみよう

void  setup()  {      pinMode(2,  OUTPUT);  }  

void  loop()  {      digitalWrite(2,  HIGH);  }

← 13を2に変更する

← 13を2に変更する

LEDを光らせてみよう

ここをクリック

LEDを光らせてみよう

• +を13番ポートに戻しておく

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を点滅させてみよう

ここをクリック

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);  }

ボタンを使ってみよう

• 縦はつながっている

• 横は押すとつながる

ボタンを使ってみよう

回路を組み替えてみよう

回路を組み替えてみよう

211816

回路を組み替えてみよう

211816

回路を組み替えてみよう

回路を組み替えてみよう

LEDを光らせるプログラム

void  setup()  {      pinMode(13,  OUTPUT);  }  

void  loop()  {      digitalWrite(13,  HIGH);  }

ボタンを使ってみよう

ここをクリック

ボタンの状態を読み取ってみよう

• ここまでは回路に出力だけしてきた

• pinMode(13,  OUTPUT); ← 13番ピンを出力設定

• ここからは回路から信号を読み取ってみる

• pinMode(1,  INPUT); <- 1番ピンを入力設定

回路を組み替えてみよう

回路を組み替えてみよう

回路を組み替えてみよう

21

回路を組み替えてみようボタンを外し、ジャンパをつけかえる

21

回路を組み替えてみよう

回路を組み替えてみよう21 23 26 30

回路を組み替えてみよう

回路を組み替えてみよう1

5VGND

GND13

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されていない時

• 2番ポートに電流は伝わらない

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されていない時

• 2番ポートに電流は伝わらない

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されていない時

• 2番ポートに電流は伝わらない

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されていない時

• 1番ポートに電流は伝わらない

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されていない時

• 1番ポートに電流は伝わらない

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されていない時

• 1番ポートに電流は伝わらない

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 2番ポートに電流は伝わらない

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 2番ポートに電流が伝わる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 2番ポートに電流が伝わる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 抵抗を通ってGNDにつながる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 抵抗を通ってGNDにつながる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 抵抗を通ってGNDにつながる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 抵抗を通ってGNDにつながる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 抵抗を通ってGNDにつながる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 抵抗を通ってGNDにつながる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 2番ポートに電流が伝わる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 2番ポートに電流が伝わる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 1番ポートに電流が伝わる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 1番ポートに電流が伝わる

回路を理解しよう

• 5Vのポートから電流が流れる

• ボタンが押されている時

• 1番ポートに電流が伝わる

回路を理解しよう

回路を理解しよう

• ボタンを押すと1番ポートに5Vが流れる

回路を理解しよう13番ポートから出力するとLEDが光る

回路を理解しよう13番ポートから出力するとLEDが光る

ボタンを押すと2番ポートに入力される

ボタンを押した時にLEDを光らせるvoid  setup()  {      pinMode(1,  INPUT);      pinMode(13,  OUTPUT);  }  

void  loop()  {      if  (digitalRead(1)  ==  HIGH)  {          digitalWrite(13,  HIGH);      }  else  {          digitalWrite(13,  LOW);      }  }

プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える

if  (条件)  {  

   処理1;  

}  else  {      処理2;  }

プログラミングの基本概念• 条件分岐 = 状況に応じて実行内容を変える

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を光らせる

ここをクリック

ボタンを押した時に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を消す

ここをクリック

ボタンを押した時に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  =  2;  a  =  1;  

if    }      }

プログラミングの基本概念• 変数 = プログラムの状態を記録する仕組み

a  =  1;

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; を使用する

• ONの状態 → state  =  1; とする

• OFFの状態 → state  =  0; とする

ボタンでON/OFFを切り替えてみる

• 変数 int  state; を使用する

• state  ==  1  でボタンが押された時 →    

• state  ==  0  でボタンが押された時 →    

ボタンで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を切り替えてみる

• ボタンを押した時に切り替わらない時がある

• 長押しするとチカチカしたり光らなかったり

• 正解のソースコードを掲載するので原因の究明は参加者への課題とします

ボタンで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;      }  }