Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,595 views

Published on

2015/11/01 筑波大学GFESTにて実施

Published in: Technology
  • Be the first to comment

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

  1. 1. Arduinoで
 プログラミングに触れてみよう 2015/11/01 Hiromu Yakura
  2. 2. 自己紹介 • 矢倉 大夢 (やくら ひろむ) • 筑波大学 情報学群 情報科学類 1年 • 情報処理推進機構 未踏クリエイター
  3. 3. 自己紹介 • 国内大会 • 日本OSS奨励賞 2012 • SuperComputing Contest 2012 優勝 • 情報オリンピック 2013/2014 優秀賞(代表候補)
  4. 4. 自己紹介 • 国内大会 • 高校生科学技術チャレンジ
  2012: 文部科学大臣賞・富士通賞
  2013: 科学技術政策担当大臣賞・富士通賞 • U-20 プログラミングコンテスト 経済産業大臣賞
  5. 5. 自己紹介 • 国際大会 • アジア太平洋情報オリンピック 2012 銅メダル • Intel ISEF 2014 Fondazione Bruno Kessler Award • CODEGATE Junior CTF 2014 7th • DEFCON CTF 2014 13th
  6. 6. 自己紹介 プログラマ
  7. 7. プログラミングの力 • プログラミングを学ぶということ • プログラミング言語を学ぶことではない • プログラミングという概念を学ぶ
  8. 8. プログラミングの力 • プログラミングを学ぶということ • 世界中のコンピュータを制御する能力を得る • 最近はスマートフォンや家電にも届くように
  9. 9. プログラミングの力 • プログラミングを学ぶということ • 日本語が通じるのは、1億3000万人程度 • Javaが使えるのは、30億のデバイス
  10. 10. プログラミングの力 • プログラミングを学ぶということ • プログラミングは世界共通 • 世界中の誰もが参加できるOSS開発 • Linux Kernelは世界中から6000人以上が参加
  11. 11. プログラミングの力 • プログラミングを学ぶということ • プログラミングは様々な分野で必要とされている • プログラミングができなくても
 プログラミングで何ができるかを知ることが重要
  12. 12. プログラミングの力 • 物理学 • 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
  13. 13. プログラミングの力 • 地学 • 国立天文台は国内11位のスパコンを所有 • すばる望遠鏡の観測データの分析 • 宇宙現象のシミュレーション http://www.nao.ac.jp/gallery/weekly/2014/20140422-aterui.html
  14. 14. プログラミングの力 • 化学 • 化学反応のシミュレーションがポピュラーに • 「京」でも様々な反応シミュレーションが • タミフルの設計にも使われた http://www.nao.ac.jp/gallery/weekly/2014/20140422-aterui.html
  15. 15. プログラミングの力 • 生物学 • バイオインフォマティクス • たくさんの遺伝子解読ができるのは
 コンピュータとアルゴリズムのおかげ • 細かい遺伝子の切れ端が
 うまく繋がるようにパズルを解く http://www.bio-itworld.com/2014/12/22/nanopore-sequencing-here-stay.html
  16. 16. プログラミングの力 • プログラミングを学ぶということ • プログラミングという概念を学ぶ • 制御する楽しさをより実感してもらうために
 電子回路と組み合わせたプログラミングをします
  17. 17. Arduino • マイクロコントローラ • コンピュータの機能が
 ひとつの基盤に • 3000円くらいで買える
  18. 18. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  19. 19. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  20. 20. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  21. 21. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  22. 22. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  23. 23. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  24. 24. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  25. 25. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  26. 26. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  27. 27. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  28. 28. Breadboard • はんだ付けせずに
 回路設計をするボード • 裏側で配線されている
  29. 29. LEDを光らせてみよう
  30. 30. 回路設計 262221 • LEDは足の長い方が
 21番にくるように • 抵抗はどれでもOK
  31. 31. 回路設計 • 13番ピンから赤 • + (電源供給) の役割 • GNDピンから青 • − の役割
  32. 32. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  33. 33. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  34. 34. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  35. 35. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  36. 36. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  37. 37. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  38. 38. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  39. 39. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  40. 40. • +から回路をたどる • LEDを通る • 抵抗を通る • ーにたどりつく 回路を理解しよう
  41. 41. • このような回路図 • 13番からLED • LEDから抵抗 • 抵抗からGND 回路を理解しよう
  42. 42. LEDを光らせてみよう • Arduino IDE • Arduinoで
 プログラミングする用の
 ソフトウェア
  43. 43. LEDを光らせてみよう ここをクリック
  44. 44. LEDを光らせてみよう • 動作が確認できたら
 Arduinoとブレッドボードの接続を外す • 大きな電流は流れていないが安全のため
  45. 45. プログラミングの基本概念 • コンピューターに命令を与えること • コンピューターは人間の扱う言語を理解できない • 人間の扱う言語は一意的ではない
  46. 46. プログラミングの基本概念 • コンピューターが理解できるように
 プログラミング言語を使う • 人間はコンピューターにさせたい内容を
 プログラミング言語に翻訳して伝える • コンピューターはプログラミング言語を
 0と1で表されるデータに翻訳して動かす
  47. 47. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   }
  48. 48. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } 2つのグループに分けられる
  49. 49. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   }
  50. 50. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } 最初の1回だけ
 実行される
  51. 51. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } 最初の1回だけ
 実行される 繰り返し
 実行される
  52. 52. 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回だけ
  実行される 電源が切れるまで
 永遠に
 実行される
  53. 53. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } 最初の1回だけ
 実行される 繰り返し
 実行される
  54. 54. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } ← 13番ピンを
   OUTPUTに使用する
  55. 55. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } ← 13番ピンを
   OUTPUTに使用する = +として
 電流を出せるように
  56. 56. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } ← 13番ピンを
   HIGHに設定する
  57. 57. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } ← 13番ピンを
   HIGHに設定する = +から電流を出す
  58. 58. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   } ← LOWにすると
   LEDは光らない
  59. 59. LEDを光らせてみよう ここをクリック
  60. 60. • 関数 = よく使う処理をまとめたもの • 例: x  =  1  ~  3 について x3  +  x2  +  x を計算させたい • 人間「13  +  12  +  1 は?」 コンピューター「3」
 人間「23  +  22  +  2 は?」 コンピューター「12」
 人間「33  +  32  +  3 は?」 コンピューター「18」
   プログラミングの基本概念
  61. 61. • 関数 = よく使う処理をまとめたもの • 例: x  =  1  ~  3 について x3  +  x2  +  x を計算させたい • 人間「13  +  12  +  1 は?」 コンピューター「3」
 人間「23  +  22  +  2 は?」 コンピューター「12」
 人間「33  +  32  +  3 は?」 コンピューター「18」
   プログラミングの基本概念
  62. 62. プログラミングの基本概念 • 関数 = よく使う処理をまとめたもの • 例: x  =  1  ~  3 について x3  +  x2  +  x を計算させたい • 人間「13  +  12  +  1 は?」 コンピューター「3」
 人間「23  +  22  +  2 は?」 コンピューター「12」
 人間「33  +  32  +  3 は?」 コンピューター「18」
  
  63. 63. プログラミングの基本概念 • 関数 = よく使う処理をまとめたもの • 例: x  =  1  ~  3 について x3  +  x2  +  x を計算させたい • 人間「f(x)  =  x3  +  x2  +  x とします」 
 人間「f(1) は?」 コンピューター「3」
 人間「f(2) は?」 コンピューター「12」
 人間「f(3) は?」 コンピューター「18」
  64. 64. プログラミングの基本概念 • 関数 = よく使う処理をまとめたもの • 例: x  =  1  ~  3 について x3  +  x2  +  x を計算させたい • 人間「f(x)  =  x3  +  x2  +  x とします」 
 人間「f(1) は?」 コンピューター「3」
 人間「f(2) は?」 コンピューター「12」
 人間「f(3) は?」 コンピューター「18」
  65. 65. プログラミングの基本概念 • 関数 = よく使う処理をまとめたもの • pinMode()やdigitalWrite()も関数 • digitalWrite()を使うたびに
 処理をすべて書くのはしんどい
  66. 66. 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;   }  
  67. 67. プログラミングの基本概念 • 関数 = よく使う処理をまとめたもの • pinMode()やdigitalWrite()も関数 • digitalWrite()を使うたびに
 処理をすべて書くのはしんどい
  68. 68. • 13番ポートから
 2番ポートに
 +を付け替える LEDを光らせてみよう
  69. 69. LEDを光らせてみよう void  setup()  {      pinMode(2,  OUTPUT);   }   void  loop()  {      digitalWrite(2,  HIGH);   } ← 13を2に変更する ← 13を2に変更する
  70. 70. LEDを光らせてみよう ここをクリック
  71. 71. LEDを光らせてみよう • +を13番ポートに
 戻しておく
  72. 72. LEDを点滅させる • プログラミングでLEDを点滅させる • 点滅 = 「一定時間点けて、一定時間消す」を
     繰り返す • delay(1000) ← 1000ミリ秒(=1秒)間
        そのままの状態で待つ
  73. 73. LEDを点滅させる • クイズ: 次の3つの命令を使って
     LEDを点滅させるにはどうすればいい? • digitalWrite(13,  HIGH);
  13番ピンをHIGHに設定 = LEDを光らせる • digitalWrite(13,  LOW);
  13番ピンをLOWに設定 = LEDを消す • delay(1000);
  1000ミリ秒(=1秒)間そのままの状態で待つ
  74. 74. LEDを点滅させる void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);      digitalWrite(13,  LOW);
    delay(1000);   } ①
  75. 75. LEDを点滅させる void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);      delay(1000);      digitalWrite(13,  LOW);
  } ②
  76. 76. LEDを点滅させる void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      delay(1000);      digitalWrite(13,  HIGH);      delay(1000);      digitalWrite(13,  LOW);
  } ③
  77. 77. 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); ② 繰り返し部分だけ抜き出すと以下のとおり
  78. 78. LEDを点滅させる delay(1000);   digitalWrite(13,  HIGH);   delay(1000);   digitalWrite(13,  LOW); ③ digitalWrite digitalWrite delay ① digitalWrite delay digitalWrite ② 繰り返し部分だけ抜き出すと以下のとおり
  79. 79. LEDを点滅させるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      delay(1000);      digitalWrite(13,  HIGH);      delay(1000);      digitalWrite(13,  LOW);   }
  80. 80. 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回だけ
  実行される 電源が切れるまで
 永遠に
 実行される
  81. 81. 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);   …   最初はそのまま
 ← 待っても何もない
  82. 82. 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行の繰り返しと
 考えても
 ほとんど変わらない
  83. 83. LEDを点滅させるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);      delay(1000);      digitalWrite(13,  LOW);      delay(1000);   }
  84. 84. LEDを点滅させるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);      delay(1000);      digitalWrite(13,  LOW);      delay(1000);   } 一定時間点けて
 一定時間消す
  85. 85. LEDを点滅させるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);      delay(1000);      digitalWrite(13,  LOW);      delay(1000);   } 一定時間点けて
 一定時間消す ※資料と同じように
  色がついているチェック
  86. 86. LEDを点滅させてみよう ここをクリック
  87. 87. LEDを点滅させてみよう • チャレンジ: プログラムを改造してみよう • 0.1秒点灯 / 0.1秒消灯 • 1秒点灯 / 0.5秒消灯 • (0.5秒点灯 / 1秒消灯) x 2 → 1秒点灯 / 0.5秒消灯
  88. 88. LEDを点滅させてみよう • チャレンジ: 0.1秒点灯 / 0.1秒消灯 void  loop()  {      digitalWrite(13,  HIGH);      delay(100);      digitalWrite(13,  LOW);      delay(100);   }
  89. 89. LEDを点滅させてみよう • チャレンジ: 1秒点灯 / 0.5秒消灯 void  loop()  {      digitalWrite(13,  HIGH);      delay(1000);      digitalWrite(13,  LOW);      delay(500);   }
  90. 90. 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);   }
  91. 91. ボタンを使ってみよう • 縦はつながっている • 横は押すとつながる
  92. 92. ボタンを使ってみよう
  93. 93. 回路を組み替えてみよう
  94. 94. 回路を組み替えてみよう 211816
  95. 95. 回路を組み替えてみよう 211816
  96. 96. 回路を組み替えてみよう
  97. 97. 回路を組み替えてみよう
  98. 98. LEDを光らせるプログラム void  setup()  {      pinMode(13,  OUTPUT);   }   void  loop()  {      digitalWrite(13,  HIGH);   }
  99. 99. ボタンを使ってみよう ここをクリック
  100. 100. ボタンの状態を読み取ってみよう • ここまでは回路に出力だけしてきた • pinMode(13,  OUTPUT); ← 13番ピンを出力設定 • ここからは回路から信号を読み取ってみる • pinMode(1,  INPUT); <- 1番ピンを入力設定
  101. 101. 回路を組み替えてみよう
  102. 102. 回路を組み替えてみよう
  103. 103. 回路を組み替えてみよう 21
  104. 104. 回路を組み替えてみよう ボタンを外し、ジャンパをつけかえる 21
  105. 105. 回路を組み替えてみよう
  106. 106. 回路を組み替えてみよう 21 23 26 30
  107. 107. 回路を組み替えてみよう
  108. 108. 回路を組み替えてみよう 1 5V GND GND 13
  109. 109. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されていない時 • 2番ポートに
 電流は伝わらない
  110. 110. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されていない時 • 2番ポートに
 電流は伝わらない
  111. 111. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されていない時 • 2番ポートに
 電流は伝わらない
  112. 112. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されていない時 • 1番ポートに
 電流は伝わらない
  113. 113. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されていない時 • 1番ポートに
 電流は伝わらない
  114. 114. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されていない時 • 1番ポートに
 電流は伝わらない
  115. 115. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 2番ポートに
 電流は伝わらない
  116. 116. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 2番ポートに
 電流が伝わる
  117. 117. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 2番ポートに
 電流が伝わる
  118. 118. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 抵抗を通って
 GNDにつながる
  119. 119. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 抵抗を通って
 GNDにつながる
  120. 120. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 抵抗を通って
 GNDにつながる
  121. 121. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 抵抗を通って
 GNDにつながる
  122. 122. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 抵抗を通って
 GNDにつながる
  123. 123. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 抵抗を通って
 GNDにつながる
  124. 124. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 2番ポートに
 電流が伝わる
  125. 125. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 2番ポートに
 電流が伝わる
  126. 126. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 1番ポートに
 電流が伝わる
  127. 127. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 1番ポートに
 電流が伝わる
  128. 128. 回路を理解しよう • 5Vのポートから
 電流が流れる • ボタンが
 押されている時 • 1番ポートに
 電流が伝わる
  129. 129. 回路を理解しよう
  130. 130. 回路を理解しよう • ボタンを押すと
 1番ポートに5Vが流れる
  131. 131. 回路を理解しよう 13番ポートから出力するとLEDが光る
  132. 132. 回路を理解しよう 13番ポートから出力するとLEDが光る ボタンを押すと2番ポートに入力される
  133. 133. ボタンを押した時にLEDを光らせる void  setup()  {      pinMode(1,  INPUT);      pinMode(13,  OUTPUT);   }   void  loop()  {      if  (digitalRead(1)  ==  HIGH)  {          digitalWrite(13,  HIGH);      }  else  {          digitalWrite(13,  LOW);      }   }
  134. 134. プログラミングの基本概念 • 条件分岐 = 状況に応じて実行内容を変える if  (条件)  {      処理1;   }  else  {      処理2;   }
  135. 135. プログラミングの基本概念 • 条件分岐 = 状況に応じて実行内容を変える if  (     }  else  {     } 条件にあてはまるとき  ・処理1は実行される
  ・処理2は無視される if  (条件)  {      処理1;   }
  136. 136. プログラミングの基本概念 • 条件分岐 = 状況に応じて実行内容を変える if  (     }  else  {     } 条件にあてはまらないとき  ・処理1は無視される
  ・処理2は実行される    else  {      処理2;   }
  137. 137. ボタンを押した時にLEDを光らせる void  setup()  {      pinMode(1,  INPUT);      pinMode(13,  OUTPUT);   }   void  loop()  {      if  (digitalRead(1)  ==  HIGH)  {          digitalWrite(13,  HIGH);      }  else  {          digitalWrite(13,  LOW);      }   }
  138. 138. ボタンを押した時にLEDを光らせる if  (digitalRead(1)  ==  HIGH)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   }
  139. 139. ボタンを押した時にLEDを光らせる if  (     }  else  {       } digitalRead(1)  ==  HIGH • digitalRead(1): 1番ポートに電流がきているか • digitalRead(1)  ==  HIGH
  1番ポートに電流がきているときにあてはまる
  140. 140. ボタンを押した時にLEDを光らせる if  (     }  else  {       } if  (digitalRead(1)  ==  HIGH)  {      digitalWrite(13,  HIGH);   } • 1番ポートに電流がきているとき   • digitalWrite(13,  HIGH);が実行される
  141. 141. ボタンを押した時にLEDを光らせる if  (     }  else  {       }    else  {      digitalWrite(13,  LOW);   } • 1番ポートに電流がきていないとき   • digitalWrite(13,  HIGH);が実行される
  142. 142. ボタンを押した時にLEDを光らせる void  setup()  {      pinMode(1,  INPUT);      pinMode(13,  OUTPUT);   }   void  loop()  {      if  (digitalRead(1)  ==  HIGH)  {          digitalWrite(13,  HIGH);      }  else  {          digitalWrite(13,  LOW);      }   }
  143. 143. ボタンを押した時にLEDを光らせる void  setup()  {      pinMode(1,  INPUT);      pinMode(13,  OUTPUT);   }   void  loop()  {      if  (digitalRead(1)  ==  HIGH)  {          digitalWrite(13,  HIGH);      }  else  {          digitalWrite(13,  LOW);      }   } ← 1番ポートを入力に使用 ← 13番ポートを出力に使用
  144. 144. ボタンを押した時に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番ポートを出力に使用
  145. 145. ボタンを押した時に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番ポートを出力に使用
  146. 146. ボタンを押した時にLEDを光らせる ここをクリック
  147. 147. ボタンを押した時にLEDを消す void  loop()  {      if  (digitalRead(1)  ==  HIGH)  {          digitalWrite(13,  HIGH);      }  else  {          digitalWrite(13,  LOW);      }   } クイズ: 逆に押した時にLEDを消すには?
  148. 148. ボタンを押した時にLEDを消す void  loop()  {      if  (digitalRead(1)  ==  HIGH)  {          digitalWrite(13,  LOW);      }  else  {          digitalWrite(13,  HIGH);      }   } クイズ: 逆に押した時にLEDを消すには?
  149. 149. ボタンを押した時にLEDを消す ここをクリック
  150. 150. ボタンを押した時にLEDを消す • 同じ回路でもプログラミングによって
 動きを変えることができる • 電子工作のみで、押した時に消そうとすると
 回路をかなり変えないといけない
  151. 151. ボタンを押した時にLEDを消す void  setup()  {      pinMode(5,  INPUT);      pinMode(13,  OUTPUT);   } クイズ: プログラム側のポートだけを
     1番から5番に変えるとどうなる? void  loop()  {      if  (digitalRead(5)  ==  HIGH)  {          digitalWrite(13,  LOW);      }  else  {          digitalWrite(13,  HIGH);      }   }
  152. 152. ボタンを押した時にLEDを消す void         } void    if  (            }  else  {              } }    pinMode(5,  INPUT);    if  (digitalRead(5)  ==  HIGH)  { クイズ: プログラム側のポートだけを
     1番から5番に変えるとどうなる?
  153. 153. まとめ • プログラミングとは、プログラミング言語を使って
 コンピューターに命令を与えること • 基本は命令を順番に っていくが
 条件分岐や繰り返しを組み合わせ高度な制御をする • プログラミングができなくても
 プログラミングとはどういうものか
 プログラミングで何ができるのかを知るのが大切
  154. 154. おまけ
  155. 155. ボタンでON/OFFを切り替えてみる • ボタンを押した時の挙動を変える • ONの状態で押された時 → LEDをOFFにする • OFFの状態で押された時 → LEDをONにする • いまどういう状態かを知る必要がある
  156. 156. プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み
  157. 157. プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み int  a;   a  =  2;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   }
  158. 158. プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み int  a;   a  =  2;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } ← aという名前で変数を用意する
  159. 159. プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み int  a;   a  =  2;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } ← aという変数は2を意味することとする (aに2を代入する)
  160. 160. プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み int  a;   a  =  2;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } ← aという変数は2を意味することとする ← 「aが2と等しいか」 という条件分岐
  161. 161. int  a;   a  =  2;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }         プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み int a  =  2;   if     }       } ← aという変数は2を意味することとする ← 「aが2と等しいか」 という条件分岐
  162. 162. プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み int  a;   a  =  2;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   }
  163. 163. int  a;   a  =  2;   a  =  1;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み
  164. 164. int a  =  2;   a  =  1;   if     }       } プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み a  =  1;
  165. 165. int  a;   a  =  2;   a  =  1;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み ← aという名前で変数を用意する
  166. 166. int  a;   a  =  2;   a  =  1;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み ← aという変数は2を意味することとする (aに2を代入する)
  167. 167. int  a;   a  =  2;   a  =  1;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み ← aという変数は1を意味することとする (aに1を代入する)
  168. 168. int  a;   a  =  2;   a  =  1;   if  (a  ==  2)  {      digitalWrite(13,  HIGH);   }  else  {      digitalWrite(13,  LOW);   } プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み ← aという変数は1を意味することとする ← 「aが2と等しいか」 という条件分岐
  169. 169. int  a;   a  =  2;   a  =  1;              else  {      digitalWrite(13,  LOW);   } int a  =  2;   a  =  1;   if     }       } プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み ← aという変数は1を意味することとする ← 「aが2と等しいか」 という条件分岐
  170. 170. int a  =  2;   a  =  1;   if     }       }     a  =  2;   a  =  1;                     プログラミングの基本概念 • 変数 = プログラムの状態を記録する仕組み ← aという変数は1を意味することとする 変数が指し示す値は
 いつでも変えられる
  171. 171. ボタンでON/OFFを切り替えてみる • ボタンを押した時の挙動を変える • ONの状態で押された時 → LEDをOFFにする • OFFの状態で押された時 → LEDをONにする • いまどういう状態かを保存する変数を使う
  172. 172. ボタンでON/OFFを切り替えてみる • 変数 int  state; を使用する • ONの状態 → state  =  1; とする • OFFの状態 → state  =  0; とする
  173. 173. ボタンでON/OFFを切り替えてみる • 変数 int  state; を使用する • state  ==  1  でボタンが押された時
 →
     • state  ==  0  でボタンが押された時
 →
    
  174. 174. ボタンでON/OFFを切り替えてみる • 変数 int  state; を使用する • state  ==  1  でボタンが押された時
 → LEDをOFFにする
     • state  ==  0  でボタンが押された時
 → LEDをONにする
    
  175. 175. ボタンでON/OFFを切り替えてみる • 変数 int  state; を使用する • state  ==  1  でボタンが押された時
 → LEDをOFFにする
   state  =  0; にする • state  ==  0  でボタンが押された時
 → LEDをONにする
   state  =  1; にする
  176. 176. ボタンでON/OFFを切り替えてみる • 変数 int  state; を使用する if  (digitalRead(1)  ==  HIGH)  {      if  (state  ==  1)  {          digitalWrite(13,  LOW);          state  =  0;      }  else  {          digitalWrite(13,  HIGH);          state  =  1;      }   }
  177. 177. ボタンで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;          }      }   }
  178. 178. ボタンでON/OFFを切り替えてみる ここをクリック
  179. 179. ボタンでON/OFFを切り替えてみる • ボタンを押した時に切り替わらない時がある • 長押しするとチカチカしたり光らなかったり • 正解のソースコードを掲載するので
 原因の究明は参加者への課題とします
  180. 180. ボタンで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;      }   }

×