Arduinoで回路を組んで遊ぶ

# 概要

Arduinoで回路を組んで遊びます。

# LEDを光らせる

## 用意するもの
* Arduino
    * ここでは一般的なArduino Unoを使う
* ブレッドボード
    * ハンダ付けしなくても回路を組むことができる
    * 穴がいっぱい空いている板
        * 穴に部品を差し込んで回路を組む
        * 穴の下にはクリップ状の金具が入っている
            * 部品の足(リード)を挟み込むことで回路を接続する
    * 中央部の1,2,3,...
        * 縦方向に中でつながっている
        * 真ん中のところ(eとfの間)で切れている
            * a-eとf-jは別な回路
    * 上部と下部にある+と-
        * 電源の配線に使用するように考えられている
        * 横方向一列で全てつながっている
            * 途中で穴のないところもあるが、全て横でつながっている

![スクリーンショット 2015-09-16 4.45.38.png](https://qiita-image-store.s3.amazonaws.com/0/20474/80f45639-cf0c-40ac-c93e-42da5494bd2a.png)

* ジャンパーワイヤー(オス・オス) × 2
    * ブレッドボードとArduinoを接続する
        * Arduino側はピンソケットになっている
    * オス・メスではないので注意
* 抵抗 510Ω × 1
* LED × 1

## 注意点
* Arduinoを金属の板など電気を通すものの上に置かない
    * 裏側でショートして破損する可能性がある
    * 木や下敷きなど電気を通さないものの上に置く

## 回路
* 回路
    * Arduino 10番ピン ---(ジャンパーワイヤー)---> ブレッドボード 10j
    * ブレッドボード 10h ---(抵抗510Ω)---> ブレッドボード 10b
    * ブレッドボード 10a ---(アノード:LED:カソード)---> ブレッドボード 8a
    * ブレッドボード 8e ---(ジャンパーワイヤー)---> Arduino GNDピン

* アノード、カソード
    * ダイオードはアノード(陽極)とカソード(陰極)の２つの端子を持つ
    * LEDの足の長いほうがアノード、短いほうがカソード
    * 電流を一方向にしか流さない
        * アノード -> カソードという方向に流れる (整流作用)
        * カソード -> アノードはほとんど流れない
* 抵抗510Ω
    * 抵抗に極性(方向)は無い
* GND(グランド)
    * マイナスの配線
    * 回路図ではマイナスと呼ばずグランドと読んでいる
        * 電源から出た電気は抵抗を通ってLEDを光らせた後使命を終えてGNDに落ちるという考え方


## スケッチ
``` c++
// LEDは10ピンを指定
#define LED_PIN 10

// 初期化
void setup() {
  // LEDのピンを出力先に設定
  pinMode(LED_PIN, OUTPUT);

}

// メインループ
void loop() {
  // LEDを点灯
  digitalWrite(LED_PIN, HIGH);
  // 2500ミリ秒遅延
  delay(2500);
  // LEDを消灯
  digitalWrite(LED_PIN, LOW);
  // 500ミリ秒遅延
  delay(500);
}
```

実行方法は[Arduino覚え書き](http://qiita.com/ftakao2007/items/dd26526b05016ecf4a50) を参照

![IMG_1856.JPG](https://qiita-image-store.s3.amazonaws.com/0/20474/349a8600-6073-ddf9-d5eb-567b4f598bdd.jpeg)

# 2つのLEDを光らせる

## 用意するもの
* Arduino
* ブレッドボード
* ジャンパーワイヤー(オス・オス) × 3
* 抵抗 510Ω × 2
* LED × 2

## 回路

* 回路
    * 回路1
        * Arduino 10番ピン ---(ジャンパーワイヤー)---> ブレッドボード 10j
        * ブレッドボード 10h ---(抵抗510Ω)---> ブレッドボード 10b
        * ブレッドボード 10a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路2
        * Arduino 9番ピン ---(ジャンパーワイヤー)---> ブレッドボード 14j
        * ブレッドボード 14h ---(抵抗510Ω)---> ブレッドボード 14b
        * ブレッドボード 14a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路3
        * ブレッドボード - ---(ジャンパーワイヤー)---> Arduino GNDピン


## スケッチ
### 同時に点灯

``` c++
// LEDをつなぐピンを定義
#define LED_PIN1 9
#define LED_PIN2 10

// 初期化
void setup() {
  // LEDのピンに出力
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
}

// メインルーブ
void loop() {
  // LED1を点灯
  digitalWrite(LED_PIN1, HIGH);
  // LED2を点灯
  digitalWrite(LED_PIN2, HIGH);

  // 2500ミリ秒遅延
  delay(2500);

  // LED1を消灯
  digitalWrite(LED_PIN1, LOW);
  // LED2を消灯
  digitalWrite(LED_PIN2, LOW);

  // 500ミリ秒遅延
  delay(500);
}
```

### 交互に点灯
``` c++
// LEDをつなぐピンを定義
#define LED_PIN1 9
#define LED_PIN2 10

// 初期化
void setup() {
  // LEDのピンに出力
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
}

// メインルーブ
void loop() {
  // LED1を点灯
  digitalWrite(LED_PIN1, HIGH);
  // LED2を消灯
  digitalWrite(LED_PIN2, LOW);

  // 500ミリ秒遅延
  delay(500);

  // LED1を消灯
  digitalWrite(LED_PIN1, LOW);
  // LED2を点灯
  digitalWrite(LED_PIN2, HIGH);

  // 500ミリ秒遅延
  delay(500);
}
```

### 明るさを調整

``` c++
void setup() {
  // LEDのピンに出力
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
}

// メインルーブ
void loop() {
  // LED1を点灯
  digitalWrite(LED_PIN1, HIGH);
  // LED2を点灯
  digitalWrite(LED_PIN2, HIGH);

  // 1ミリ秒遅延
  delay(1);

  //LED1を消灯
  digitalWrite(LED_PIN1, LOW);
  //LED2を点灯
  digitalWrite(LED_PIN2, HIGH);

  // 15ミリ秒遅延
  delay(15);
}
```

* LED2はLED1より明るく見える
    * LED1は1ミリ秒だけ点灯して15ミリ秒消灯を繰り返している
        * 点滅時間が短すぎるため目で間隔を判別できず、明るさの変化として捉えられる
        * PWMという方法
* PWM (Puls Width Modulation:パルス幅変調)
    * ON/OFFの周期を変化させてアナログ的量を変化させる方法
    * ここではdelayを使ったが、ArduinoのPWMと書かれているピンはPWMを使用できる
        * 9,10番ピンはいずれもPWMを利用できる

### PWM機能を使って明るさを調整

``` c++
// LEDをつなぐピンを定義
#define LED_PIN1 9
#define LED_PIN2 10

// 初期化
void setup() {
  // LEDのピンに出力
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
}

// メインルーブ
void loop() {
  // LED1を最大値で点灯
  analogWrite(LED_PIN1, 255);
  // LED2を減光して点灯
  analogWrite(LED_PIN2, 10);
}
```

* digitalWriteではなくanalogWriteになっている
* 最大は255、最小は0
* LEDは明るさ、モーターだと回転速度が調整できる

### PWM機能を使って明るさを連続的に変化させる

``` c++
// LEDをつなぐピンを定義
#define LED_PIN1 9
#define LED_PIN2 10

// 初期化
void setup() {
  // LEDのピンに出力
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
}

// メインルーブ
void loop() {
  int i;
  // iの値を0〜255で変化させる
  for(i=0;i<256;i++){
    //iの値でLEDを点灯させる
    analogWrite(LED_PIN1, i);
    analogWrite(LED_PIN2, i);
    delay(10);
  }
}
```

# 4つのLEDを光らせる

## 用意するもの
* Arduino
* ブレッドボード
* ジャンパーワイヤー(オス・オス) × 5
* 抵抗 510Ω × 4
* LED × 4

## 回路

* 回路
    * 回路1
        * Arduino 10番ピン ---(ジャンパーワイヤー)---> ブレッドボード 10j
        * ブレッドボード 10h ---(抵抗510Ω)---> ブレッドボード 10b
        * ブレッドボード 10a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路2
        * Arduino 9番ピン ---(ジャンパーワイヤー)---> ブレッドボード 14j
        * ブレッドボード 14h ---(抵抗510Ω)---> ブレッドボード 14b
        * ブレッドボード 14a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路3
        * Arduino 6番ピン ---(ジャンパーワイヤー)---> ブレッドボード 18j
        * ブレッドボード 18h ---(抵抗510Ω)---> ブレッドボード 18b
        * ブレッドボード 18a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路4
        * Arduino 5番ピン ---(ジャンパーワイヤー)---> ブレッドボード 22j
        * ブレッドボード 22h ---(抵抗510Ω)---> ブレッドボード 22b
        * ブレッドボード 22a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路5
        * ブレッドボード - ---(ジャンパーワイヤー)---> Arduino GNDピン


## スケッチ
### だんだん明るくなって全部ついたらだんだん消えていく

``` c++
// フェードの時間を設定
#define FADE_TIME 2

// LEDをつなぐピンを定義。配列を使っている。
int led_pins[] = {5,6,9,10};

// 初期化
void setup() {
  int i;
  
  // LEDのピンに出力
  for(i=0;i<4;i++){  
    pinMode(led_pins[i], OUTPUT);
  }
}

// メインルーブ
void loop() {
  int i,j;

  //LED1を暗から明へフェードする
  for(j=0;j<4;j++){
    for(i=0;i<256;i++){
      analogWrite(led_pins[j], i);
      delay(FADE_TIME);
    }
  }

  //LED1を明から暗へフェードする
  for(j=0;j<4;j++){
    for(i=255;i>-1;i--){
      analogWrite(led_pins[j], i);
      delay(FADE_TIME);
    }
  }  
}
```

# フルカラーLEDを点灯させる

## 用意するもの
* Arduino
* ブレッドボード
* ジャンパーワイヤー(オス・オス) × 4
* 抵抗 510Ω × 3
* フルカラーLED(カソード・コモン) × 1
    * 一番長い足がカソードで、他の3本の足はアノード
    * アノード・コモンの場合は一番長い足がアノードで他の3本の足はカソード

## 回路
* 回路
    * 回路1
        * Arduino 11番ピン ---(ジャンパーワイヤー)---> ブレッドボード 15j
        * ブレッドボード 15h ---(抵抗510Ω)---> ブレッドボード 15b
        * ブレッドボード 15a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路2
        * Arduino 10番ピン ---(ジャンパーワイヤー)---> ブレッドボード 16j
        * ブレッドボード 16h ---(抵抗510Ω)---> ブレッドボード 16b
        * ブレッドボード 16a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路3
        * Arduino 9番ピン ---(ジャンパーワイヤー)---> ブレッドボード 17j
        * ブレッドボード 17h ---(抵抗510Ω)---> ブレッドボード 17b
        * ブレッドボード 17a ---(アノード:LED:カソード)---> ブレッドボード -
    * 回路4
        * ブレッドボード - ---(ジャンパーワイヤー)---> Arduino GNDピン


## スケッチ

### 一色づつ光っては消える

``` c++
// フェードの時間を設定
#define FADE_TIME 500

// LEDをつなぐピンを定義
int led_pins[] = {9,10,11};

// 初期化
void setup() {
  int i;
  
  // LEDのピンに出力
  for(i=0;i<3;i++){  
    pinMode(led_pins[i], OUTPUT);
  }
}

// メインルーブ
void loop() {
  int i,j;

  for(j=0;j<3;j++){
    // LEDを点灯
    digitalWrite(led_pins[j], HIGH);
    delay(FADE_TIME);
    // LEDを消灯
    digitalWrite(led_pins[j], LOW);
    delay(FADE_TIME);    
  }
}
```

### 色を徐々に変える

``` c++
// フェードの時間を設定
#define FADE_TIME 5

// LEDをつなぐピンを定義
int led_pins[] = {9,10};

// 初期化
void setup() {
  int i;
  // LEDのピンに出力
  for(i=0;i<2;i++){  
    pinMode(led_pins[i], OUTPUT);
  }
}

// メインルーブ
void loop() {
  int i,j;

  for(i=0;i<256;i++){
    analogWrite(led_pins[0], i);
    j = 255 - i;
    analogWrite(led_pins[1], j);
    delay(FADE_TIME);    
  }
}
```

### 色が変化するイルミネーションを作る

``` c++
// フェードの時間を設定
#define FADE_TIME 50

// LEDをつなぐピンを定義
int led_pins[] = {9,10,11};

// 初期化
void setup() {
  int i;
  // LEDのピンに出力
  for(i=0;i<3;i++){  
    pinMode(led_pins[i], OUTPUT);
  }
}

// メインルーブ
void loop() {
  int i,j;

  for(j=0;j<3;j++){
    for(i=0;i<5;i++){
      analogWrite(led_pins[j], i);
      delay(FADE_TIME);    
    }
  }

  for(j=0;j<3;j++){
    for(i=4;i>-1;i--){
      analogWrite(led_pins[j], i);
      delay(FADE_TIME);    
    }
  }
}
```

### 色がランダムにが変化するイルミネーションを作る

``` c++
// フェードの時間を設定
#define FADE_TIME 50

// LEDをつなぐピンを定義
int led_pins[] = {9,10,11};

// 初期化
void setup() {
  int i;

  // 未使用アナログで乱数の種を初期化
  randomSeed(analogRead(0));
  
  // LEDのピンに出力
  for(i=0;i<3;i++){  
    pinMode(led_pins[i], OUTPUT);
  }
}

// メインルーブ
void loop() {
  int i,j;
  
  // 乱数でピンをランダムに選ぶ
  for(j=0;j<3;j++){
    // ピンの範囲は9-11
    led_pins[j] = random(9,12);
  }

  // 暗から明へフェードする
  for(j=0;j<3;j++){
    for(i=0;i<5;i++){
      analogWrite(led_pins[j], i);
      delay(FADE_TIME);    
    }
  }

  // 明から暗へフェードする
  for(j=0;j<3;j++){
    for(i=4;i>-1;i--){
      analogWrite(led_pins[j], i);
      delay(FADE_TIME);    
    }
  }
}
```

* randomSeed(analogRead(0));
    * 乱数を使用する場合randomSeedで乱数の種を初期化する
    * analogRead(0)
        * アナログピンの使っていない箇所を読み込む
        * ノイズを利用してランダムな値を生成している
* led_pins[j] = random(9,12);
    * 12があたった時はなにも接続されていないので消える
    * たまたま同じピンが複数選ばれた時はその分光量が増す
        * 例
            * led_pins[0] = 9;
            * led_pins[1] = 9;
            * led_pins[2] = 9;

# 圧電スピーカーで音を出す

## 用意するもの
* Arduino
* ブレッドボード
* ジャンパーワイヤー(オス・オス) × 2
* 圧電スピーカー × 1
    * 「圧電ブザー」ではないことに注意
        * こちらは電源を接続するだけで音がなってしまう

## 回路

* 回路
    * 回路1
        * Arduino 13番ピン ---(ジャンパーワイヤー)---> ブレッドボード 14j
        * ブレッドボード 14f ---(圧電スピーカー)---> ブレッドボード 11f
        * ブレッドボード 11j ---(ジャンパーワイヤー)---> Arduino GNDピン


## スケッチ
### 簡易的にビープ音をならす

``` c++
// 圧電スピーカー
#define PIEZO 13

// 遅延時間。1ミリ秒。
#define DELAY_TIME 1

// 初期化
void setup() {
    pinMode(PIEZO, OUTPUT);
}

// メインルーブ
void loop() {
  digitalWrite(PIEZO, HIGH);
  delay(DELAY_TIME);    
  digitalWrite(PIEZO, LOW);
  delay(DELAY_TIME);    
}
```

* 音とは
    * 空気の振動
        * 素早くON/OFFを繰り返すことにより圧電スピーカーで振動を作り出すことができる
* 波形
    * 「DELAY_TIME 1」なので周期は2ミリ秒
    * ただし、delayは時間はあまり正確ではない

```math
\frac{1}{0.002} = 500 (Hz)
```

![スクリーンショット 2015-09-24 8.19.09.png](https://qiita-image-store.s3.amazonaws.com/0/20474/2f779539-e156-f223-e58f-8283b206d281.png)

### さらに高い周波数を出す

delayは一番高い周波数でも500Hzまでしか作れない。
より高い周波数をつくるためdelayMicrosecondsを利用する。

``` c++
// 圧電スピーカー
#define PIEZO 13

// 遅延時間
#define DELAY_TIME 1

// 初期化
void setup() {
    pinMode(PIEZO, OUTPUT);
}

// メインルーブ
void loop() {
  digitalWrite(PIEZO, HIGH);
  delayMicroseconds(DELAY_TIME);    
  digitalWrite(PIEZO, LOW);
  delayMicroseconds(DELAY_TIME);    
}
```

* これで 1 / 1(DELAY_TIME) * 2 * 0.000001 = 500 (kHz)
* 1kHzの音を出すには DELAY_TIME = 500とする
    * void loop()を呼び出す時間やdigitalWriteを処理する時間があるので正確ではない

### 2種類の音を繰り返し鳴らす

``` c++
// 圧電スピーカー
#define PIEZO 13

// 遅延時間
#define DELAY_TIME1 400
#define DELAY_TIME2 500

// 初期化
void setup() {
    pinMode(PIEZO, OUTPUT);
}

// メインルーブ
void loop() {
  int i;

  for(i=0;i<400;i++){
    digitalWrite(PIEZO, HIGH);
    delayMicroseconds(DELAY_TIME1);    
    digitalWrite(PIEZO, LOW);
    delayMicroseconds(DELAY_TIME1);
  }

  for(i=0;i<200;i++){
    digitalWrite(PIEZO, HIGH);
    delayMicroseconds(DELAY_TIME2);
    digitalWrite(PIEZO, LOW);
    delayMicroseconds(DELAY_TIME2);
  }
}
```

# アナログ入力で電圧を調べる

## 用意するもの
* Arduino
* ブレッドボード
* ジャンパーワイヤー(オス・オス) × 3
* 抵抗 510Ω × 2

## 回路

* 回路
    * 回路1
        * Arduino 5Vピン ---(ジャンパーワイヤー)---> ブレッドボード +
        * ブレッドボード + ---(抵抗510Ω)---> ブレッドボード 11e
            * (ブレッドボード11e〜11aの間で電圧を測定)
                * ブレッドボード 11c ---(ジャンパーワイヤー)---> Arduino A0ピン
        * ブレッドボード 11a ---(抵抗510Ω)---> ブレッドボード -
        * ブレッドボード - ---(ジャンパーワイヤー)---> Arduino GNDピン

![スクリーンショット 2015-09-24 23.47.22.png](https://qiita-image-store.s3.amazonaws.com/0/20474/c881a961-a8b3-4268-98f2-c56426f14e5a.png)


## スケッチ
### アナログの0番で電圧を調べる

読み込んだ値はシリアルポートを通じてパソコンに送られる

``` c++
// 初期化
void setup() {
    Serial.begin(9600);
}

// メインルーブ
void loop() {
  int i;

  // 0番のアナログを読み込む
  i = analogRead(0);

  // iの値を10進数としてシリアルポートに送る
  Serial.print(i, DEC);
  Serial.print("\n");

  // 1秒待つ
  delay(1000);
}
```

* シリアルモニタに512〜513という数値が1秒ごとに表示される
    * Arduinoのアナログ入力について
        * A/D(アナログ/デジタル)変換を行って取り込まれる
            * 基準となる電圧は5Vで、最大値はこの5Vとなる
                * 3.3Vピンを使っても基準は5V
        * AnalogReadで取り込まれる値
            * 0〜1023の範囲
        * つまり、最大値5VのときにAnalogReadの値は1023になる
    * AnalogReadの数値1あたりの電圧
        * 5 / 1023 = 0.0048 (V)
    * AnalogRead512の電圧
        * 512 * 0.0048 = 2.45 (V)
        * AnalogReadで読み込んだ電圧は概ね2.5V
            * 5Vを抵抗で2分割し、その中点からアナログに接続しているので2.5Vの電圧を得ている
    * 電流
        * オームの法則
            * I = E / R = 5 / 1020 = 0.005 (A) 
    * 測定場所を変える
        * 5Vピンの直後で計測するとAnalogReadは1023
        * GNDピンの直前で計測するとAnalogReadは0

![スクリーンショット 2015-09-24 23.15.52.png](https://qiita-image-store.s3.amazonaws.com/0/20474/27ab5b0e-faad-a9b9-6c3f-468a769a1a67.png)


# Cdsセルで明るさを計測する

## 用意するもの
* 必須
    * Arduino
    * ブレッドボード
    * ジャンパーワイヤー(オス・オス) × 3
    * 抵抗 10kΩ × 1
    * Cdsセル(GL5528) 1MΩ x 1
        * 明るさに応じて抵抗が変化する
        * 大きさもいろいろあるがここではGL5528を使った
* 暗くなったらLEDを点灯させる場合は以下追加
    * ジャンパーワイヤー(オス・オス) × 2
    * 抵抗 10kΩ × 1
    * 抵抗 510Ω x 1
    * LED x 1
* 明るさのしきい値を設定できるようにする場合はさらに以下追加
    * ジャンパーワイヤー(オス・オス) × 2
    * 半固定抵抗 10kΩ

## 回路(単純な光量の計測)

* 回路
    * 回路1
        * Arduino 5Vピン ---(ジャンパーワイヤー)---> ブレッドボード +
        * ブレッドボード + ---(Cdsセル)---> ブレッドボード 11e
            * (ブレッドボード11e〜11aの間で電圧を測定)
                * ブレッドボード 11c ---(ジャンパーワイヤー)---> Arduino A0ピン
        * ブレッドボード 11a ---(抵抗10kΩ)---> ブレッドボード -
        * ブレッドボード - ---(ジャンパーワイヤー)---> Arduino GNDピン

## スケッチ
### アナログの0番で電圧を調べる

* 「アナログの0番で電圧を調べる」と全く同じスケッチなので省略

![スクリーンショット 2015-09-25 0.30.49.png](https://qiita-image-store.s3.amazonaws.com/0/20474/933f6e92-1e6f-3bf5-aa6d-106716dfb763.png)

## 回路(暗くなったらLEDを点灯する)

* 回路
    * 回路1
        * 先ほどの回路と同じ
    * 回路2
        * Arduino 10番ピン ---(ジャンパーワイヤー)---> ブレッドボード 5j
        * ブレッドボード 5h ---(抵抗510Ω)---> ブレッドボード 5c
        * ブレッドボード 5a ---(アノード:LED:カソード)---> ブレッドボード -
        * ブレッドボード - ---(ジャンパーワイヤー)---> Arduino GNDピン

## スケッチ
### 暗くなったらLEDを点灯する

400よりも小さければ暗いと判断してLEDを点灯する

``` c++
// LED定義
#define LED_PIN 10

// 初期化
void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

// メインルーブ
void loop() {
  int i;

  // 0番のアナログを読み込む
  i = analogRead(0);

  // 400より小さければLEDを点灯
  if(i<400){
    digitalWrite(LED_PIN, HIGH);
  }
  else{
    digitalWrite(LED_PIN, LOW);    
  }

  // iの値を10進数としてシリアルポートに送る
  Serial.print(i, DEC);
  Serial.print("\n");

  // 1秒待つ
  delay(1000);
}
```

## 回路(明るさのしきい値を設定できるようにする)
* 回路
    * 回路1
        * Arduino 5Vピン ---(ジャンパーワイヤー)---> ブレッドボード 17a
        * 回路1-1
            * ブレッドボード 17d ---(Cdsセル)---> ブレッドボード 17g
            * (ブレッドボード17g〜17jの間で電圧を測定)
                * ブレッドボード 17i ---(ジャンパーワイヤー)---> Arduino A0ピン
            * ブレッドボード 17j ---(抵抗10kΩ)---> ブレッドボード 22b
            * ブレッドボード 22a ---(ジャンパーワイヤー)---> Arduino GNDピン
        * 回路1-2
            * ブレッドボード 17c ---(ジャンパーワイヤー)---> ブレッドボード 23a
            * ブレッドボード 23e ---(半固定抵抗)---> ブレッドボード 22d
            * (半固定抵抗の足(ブレッドボード e21)で電圧を測定)
                * ブレッドボード 21a ---(ジャンパーワイヤー)---> Arduino A1ピン
            * ブレッドボード 22a ---(ジャンパーワイヤー)---> Arduino GNDピン
    * 回路2
        * Arduino 10番ピン ---(ジャンパーワイヤー)---> ブレッドボード 5j
        * ブレッドボード 5h ---(抵抗510Ω)---> ブレッドボード 5c
        * ブレッドボード 5a ---(アノード:LED:カソード)---> ブレッドボード -
        * ブレッドボード - ---(ジャンパーワイヤー)---> Arduino GNDピン


![スクリーンショット 2015-09-25 2.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/20474/4140387d-d02c-00ec-0273-0d585ec4b753.png)

![写真 2015-09-25 2 52 42.jpg](https://qiita-image-store.s3.amazonaws.com/0/20474/c07c7757-5046-e800-2653-2b253bbab74d.jpeg)

## スケッチ

### しきい値を超えると点灯、消灯する

``` c++
// LED定義
#define LED_PIN 10

// Cdsセル
#define CDS_IN 0

// 設定値
#define SET_POT 1

// 初期化
void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

// メインルーブ
void loop() {
  int brightness,set_val;

  // 0番のアナログを読み込む
  brightness = analogRead(CDS_IN);

  // 1番のアナログを読み込む
  set_val = analogRead(SET_POT);

  // set_valより小さければLEDを点灯
  if(brightness<set_val){
    digitalWrite(LED_PIN, HIGH);
  }
  else{
    digitalWrite(LED_PIN, LOW);    
  }

  // 値を10進数としてシリアルポートに送る
  Serial.print("brightness ");
  Serial.print(brightness, DEC);
  Serial.print("\n");

  Serial.print("set_val ");
  Serial.print(set_val, DEC);
  Serial.print("\n");

  // 1秒待つ
  delay(1000);
}
```

* 半固定抵抗の上部をねじ回しで回すと抵抗値が変わる
    * set_valがbrightnessより値が大きくなったらLEDが点灯する

![スクリーンショット 2015-09-25 2.46.20.png](https://qiita-image-store.s3.amazonaws.com/0/20474/8396cd2e-7d76-78ba-a3a6-c9feb854d477.png)

### しきい値のと明るさの値が中途半端な場合についたり消えたりしないようにする

* 設定値+10でLED点灯、設定値-10でLED消灯
    * ギリギリの値でLEDが点灯しても消灯するのはそこから-20になったとき
        * しきい値付近で値のふれが多少あってもついたり消えたりしない

``` c++
// LED定義
#define LED_PIN 10

// Cdsセル
#define CDS_IN 0

// 設定値
#define SET_POT 1

// 初期化
void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

// メインルーブ
void loop() {
  int brightness,set_val;
  int upper,lower;

  // 0番のアナログを読み込む
  brightness = analogRead(CDS_IN);

  // 1番のアナログを読み込む
  set_val = analogRead(SET_POT);

  // 明るい側の値を入力+10に
  upper = set_val + 10;
  // 上限を1023に
  if(upper>1023) upper = 1023;

  // 暗い側の値を入力-10に
  lower = set_val - 10;
  // 下限を0に
  if(lower<0) lower = 0;

  // 下限より小さければLEDを点灯
  if(brightness<lower){
    digitalWrite(LED_PIN, HIGH);
  }
  // 上限より大きければLEDを消灯
  if(brightness>upper){
    digitalWrite(LED_PIN, LOW);    
  }

  // 値を10進数としてシリアルポートに送る
  Serial.print("brightness ");
  Serial.print(brightness, DEC);
  Serial.print("\n");

  Serial.print("set_val ");
  Serial.print(set_val, DEC);
  Serial.print("\n");

  // 1秒待つ
  delay(1000);
}
```

# 温度を測定する

## 用意するもの
* Arduino
* ブレッドボード
* ジャンパーワイヤー(オス・オス) × 3
* LM35DZ(高精度IC温度センサ) × 1
    * トランジスタのように見えるが実はIC
        * 電源を与えるだけで温度に応じた電圧を出力する
    * ピン
        * 1 : 電源(5V)
        * 2 : 出力
        * 3 : GND

## 回路

* 回路
    * 回路1
        * Arduino 5Vピン ---(ジャンパーワイヤー)---> ブレッドボード 16b
        * ブレッドボード 16e ---(1:LM35:3)---> ブレッドボード 14e
        * (LM35の2ピン(ブレッドボード 15e)で電圧を測定)
            * ブレッドボード 15b ---(ジャンパーワイヤー)---> Arduino A0ピン
        * ブレッドボード 14b ---(ジャンパーワイヤー)---> Arduino GNDピン

ノイズの影響を避けたい場合は5VとGNDの間に0.1μFのコンデンサを入れる

## スケッチ
### 温度を電圧で表示する

``` c++
#define LM35_IN 0

void setup() {
  Serial.begin(9600);
}

void loop() {
  int temp;

  temp = analogRead(LM35_IN);
  Serial.print(temp,DEC);
  Serial.print("\n");
  delay(1000);
}
```

* A0ピンに入力された電圧
    * 47 * 0.0048 = 0.2256 (V)
* 温度
    * LM35の特性
        * 20度で200mV (0.2V)
    * 20 * 0.2256 / 0.2 = 22.56 (度)

![スクリーンショット 2015-09-27 6.44.39.png](https://qiita-image-store.s3.amazonaws.com/0/20474/8d3385ce-8e24-4e07-5139-c9de9c19e796.png)

### 温度で表示する

* 入力電圧の値を0.48倍すれば温度になる
    * 1/2で近似する

``` c++
#define LM35_IN 0

void setup() {
  Serial.begin(9600);
}

void loop() {
  int temp;
  
  // LM35から読み込み
  temp = analogRead(LM35_IN);

  // 温度に変換する
  temp = temp / 2;

  // シリアルポートへ送る
  Serial.print(temp,DEC);
  Serial.print("\n");
  delay(1000);
}
```