Tinkercad Circuits で Arduino 入門7～アナログ入力のつづき～

# 概要

第7回目です。[前回](https://qiita.com/code0327/items/d99ba47d149c6ce9997e)は、Arduino（アルディーノ）の**アナログ入力機能**について「**<font color='blue'>計測量を電圧変化として出力するセンサ</font>**」と組み合わせて使う方法を紹介しました。

今回は、その続きとして計測量を「**<font color='red'>電気抵抗変化として出力するセンサ</font>**」と**アナログ入力機能**を組み合わせて使う方法を勉強します。このタイプのセンサには、次のような製品があります。

1. **<font color='red'>光（明るさ）</font>**を計測する**<font color='red'>フォトレジスタ（CdSセル）</font>**
  - [CdSセル/光センサー(5φ)](https://eleshop.jp/shop/g/g4CS131/) @ 共立エレショップ（約90円）
2. **<font color='red'>回転角</font>**を計測する**<font color='red'>ポテンショメータ（可変抵抗、ボリューム）</font>**
  - [ローレット軸タイプ 炭素皮膜可変抵抗 Aカーブ 10kΩ](https://eleshop.jp/shop/g/gJ6E413/) @ 共立エレショップ（約90円）
3. **直線変位**を計測する **リニアポテンショメータ（スライドボリューム）**
  - [2連スライドボリューム Aカーブ](https://eleshop.jp/shop/g/gE25121/) @ 共立エレショップ（約95円）
  - [2軸ジョイスティックモジュール](http://akizukidenshi.com/catalog/g/gM-08763/) @ 秋月電子（約850円）
4. **<font color='red'>ガス</font>**を検出する**<font color='red'>ガスセンサ</font>**
  - [アルコールセンサ](https://www.switch-science.com/catalog/132/) @ スイッチサイエンス（約750円）
5. **水位（水面の高さ）**を計測する**水位センサ**
  - [水位センサ](https://www.switch-science.com/catalog/517/) @ スイッチサイエンス（約5,900円）
5. **土中に含まれる水分**を計測する**水分センサ**
  - [水分センサ](https://www.switch-science.com/catalog/2794/) @ スイッチサイエンス（約650円）

これらのセンサを利用すれば、アイデア次第で便利で有用な装置を自作できることが分かると思います。上記のセンサーうち、**<font color='red'>赤文字のもの</font>**は、[TinkerCad Circuits](https://www.tinkercad.com/) の回路シミュレータで利用可能です。<br><img width="598" alt="2020-05-25_13h37_35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/1b3955e8-ae5b-05ab-e504-05c663060569.png">



# 光センサ（フォトレジスタ、CdSセル）

[TinkerCad Circuits](https://www.tinkercad.com/) では、**CdSセル（硫化カドミウムセル）**タイプの光センサが利用できます。このセンサは、**光の強さに応じて電気抵抗が大きく変化する素子**で「**<font color='red'>光が当たると抵抗値が下がる</font>**」という特性があります。夕方から夜にかけて自動点灯する街路灯などに使われています。1個50円から150円程度で購入することができます。

実際に確認してみましょう。[TinkerCad Circuits](https://www.tinkercad.com/) では「**フォトレジスタ**」という名前で部品登録されているので、これを配置して、**マルチメータ**（モードは「抵抗（**R**esistor）」に設定）と接続して、**<font color='red'>明るさによって抵抗値が変化すること</font>** を確認していきましょう。

1. [TinkerCad Circuits](https://www.tinkercad.com/) にアクセス＆ログインして「**新しい回路**」を新規作成します。
2. コンポーネントパネルから「**フォトレジスタ**」と「**マルチメータ**」をフィールドに配置します。<br><img width="641" alt="2020-05-25_13h44_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/f89d16d4-d108-6a8d-54b9-af7e10d7c574.png">
3. マルチメータでは「電圧値」「電流値」「抵抗値」を計測することができます。マルチメータをクリックして、**計測モード**を「**抵抗**」に切り替えます。<br><img width="545" alt="2020-05-25_13h46_35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/cdfe8a78-c4a2-6b6b-6c69-601af8b9c982.png">
4. フォトレジスタとマルチメータを接続します。フォトレジスタに**極性はありません**（プラスとマイナスをどちらの足（端子）に接続しても問題ありません）。 
5. シミュレーションを開始して、**フォトレジスタをクリックして光の強さを変えてみます**。それに応じて、抵抗値が連続的に変化することを確認します。<br><img width="558" alt="2020-05-12_13h05_24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/47aed558-e70c-94a2-89aa-16b9acc9b1e4.png">

シミュレーションにおいては「最も暗いときに $180\mathrm{k}\Omega$」「最も明るいときに $506\Omega$ 」のように抵抗値が大きく変化することが確認できます。無論、実際のセンサは、製品により抵抗値の変化範囲は変わります。また、同じ型番の製品でも個体差があります。

以上のことから、CdSセルは **明るさで抵抗値が変化する可変抵抗** として扱うことができます。

- CdSセルの原理（なぜ、光があたると抵抗値が下がるのか？）に興味がある人は「`cdsセル 原理`」などでググってみてください。

# 抵抗値 → 電圧 の 変換

マルチメータでは、直接的に抵抗値を測定することができました。しかし、Arduino では **直接的に抵抗値を測定する機能がありません**。そこで、**<font color='red'>抵抗値を電圧に変換して</font>**、それをアナログ入力ポートから `analogRead(...)` で読み取り、間接的に抵抗値を計測します。

抵抗値を電圧に変換するために、CdSセルと固定抵抗 $\mathrm{R1}$  と組み合わせて次のように**分圧回路**を構成します。<br><img width="641" alt="2020-05-12_13h40_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/427df864-5c5c-6d2c-b0ae-173e80bb71e8.png">

上記のように回路を構成すれば、**<font color='blue'>暗いとき</font>**にCdSセルの抵抗は $180\mathrm{k}\Omega$ と大きくなるので、アナログ入力ポートの入力電圧 $V_{\mathrm{in}}$ は、次式より約 $5\mathrm{V}$ となります。

$$ V_{\mathrm{in}}=\frac{180k}{1k+180k}\times 5 \fallingdotseq 5\,[\mathrm{V}]$$

**<font color='red'>明るいとき</font>**は、CdSセルの抵抗が $506\Omega$ と小さくなるので、アナログ入力ポートの入力電圧 $V_{\mathrm{in}}$ は、次式より約 $1.68\mathrm{V}$ となります。

$$ V_{\mathrm{in}}=\frac{506}{1k+506}\times 5 \fallingdotseq 1.68\,[\mathrm{V}]$$

ここでは、$\mathrm{R1}$ に $1\mathrm{k}\Omega$ を使用しましたが、$10\mathrm{k}\Omega$ や $100\mathrm{k}\Omega$ を使っても構いません。$\mathrm{R1}$  に大きな抵抗を使うほど、電圧が変化する範囲が大きくなります。

前回の復習になりますが、アナログ入力 `analogRead(...)` では、ポートに印加される電圧範囲 $0$～$5\mathrm{V}$ を「$0$～$1023$ までの $1024$ 段階」で読み取ることができました。例えば、$1.68\mathrm{V}$ が印加されている場合、プログラムのなかでは、次のように $344$ という値（**整数値**）が取得されます。

$$ x = \frac{1.68}{5.00}\times 1023 = 344$$

# プログラムをテキスト（≠ブロック）で記述

CdSセル と Arduino を組み合わせて「**<font color='red'>暗くなったらLEDが自動点灯する回路</font>**」を作成してみます。ただし、今回は、**ロジックをテキスト（コード）で書くことに挑戦します**。

まずは、次のように回路を構成します。Arduinoの左側では、CdSセルと抵抗を使って**分圧回路**を構成しています。また、右側では LED点灯回路を構成しています（LEDの**極性**に注意してください）。<br><img width="533" alt="2020-05-13_16h36_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/d7893a7f-0901-505f-e037-8396191671fb.png">

**コードエディタ**を開いて、モードを「**テキスト**」に切り替えます。<br><img width="551" alt="2020-05-13_16h38_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/9fc36077-5593-3c1e-b791-8850cbaf2a1f.png">

切り替える際に「`ブロック エディタを終了しますか? 現在開かれているすべてのブロックは失われます。テキスト エディタ内のコードは維持され、編集できるようになります。`」が表示されるので「**続行**」を選択します。<br><img width="468" alt="2020-05-13_16h41_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/792c6c82-7414-eb43-45a1-22435c27ecd3.png">

## サンプルとして記述されている「Lチカ」のプログラム

テキストモードに切り替えると、初期状態では、次のように**ビルトインLEDの点滅**のためのプログラムが書かれています。これは、Arduino言語というプログラミング言語によるプログラムですが、**基本的には C言語 と同じと思って（ほぼ）問題ありません**。

記述のルール（大文字小文字を区別する、文の終わりにはセミコロン `;` 、全角文字を使わないなど（特に**<font color='red'>全角空白の混入に注意</font>**））も同じです。

```cpp:ビルトインLEDの点滅（初期コード）
void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  digitalWrite(13, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}
```

Arduinoのプログラムは、基本的に `setup(){...}` と `loop(){...}` という**2つの関数**から構成されます（※ `main(){...}` が見当たらないという点はC言語との違いですね）。

これらの2つの関数の使い方（使い分け）ですが、

- `setup(){...}` のなかには「電源投入後の**<font color='red'>初回だけ</font>**にやって欲しい処理」を書いてきます。
- `loop(){...}` のなかには「`setup(){...}` の実行後に、電源が切れるまで（繰り返し）**<font color='red'>ずっと続けて欲しい処理</font>**」を書きます。

[TinkerCad Circuits](https://www.tinkercad.com/)では、直接的には見ることができませんが、裏側には次のようなプログラムがあって、はじめの1回だけ「setup関数」を呼び出して、その後は、無限ループのなかで繰り返し「loop関数」が呼び出されている、と考えてください。

```cpp:裏側では、こんなプログラムが存在していると思ってください。
main() {
  setup();   // 最初に setup() を実行
  while(1){  // while(1) で 無限ループ
    loop();  // 無限ループのなかで loop() を繰り返し実行
  }
}
```

さて、「**暗くなったときにLEDを自動点灯させるプログラム**」を書いていく前に、この「ビルトインLEDの点滅プログラム」について、読み解いていきたいと思います。

### ビルトインLEDのLチカにおけるsetup関数

まずは、「setup関数」を見てください。この関数には「**<font color='red'>ピン（ポート）のモード切り替え</font>**（入力モードで使用するか、出力モードで使用するか）」や「**変数の初期化**」など、**初回だけ実行したい処理**を記述します。

```cpp:setup関数（ビルトインLEDのLチカ）
void setup()
{
  pinMode(13, OUTPUT);
}
```

ビルトインLEDのLチカプログラムには、`pinMode(13, OUTPUT)` という文が記述されていますが、これは「**デジタル <font color='red'>13</font> 番ポートを、<font color='red'>OUTPUT（出力）</font>モードとして使います！**」という指示を与えています。

ここで、なぜ「**<font color='red'>13</font>**」なのかというと、**ビルトインLED（＝Arduinoのボード上に実装されているオレンジ色のLED）は、ボードの内部で <font color='red'>デジタル13番</font>ポートと接続されている**ためです。<br><img width="562" alt="2020-05-13_17h04_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/15790bc9-98ba-cca2-ad04-8bd9ba875261.png">

- **<font color='purple'>中級者向け補足</font>**：回路系に興味がある人は [ArduinoUNOの回路図](https://www.arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf)を見てみましょう。Arduinoの本体である ATmega8 というCPUの `(SCK)PB5` という端子と13番ポートの間にLED点灯回路が存在していることが分かると思います。

このように、「setup関数」のなかには、使用予定のポート（ピン）を「どのようなモードとして使用するか」の設定を書きます（設定は最初に1度だけすればよいので、その理由から「loop関数」ではなく「setup関数」に記述します。

### ビルトインLEDのLチカにおけるloop関数

次に「loop関数」を読み解いていきます。

```cpp:loop関数（ビルトインLEDのLチカ）
void loop()
{
  digitalWrite(13, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}
```

最初の `digitalWrite(13, HIGH)` は「デジタル**13**番ポート出力を **HIGH** に切り替える」という指示になります。出力が **HIGH** ということは、$5\mathrm{V}$ が出力されるので、LED が**点灯**状態になります。

つづいての `delay(1000)` は「1000ms（1000ミリ秒＝1秒）だけ、次の命令に進まずに待機」という指示になります。

次の `digitalWrite(13, LOW)` は「デジタル**13**番ポート出力を **LOW** に切り替える」という指示になります。出力が **LOW** ということは、$0\mathrm{V}$ が出力されるので、LED が**消灯**状態になります。

つづいての `delay(1000)` では、1秒待機します。

さて、「loop関数」の最後まで到達すると、**<font color='red'>自動的に</font>**「loop関数」が再度呼び出されて、文が先頭から順に実行されます。これは、電源が断たれるまで永遠に繰り返されます（これまでに C言語 で作成してきたような PCプログラムとは違って「終わり」はありません）。

### setup関数 と loop関数 をあわせた全体の流れ

ビルトインLEDのLチカプログラムの全体の流れは、次のようになります。

1. `pinMode(13, OUTPUT);` @ setup関数
2. `digitalWrite(13, HIGH);` @ loop関数（**1**回目）
3. `delay(1000);` @ loop関数（**1**回目）
4. `digitalWrite(13, LOW);` @ loop関数（**1**回目）
5. `delay(1000);` @ loop関数（**1**回目）
6. `digitalWrite(13, HIGH);` @ loop関数（**<font color='red'>2</font>**回目）
7. `delay(1000);`@ loop関数（**<font color='red'>2</font>**回目）
8. `digitalWrite(13, LOW);`@ loop関数（**<font color='red'>2</font>**回目）
9. `delay(1000);`@ loop関数（**<font color='red'>2</font>**回目）
10. `digitalWrite(13, HIGH);`@ loop関数（**<font color='blue'>3</font>**回目）
11. `delay(1000);`@ loop関数（**<font color='blue'>3</font>**回目）
12. （つづく・・・）


## 暗くなったらLEDが自動点灯するプログラムに書き換え

ここからは「**<font color='red'>暗くなったときにLEDを自動点灯させるプログラム</font>**」に書き替えていきます。もう一度、回路を示してきます。<br><img width="533" alt="2020-05-13_16h36_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/d7893a7f-0901-505f-e037-8396191671fb.png">

### steup関数

setup関数のなかには、使用するポート（ピン）を「どのようなモードとして使用するか」の設定を書きます。回路から分かるように、使用するのは「**（LEDを接続する）デジタル7番ポート**」と「**（CdSセルを接続する）アナログ0番ポート**」の2つです。

※ 回路では「5V」と「GND」の端子も使用していますが、固定出力なのでプログラムによる設定は不要です。

setup関数には、次のように記述していきます。

1. デジタル **<font color='red'>7</font>** 番ポートには、LEDを接続してデジタル**<font color='red'>出力</font>**として使用したいので、それをArduinoに設定するために `pinMode(7, OUTPUT);` を記述します。**OUTPUT**は大文字です。
  - もし、デジタル**<font color='blue'>入力</font>**として使う場合は **INPUT** とします。
2. アナログ **<font color='red'>0</font>** 番ポートには、分圧回路を接続してアナログ電圧を**入力**したいので、`pinMode(A0, INPUT);` を記述します。**<font color='red'>注意</font>**：単に `0` と記述すると**デジタル0番ポートの意味**になってしまうので、`A0` と記述してください。

まとめると、次のようになります。

```cpp:setup関数
void setup()
{
  pinMode(7, OUTPUT);
  pinMode(A0, INPUT);
}
```

- **<font color='purple'>中級者向け補足</font>**：アナログ0番から5番ポートは、**デジタル入出力としても**利用できます。デジタル出力として使用するときは `pinMode(A0, OUTPUT)` として `digitalWrite(A0, HIGH)` のように使います。また、デジタル入力として使用するときは `pinMode(A0, INPUT)` として `digitalRead(A0)` のように使います。
- **<font color='purple'>中級者向け補足</font>**：`A0` は内部的には、バイト型の値 `14` となります。裏側で（コンパイル時に読み込まれる `pins_arduino.h`
というヘッダファイルのなかで）、`#define PIN_A0   (14)`、`static const uint8_t A0 = PIN_A0;` のように定義されています。
  - Arduino IDE をインストールしているPCでは、`C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard\pins_arduino.h` を参照してください。

### loop関数

次のように記述します。

```cpp:loop関数
void loop()
{
  int a = analogRead(A0);
  if ( 500 < a ) {
    digitalWrite(7, HIGH);
  } else {
    digitalWrite(7, LOW);
  }
  delay(100);
}
```

はじめに、**int型**の変数 `a` を宣言して、`analogRead(A0)` で読み取った値をそこに格納しています。変数 `a` には、0 ～ 1023 の範囲の整数値が格納されます。

次に `if` で分岐を構成しています。`500 < a` ならば（環境が暗くCdSセルの抵抗が大きくA0ポートの入力電圧が大きいなら）、`digitalWrite(7, HIGH);` でデジタル7番ポートに接続したLEDを**<font color='red'>点灯</font>**させます。

また、`500 < a` が成立しないなら（＝環境が明るいなら）`digitalWrite(7, LOW);` でLEDを**<font color='blue'>消灯</font>**させます。

シミュレータの負荷を小さくするために 100ミリ秒だけ待機します（実機の場合は不要です）。

## シミュレーションの実行

プログラム全体は次のようになります。これをコードエディタに**コピペ**して、シミュレーションを実行してみて下さい。

- 作成例は[こちら](https://www.tinkercad.com/things/cTqhhqJSi8A)（TinkerCadに移動します）。

```cpp:全体
void setup()
{
  pinMode(7, OUTPUT);
  pinMode(A0, INPUT);
}

void loop()
{
  int a = analogRead(A0);
  if ( 500 < a ) {
    digitalWrite(7, HIGH);
  } else {
    digitalWrite(7, LOW);
  }
  delay(100);
}
```

プログラムには、いわゆる**別解**が、ほぼ無限に存在します。上記のプログラムも、様々な書き替えができます。たとえば「loop関数」では、変数を省略して次のようにすることもできます。

```cpp:別解
void loop()
{
  if ( 500 < analogRead(A0) ) {
    digitalWrite(7, HIGH);
  } else {
    digitalWrite(7, LOW);
  }
  delay(100);
}
```

# ポテンショメータの接続方法

ポテンショメータ（日本語環境では「**電位差計**」の名称）では、**角度**を計測することができます。回路は次のように構成します。ポテンショメータ単体で分圧回路を構成して、Arduino のアナログ入力に接続することができます。<br><img width="376" alt="2020-05-26_12h13_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/2c3946fe-06ae-7154-4a0e-10835aebc833.png">

- 回路例は[こちら](https://www.tinkercad.com/things/6c6Y3cr3sgB)（TinkerCadに移動します）。
  - `analogRead()` で読み取った値をシリアルモニタ出力しています。 　

シミュレーションではなく実際に回路を構築する際、いきなり光センサーを接続するのではなく、その代わりに半固定抵抗（ポテンショメータ）を接続して回路の動作を確認するといった用途でも使用します。<br><img width="681" alt="2020-05-26_12h31_05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/b3fe3446-d42f-1d4e-6ab3-8013ca9b60d6.png"><br><img width="490" alt="2020-05-26_12h40_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/e1bb4444-7c80-3dbb-4533-f5e39be483c0.png">

# ガスセンサの接続方法

[TinkerCad Circuits](https://www.tinkercad.com/) の回路シミュレータで利用できるガスセンサは「MQ-2」という製品になります。詳細については「`MQ-2 gas sensor datasheet`」などをキーワードにググってください。

端子が6個あり、次のように接続します。シミュレーションを実行して、煙（ガス）をセンサに近づけるとマルチメータの表示がかわることが確認でききると思います。<br><img width="744" alt="2020-05-26_13h13_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/ca33d936-ac82-93f1-602d-f491c77acbbe.png">

- 作成例は[こちら](https://www.tinkercad.com/things/a0JgEFj6F63)（TinkerCadに移動します）。

また、同様に Arduino とも接続例できます。<br><img width="614" alt="2020-05-26_13h26_33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/34609975-96f1-39c9-c1cf-e959289e4fbf.png">

- 作成例は[こちら](https://www.tinkercad.com/things/lDlE1oDjvME)（TinkerCadに移動します）。

# 演習16：自動点灯する街路灯

周囲が暗くなると自動的に点灯する街路灯をつくっていきます。ただし、上記とは違って、ここでは**LED**ではなく**電球**を使用します。また、**自動点灯モード**と**常時点灯モード**をスライドスイッチを使って切り替えられるようにしていきます。
<img width="592" alt="2020-05-27_13h51_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/a5bd4c9f-4cfd-4f9b-62e6-1fa5c9d13a10.png">

## Step.1 電球とLEDの違い

- 電球は、LEDとは違い極性はありません。
- 電球は消費電力が大きいため（＝たくさんの電流を流すため）**Arduinoに直接接続してはいけません**。
  - [TinkerCad Circuits](https://www.tinkercad.com/) で用意される**電球**は、$5\mathrm{V}$ 印加時に 約 $100\mathrm{mA}$ の電流が流れます。
  - Arduinoのデジタル入出力ポートの電流の**<font color='red'>絶対最大定格</font>**は、1ポートあたり$40\mathrm{mA}$ です。絶対最大定格を超える電流を流そうとするとArduinoが壊れます !
- Arduinoを使って電球を点灯させるためには、**<font color='red'>外部電源</font>** と **<font color='red'>トランジスタ</font>** が必要になります。<br><img width="565" alt="2020-05-27_16h23_57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/d787a7e4-be0a-aada-9302-3430d52a7382.png">


**トランジスタ**の「**デジタルスイッチ**」としての仕組みは、とても簡単です（図内の「抵抗+LED」を「電球」に置き替えてください）。ベース抵抗の設計などは実験実習の時間に習います。<br><img width="747" alt="2020-05-27_14h24_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/026c82c3-9388-8d5e-34ea-450afeb0ebc9.png">


次のように回路を構成して「デジタル4番ポートを **HIGH（高）** にすると電球が点灯」「**LOW（低）** にすると電球が消灯」を実際に確認してください。**<font color='red'>トランジスタのピンアサイン（ピン配置）に注意</font>**してください。<br><img width="646" alt="2020-05-27_14h20_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/a02226ef-8832-958e-a566-8d9e9e53f642.png">

点灯を確認できたら、次に「**<font color='red'>外部電源のGND と ArduinoのGNDを接続しないと、ベースに電圧を印加しても電球が「点灯しない」こと</font>**」も体験してください（図内の赤矢印の配線を切ってみてください）。GNDの共通化忘れは、初心者のハマりポイントです。


- 解答例は[こちら](https://www.tinkercad.com/things/cdYIHmhNqn0)（TinkerCadに移動します）。

## Step.2 フォトレジスタの追加

フォトレジスタ（CdSセル）を追加して、**暗くなると電球が自動点灯する回路＆ロジックに拡張**してください。まずは、ブロックによるロジック構成でOKです。

- 解答例は[こちら](https://www.tinkercad.com/things/ctG2Cp6IqXc)（TinkerCadに移動します）。

## Step.3 スライドスイッチによるモード切替

上記の回路に、スライドスイッチを追加して「**自動点灯モード（暗くなると点灯）**」と「**常時点灯モード**」切り替えられるようにしてみてください。<br><img width="664" alt="2020-05-27_16h54_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/bf2a7f2f-a6c0-56a1-a520-00854c136757.png">

- 解答例は[こちら](https://www.tinkercad.com/things/6RjUlv3mlVv)（TinkerCadに移動します）。
  - 3Hの学生さんは、最低でも 15分 は自分で粘ってから解答例を見るようにしてください。数分で諦めるのは早過ぎです。また、解答例をみた後も、必ず自分で手を動かして回路＆ロジックを構成してみましょう。
   
## Step.4 ブロックとコードの対応確認

コードエディタのモードを「**ブロック + テキスト**」に変更し、ブロックで構成したプログラムと、プログラムコード（テキスト）で記述したプログラムがどのように対応しているのか確認してみましょう。

# EX演習3：自由作品A

ここまでに勉強した要素を組み合わせて、自由に回路＆ロジックを作成してみましょう。