Tinkercad Circuits で Arduino 入門3～外部LEDのLチカ～

# 概要

第3回目です。

前回の「[Tinkercad Circuits で Arduino 入門2](https://qiita.com/code0327/items/0a6e1bf19605000e2a2e)」では、Arudinoプログラムのはじめの一歩として「ビルトイン LED を点滅させる方法」を勉強・体験しました。

今回は、Arduino に外部回路として**<font color='red'>外付けしたLED</font>**（Light Emitting Diode：発光ダイオード）を点滅させる処理（**Lチカ**）を、簡単な回路の勉強とともにやっていきます。<br>![2020-04-20_12h40_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/e194416d-8337-f889-fc11-2aa3753b2800.png)


まずは、準備として（Arduinoを使用せずに）LEDを単体で点灯させる回路の設計を学んでいきます。

# LED点灯回路の設計

LEDには、**<font color='red'>豆電球と違って極性があります</font>**。つまり、LED から伸びる足のどちらに電源のプラスを接続するのか、マイナスを接続するのかにルールがあります。また、豆電球とは違って**<font color='red'>電源（電池）とは直結してはいけません</font>**。点灯させるためには、次のように**<font color='red'>LEDと直列に抵抗を挿入</font>**する必要があります。

![2020-04-14_18h58_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/71b388bd-91e3-73f5-4e45-6e21a9ecc8ee.png)

- Tinkercad Circuits における LED の陽極／陰極の割り当ては上記のようになります。実際の LED の場合は、**足の長いほうが陽極**となります。
- 回路のなかで抵抗と LED の順序を入れ替えても問題ありません。つまり「電源＋ → **抵抗** → **LED** → 電源－」でも「電源＋ → **LED** → **抵抗** → 電源－」でもOKです。
- 抵抗には、極性はありません（向きは関係ありません）。
- 適切な抵抗値は、計算によって求める必要があります（後述）。

なお、抵抗（用途から電流制限抵抗とも呼ばれます）が必要となる理由が気になる方は「`LED　抵抗　必要な理由`」などをキーワードにググってみましょう。また、電流制限抵抗の代わりに、定電流ダイオード（CRD）という素子を使うこともできます。

上記の単純点灯回路を Tinkercad Circuits で作成して、その動作を確認してみましょう。

1. [Tinkercad](https://www.tinkercad.com/)にアクセスしてログインし、ダッシュボード（ログイン後のホーム画面）で「**Circuits**」、「**新しい回路を作成**」を選択します。<br>![2020-04-14_09h59_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/6c222840-ada5-2296-9147-1bcfdf42d11d.png)
2. 初期状態では回路に適当な名前が付けられているで、後で区別がつくように**名前を変更**します。ここでは「LED点灯回路」とします。<br>![2020-04-14_19h51_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/0dbba4c3-9d1d-7384-98a3-0a8c1cfe3c42.png)
3. 右サイドのコンポーネントリストから「**LED**」をドラッグ&ドロップで、作業領域に持ってきます。間違ったコンポーネントを配置してしまった場合は、**選択状態にして [Del/Delete] キーを押すと削除できます**。<br>![2020-04-14_19h56_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/fe1ede57-c762-4c28-a70b-b17191790f86.png)
4. 配置した LED の足（端子）にカーソルをあわせると**陽極**か**陰極**かを確認することができます。<br>![2020-04-14_20h00_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/761a53ab-079f-088e-6edd-e9710d99c448.png)
5. LEDと同様の方法で「**抵抗**」と「**1.5V 電池**」を次のように配置します。配置したコンポーネントは、選択して **<font color='red'>[R] キーを押すと回転させることができます</font>**。また、電池をクリックしてインスペクターを表示して、出力電圧が $4.5 \mathrm{V}$ になるように変更します。なお、単4に変更しているのは単なるスペースの都合で意味はありません。<br>![2020-04-14_20h05_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/0784686d-42f1-87fb-18fe-2cd1af687e5f.png)

6. 抵抗をクリックしてインスペクターを呼びだして、**抵抗値を $200 \Omega$ に変更**します。単位も $\mathrm{k}\Omega$ から $\Omega$ に忘れずに変更してください。<br>![2020-04-14_20h17_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/3fe6eb5a-77e2-f980-b610-94ae01116238.png)
7. 次のように結線します。導線（ワイヤー）の色も同じように変更しましょう。<br>![2020-04-14_20h23_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/980b858f-6129-5abc-5d75-ba607a2a9bf7.png)
8. 画面上部の「**シミュレーションを開始**」をクリックします。<br>![2020-04-14_20h27_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/023cc0a2-9d17-ec24-9be5-201cee45caa0.png)
9. LEDが点灯することを確認します。<br>![2020-04-14_20h31_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/96b62bbe-55ed-2577-07b1-849c23be4ec4.png)
10. 画面上部の「**シミュレーションを停止**」をクリックします。LED が消灯します。

## 電流制限抵抗の設計

上記の回路では抵抗値を $200\Omega$ に設定しました。これを <font color='red'>$2\mathrm{k}\Omega$</font> に変更して「シミュレーションを開始」をクリックしてみてください。LED は**点灯するものの先ほどよりも暗くなる**ことが分かります。

今度は、抵抗値を <font color='red'>$100\Omega$</font> に変更して同様にシミュレーションしてみてください。LED は明るく点灯しますが**「！」マークの警告アイコンが表示**されることが分かります。<br>![2020-04-14_20h35_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/7013fd70-a0bf-b55f-2ba1-d8a5038ab2f7.png)

次のような説明が表示されます。

> LEDを流れる電流は 23.6mA、推奨最大値は 20.0mA です。LEDの使用可能寿命が短くなる可能性があります。

さらに 抵抗値を小さく <font color='red'>$10\Omega$</font> にすると、LED に**爆発したようなマークが付きます**。<br>![2020-04-15_10h46_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/0d44c9fa-6695-2f50-501f-b84bd7ba77ae.png)

>LEDを流れる電流は140mA、絶対最大値は20.0mAです。

以上のことから「抵抗が大きいとLEDに流れる電流が小さなって暗く」なり、逆に「抵抗が小さいと電流が大きくなって明るく」なる（ただし、**LEDの絶対最大定格を超えるような電流を流してしまうとLEDが損傷する**）といったことが分かると思います。

では、どのように抵抗値を設定すればよいのでしょうか？

1個の LED を抵抗を経由して電源に接続する場合、抵抗値の設計は $R$ は次のようになります。

$$ R \ge \frac{V_{\mathrm{CC}}-V_{F}}{I_F} \,\,[\Omega]$$

ここで、$V_{\mathrm{CC}}$ は電源電圧、$V_{F}$ はLEDの**順方向電圧**（順電圧）、$I_{F}$ はLEDの**順方向電流**（順電流）になります。$V_{F}$ と $I_{F}$ は LED（製品ごと）に決まっている値で正確にはデータシートで確認しないといけないのですが、（高輝度ではない）通常の LED は、<font color='red'>$V_{F}=2\,\mathrm{V}$ 前後、$I_{F}=10$ ～ $20\,\mathrm{mA}$ 程度</font>になっています。

例えば、秋月電子で購入できるLEDの順方向電圧$V_{F}$、順方向電流$I_{F}$は、次のようになっています。これらも分かるように、高輝度、超高輝度タイプを使う場合は、個別に $V_{F}$、$I_{F}$ を確認することが重要です。

- [5mm 赤色LED OSDR5113A](http://akizukidenshi.com/catalog/g/gI-11655/) 　　$V_{F}=2.0\,\mathrm{V}$、$I_{F}=20\,\mathrm{mA}$
- [5mm 赤色LED OSR5JA5E34B](http://akizukidenshi.com/catalog/g/gI-12605/) 　　$V_{F}=2.1\,\mathrm{V}$、$I_{F}=20\,\mathrm{mA}$
- [超高輝度 5mm赤色LED OS5RKA5111P](http://akizukidenshi.com/catalog/g/gI-06408/)　　$V_{F}=2.3\,\mathrm{V}$、$I_{F}=60\,\mathrm{mA}$ 

Tinkercad Circuits で用意されいる LED の $V_{F}$ と $I_{F}$ はいくらでしょうか？。仕様が明記されている資料は見つけられなかったのですが、標準的な値である $V_{F}=2.0\,\mathrm{V}$、$I_{F}=20\,\mathrm{mA}$ を仮定して、電源電圧を $4.5\,\mathrm{V}$（$1.5\,\mathrm{V}$ 電池を $3$ 個直列）とすると、抵抗値 $R$ は次のように設計できます。

$$ R \ge \frac{V_{\mathrm{CC}}-V_{F}}{I_F} = \frac{4.5-2.0}{20\times10^{-3}} = 125 \,\,[\Omega]$$

大体の場合は、余裕を見て**計算値よりも少し大きめの抵抗を選定**します。また、抵抗値を大きくすると電流が小さくなるのでバッテリーの消費も少なくなるという利点もあります（経験上、$5\,\mathrm{V}$ 電源のとき $1\,\mathrm{k\Omega}$ 程度の抵抗でも室内なら視認できる明るさで点灯します）。

以上のような理由で、ここでは $200\Omega$ の抵抗を選定しました。

# マイコンのデジタル出力ポート

Arduino をはじめとしたマイコン（マイクロコンピュータ／マイクロコントローラ）には、**デジタル出力ポート** というものが備わっています。このデジタル出力ポートは、マイコンに書き込んだプログラムにより、**<font color='red'>出力電圧を HIGH と LOW に自由に切り替えることができます</font>**。<br>![2020-04-15_11h23_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/59b6e966-5dd2-6d9e-fde6-558c876978c3.png)


**HIGH** とは、ハイレベル電圧のことで具体的には $5\,\mathrm{V}$（Arduino Unoなど）や、$3.3\,\mathrm{V}$（RaspberryPiなど）になります。また、**LOW** とは、ローレベル電圧のことで具体的には $0\,\mathrm{V}\, (\mathrm{GND})$ になります。

つまり、Arduino では、**<font color='red'>デジタル出力ポートの出力電圧（ $5\,\mathrm{V}$ または $0\,\mathrm{V}$）をプログラムによって自由に切り替えることができる</font>**ということになります。よって、デジタル出力ポートに LED、抵抗 を接続すれば、**プログラムを使って LEDの点灯／消灯をコントロールできる**ということです。

# Arduino を使ってLEDを1秒周期で点滅させる

Arduino と LED を接続して1秒周期で点滅（0.5秒消灯、0.5秒点灯）させたいと思います。

## 回路構成

次のように回路を構成します。<br>![2020-04-14_22h24_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/fec6ed62-b652-368a-b084-d841fdaf9e31.png)

- コンポーネントのリストのなかにある「Arduino Uno R3」を作業領域に追加します。
- Arduino のデジタル $7$ 番ポートと、LED の**陽極**（**アノード**とも言います）を接続します。**<font color='red'>陽極と陰極を間違えないように注意してください</font>**。
- LED の**陰極**（**カソード**とも言います）は <font color='red'>$330\Omega$ の抵抗</font>を経由して Arduino の **GND ポート**（**GND** は **グランド** と読みます）に接続します。
  - GNDポートは、常に $0\mathrm{V}$ を提供します（とりあえずは電池のマイナス側とイメージしてください）。

Arduino のデジタル出力は **HIGH**レベルのとき「$5\mathrm{V}$」です。よって、$1$ 個の LED 点灯させるために必要な次のように計算できます。

$$ R \ge \frac{V_{\mathrm{CC}}-V_{F}}{I_F} = \frac{5-2}{20\times 10^-3}=150[\Omega]$$

約 $2$ 倍の余裕をみて、また実際に回路を作成する際の入手性（**E6系列**のラインナップ）を考慮して $330\,\Omega$ をここでは使用しています。

ちなみに、直列接続した $2$ 個の LED を点灯させたい場合（つまり「電源＋ → LED → LED → 抵抗 → 電源－」とする場合）は、次のように抵抗値を求めます。詳しく知りたい人（回路に強くなりたい人）は「`LED　電流制限抵抗　計算`」などをキーワードにググってください。

$$ R \ge \frac{V_{\mathrm{CC}}-2\cdot V_{F}}{I_F} \,\,[\Omega]$$

## 回路の解説

いま、**<font color='blue'>デジタル $7$ 番ポート出力が LOW</font>**（$=0\mathrm{V}$）であれば、GNDポート（$=0\mathrm{V}$）との電位差はないので、LED に電流は流れません（電流は、2点間に電位差があるときに流れます）。電流が流れないので**<font color='red'> LED は点灯しません</font>**。

一方で、**<font color='red'>デジタル $7$ 番ポート出力が HIGH</font>**（$=5\mathrm{V}$）であれば GNDポート（$=0\mathrm{V}$）との電位差により、7番ポートからGNDポートに向けて LED を経由して電流が流れます。電流が流れるので**<font color='red'> LED が点灯します</font>**。

| 7番ポートの出力   |  LEDの状態  |
| :--------: | :---: | 
|  **LOW**（$0 \mathrm{V}$） |  **消灯**|
|  **HIGH**（$5\mathrm{V}$） |  **点灯**|

# プログラムの設定

画面上部の右側にある「**コード**」をクリックするか、キーボードの **[E]キー** を押下するとコードエディットパネルが開きます。<br>![2020-04-15_13h03_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/3620d319-a301-63db-ae0b-7715680ef824.png)

デフォルトでは、ブロックプログラミング環境（ビジュアルプログラミング環境）となっています。また、[前回](https://qiita.com/code0327/items/0a6e1bf19605000e2a2e) に確認したように、ビルトインLEDを点滅させるためのブロックがデフォルトで配置されています。今回は、このビルトインLEDではなく、外付けしたLEDを点滅させるプログラムを作成します。

1. デフォルトで配置されているブロックを削除します（ゴミ場にドラッグ＆ドロップ）。
2. 次のようにブロックを配置します。「**ピン7**」は「デジタル7番ポート」の意味、「**高**」は「HIGHレベル（$5\mathrm{V}$）」、「**低**」は「LOWレベル（$0\mathrm{V}$）」という意味なります。<br>![2020-04-18_12h07_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/69582a34-5a84-14e3-eccb-4b0e81e9abf0.png)
3. 画面上部の「シミュレーションを開始」をクリックすか、キーボードの [S]キー を押下してシミュレーションを開始します。
4. 外付けした **LED** が 1秒周期で点滅することを確認します。
5. 画面上部の「シミュレーションを停止」をクリックすか、キーボードの [S]キー を押下してシミュレーションを停止します。

意図した動作をしないときは、次の点を確認してください。

- 待機ブロックの時間が「500秒」になっていませんか？（単位は「**ミリ秒**」にしないとダメです）
- 作業領域に Arduino が **2つ以上配置**されていませんか？（LEDを接続してないほうの Arduino にプログラムを設定している可能性があります）<br>![2020-04-18_12h11_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/2cedb2f0-9484-4cfa-4e20-337a2b2a4392.png)

それでも解決しなときは、**もういちど、最初からやり直してみましょう**（悩むよりも、こちらのほうが早いです（操作も覚えます））。

# 演習4：ブロックとコードの対応確認

モードを「ブロック + テキスト」に変更し、ブロックで構成したプログラムと、プログラムコード（テキスト）で記述したプログラムがどのように対応しているのか確認してみましょう。<br>![2020-04-20_12h44_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/1da45508-3a2a-7eef-153c-67e13a074851.png)

- 不明点は、自分で調べるみましょう。
- やや複雑な処理になると、ブロックでプログラムを作成することは困難になります。テキストコードでどのようにプログラムを表現するのかに慣れておきましょう。

# 演習5：2つのLEDの交互点灯

赤と緑のLEDが**交互に点灯する**ように回路を拡張し、それに対応するプログラムを書いてみましょう。<br>![2020-04-20_13h42_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/3c1736af-1f95-fe1c-ffea-65ada47fda5e.png)

- ブレッドボードの内部配線については、Googleで「`ブレッドボード　内部配線`」をキーワードに画像検索して確認してください。内部配線の **勘違い**、**間違った思い込み** は初心者によくみられますので、注意してください。
- モードを「ブロック + テキスト」に変更し、ブロックで構成したプログラムと、プログラムコード（テキスト）で記述したプログラムがどのように対応しているのか確認してみましょう。
- 解答例は、[こちら](https://www.tinkercad.com/things/cmW7KobNIFZ)（TinkerCadに飛びます）。

# 演習6：ミニ信号機

「ミニ信号機」になるように回路を拡張し、それに対応するプログラムを書いてみましょう。<br>![2020-04-20_12h54_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/3049a131-75f6-6826-b715-b3293d73b478.png)

- 解答例は、[こちら](https://www.tinkercad.com/things/gJ0Et6mSnom)（TinkerCadに飛びます）。
- モードを「ブロック + テキスト」に変更し、ブロックで構成したプログラムと、プログラムコード（テキスト）で記述したプログラムがどのように対応しているのか確認してみましょう。

# 補足：プログラミングレスでLED交互点灯回路を作成

 [こちら](https://www.tinkercad.com/things/kGKdPwOtJkC) のように、Arduinoなどのマイコンを使わずに（プログラミングをせずに）LED交互点灯回路を作成することもできます。以下は「555」というタイマーICを利用してLED交互点灯回路を実装しているのですが、**Arduino を使う場合と比較して配線は格段に複雑**になり、また**点灯周期を変えたいときには 抵抗 や コンデンサ の値を変更しなければなりません（つまり、部品を購入して入れ替える必要があります）**。<br>![2020-04-20_13h57_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/b34577f1-9a96-2f28-8ae7-c5025ce91ff0.png)

プログラミングに苦手意識を持っている人もいるかもしれません。しかし、上記回路を作成する手間と苦労を考えると、マイコンプログラミングが非常に便利なもので学習する意味があるものだと感じられると思います。