Tinkercad版 Arduino 基本回路のシミュレーション ( 1 )

Autodesk 社が提供するCAD サービス [TinkerCad](https://www.tinkercad.com/dashboard) の 「回路」で、Arduino Uno 3 を含む電子工作をシミュレーションしてみることができます。一番下の表のように、マイクロ・コントローラを含む多くのコンポーネントが揃っています。 実際に部品を揃えて電子工作するのも楽しいですが、まずシミュレーションで試してみるのもよいかと思います。Arduino IDE とほとんど同じ開発環境も組み込まれています。ユーザー登録とチュートリアルは、[Tinkercad Circuits で Arduino 入門1](https://qiita.com/code0327/items/121327756d77953ee6f8) をご参照ください。

実際に、[エンジニアが教える Arduino 入門](https://www.youtube.com/playlist?list=PLZiGFIg4PRZgTl1XSvexduIyOTa_1W7_4) で紹介されていた回路実験をシミュレーションで再現してみました。

[**#1 LED の点滅**](https://www.youtube.com/watch?v=WQR-oQeiLKg&list=PLZiGFIg4PRZgTl1XSvexduIyOTa_1W7_4&index=3) ( 動画 ) $\qquad$ [Tinkercadによるシミュレーション #1](https://www.tinkercad.com/things/2eLC0JwSDI3-1-led?sharecode=Y1zgwtxA-coiUO4g0ut7qV1EfErvg0huO4qcz4lrsRM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549839/778a4200-dbf9-7b85-2701-33e24d332a51.png)


Arduino のスケッチ ( プログラム )は、void setup( ){ } の中に端子の設定を書き、void loop( ){ } に中に無限ループの実際の動作を書きます。
1. 13 ピンを出力モードに設定します。
2. 13 ピンから HIGH = 5V を出力します。( 内部の LED 点灯 )
3. 状態を保って、0.5 秒待ちます。
4. 13 ピンから LOW = 0V を出力します。( 内部の LED 消灯 )
5. 状態を保って、0.5 秒待ちます。
```c++
// C++ code
//
void setup()
{
  pinMode(13, OUTPUT);	//13ピンを出力設定...1
  //13ピンは基板の内部でLED(L)に接続されている。
}

void loop()
{
  digitalWrite(13, HIGH);	//LED点灯...2
  delay(500); // 0.5秒待つ...3
  digitalWrite(13, LOW);	//LED消灯...4
  delay(500); // 0.5秒待つ...5
}
```
[**#2 スイッチによる条件分岐**](https://www.youtube.com/watch?v=LBd7QaCCV14&list=PLZiGFIg4PRZgTl1XSvexduIyOTa_1W7_4&index=4) ( 動画 ) $\qquad$ [Tinkercadによるシミュレーション #2](https://www.tinkercad.com/things/9Vf6UAbINKS-2-?sharecode=wD1P6acAVzvX4bAtZU93Cjnfa33OG3x0hbnoQctHOBE)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549839/f3557442-0679-aaa6-8ec1-7789ee8785a3.png)

タクトスイッチを押している ( マウスでタクトスイッチのボタンをブレスしている ) 間、LED が点灯します。
1. 3 ピンを入力モードに設定します。
2. 7 ピンを出力モードに設定します。
3. 3 ピンの値を読み込み、 HIGH = 5V ( タクトスイッチが ON ) の判定
4. HIGH であれば、7 ピンに HIGH = 5V を出力する。( LED を点灯 )
5. LOW ( タクトスイッチが OFF ) であれば、7 ピンに LOW = 0V を出力する。( LED を消灯 )
```c++
// C++ code
//
void setup()
{
  pinMode(3, INPUT);	//タクトスイッチ(SW)...1
  pinMode(7, OUTPUT);	//LED...2
}

void loop()
{
  if(digitalRead(3) == HIGH) //...3
  {
    digitalWrite(7, HIGH);	//SWがON→LEDを点灯...4
  }
  else
  {
    digitalWrite(7, LOW);	//SWがOFF→LEDを消灯...5
  }
    
}
```
[**#3 サーボ―モータを動かす**](https://www.youtube.com/watch?v=CqVbuiPc3jQ&list=PLZiGFIg4PRZgTl1XSvexduIyOTa_1W7_4&index=5) ( 動画 ) $\qquad$ [Tinkercad によるシミュレーション #3](https://www.tinkercad.com/things/1hrFkq5pKmW-3-?sharecode=kpKXjpTpZhK6BmoNLIjVrwWPmDgfA3u7jktZlwPA9c0)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549839/5120c8aa-8b97-af02-7f12-e96df1915a38.png)

サーボモータを 0° → 90° → 180° → 0° → 90° $\cdots$ と順番に動かします。
Arduino の各種ライブラリは、クラスで提供されます。専用のヘッダーをインクルードで読み込む必要があります。
サーボモータの信号線 ( 黄色 ) と GND ( 青色 ) に接続したオシロスコープで、PWM (パルス幅変調 ) 波形を観測することができます。
1. サーボモータ制御用のライブラリが入っている Servo.h をインクルードします。
2. Servo クラスのオブジェクト myservo を作成します。
3. attach( ) メソッドを使って、ピン番号、角度 0° のパルス幅 ( μs )、角度 180° のパルス幅 ( μs ) を指定します。パルス幅のデフォルト値の 544 μs と 2400 μs でよければ、第 2 引数と第 3 引数は省略できます。
4. 3 ピンに角度 0° に相当するパルス幅の PWM 波形を出力します。( オシロスコープの波形を参照 ) 
5. 状態を保って、2 秒待ちます。180° から 0° に戻るのに 1 秒以上かかったので 2 秒に調整しました。
6. 3 ピンに角度 90° に相当するパルス幅の PWM 波形を出力します。( オシロスコープの波形を参照 ) 
7. 状態を保って、1 秒待ちます。
8. 3 ピンに角度 180° に相当するパルス幅の PWM 波形を出力します。( オシロスコープの波形を参照 )
9. 状態を保って、1 秒待ちます。

※ PWM 波形が出力できるのは,「～」記号が付いている ~3, ~5, ~6, ~9, ~10, ~11 ピンのみです。
```c++
// C++ code
//
#include <Servo.h> //...1

Servo myservo;  //...2

void setup()
{
  myservo.attach(3, 480, 2500);	//バルス幅を調整(デフォルトは544,2400)..3
  // ピン指定, 角度0°のパルス幅(usec), 角度180°のパルス幅(usec)
}

void loop()
{
  myservo.write(0);  //...4
  delay(2000);	//1000では0度に戻りきれないため、2000に変更...5
  myservo.write(90);  //...6
  delay(1000);  //...7
  myservo.write(180);  //...8
  delay(1000);  //...9
}
```
※サーボモータの角度調整については下記を参照。
[SG90でキッチリ0/180度を出してみた](https://blog.goo.ne.jp/villanova555/e/cf7e642e4ef4c8931eafca01e4675f8e)

## コンポーネント一覧
|一般|電力|ブレッドボード|マイクロ<br>コントローラ|機器|コネ<br>クタ
|:-:|:-:|:-:|:-:|:-:|:-:
|抵抗|9V<br>電池|ブレッドボード 63 行 10 列|micro:bit|マルチメータ|8 ピンヘッダ
|コンデンサ|1.5V<br>電池|ブレッドボード (小) 30行10列|ブレークアウトのある micro:bit|電源|USB<br>標準A
|有極性<br>コンデンサ|3Vコイン電池|ブレッドボード (ミニ) 17行10列|Arduino Uno R3|ファンクション・ジェネレータ|
|ダイオード|太陽<br>電池||ATtiny|オシロ<br>スコープ|
|ツェナーダイオード|ポテト電池|
|インダ<br>クタ|レモン電池|
 
|入力|出力|IC|電源管理|ロジック
|:-:|:-:|:-:|:-:|:-:
|押しボタン|LED|555 タイマ|NPN<br>トランジスタ|クアッド<br>NAND ゲート
|摺動子|LED RGB|デュアル タイマ ( 555 タイマ x2 )|PNP<br>トランジスタ|クアッド<br>NOR ゲート
|スライド<br>スイッチ|電球|741 演算増幅器|小信号 nMOS トランジスタ|クアッド<br>AND ゲート
|フォト<br>レジスタ|NeoPixel|クアッドコンパレータ|小信号 pMOS トランジスタ|クアッド<br>OR ゲート
|光<br>ダイオード|NeoPixel<br>Ring 12|デュアルコンパレータ|nMOS<br>トランジスタ|クアッド<br>XOR ゲート
|周囲光<br>センサー|NeoPixel<br>Ring 16|オプトカプラー|pMOS<br>トランジスタ|6 回路<br>インバータ
|フレックス<br>センサー|NeoPixel<br>Ring 24||TIP120|反転シュミット<br>トリガー
|力センサー|NeoPixel ストリップ 4||リレー SPDT|クアッド NAND<br>シュミット<br>トリガー
|IRセンサー|NeoPixel ストリップ 6||リレー DPDT|トリプル 3 入力 NAND ゲート
|超音波距離<br>センサー|NeoPixel ストリップ 8||5V<br>レギュレータ|トリプル 3 入力 AND ゲート
|超音波距離 センサー<br>(4ピン)|NeoPixel ストリップ 10||3.3V<br>レギュレータ|トリプル 3 入力 NOR ゲート
|PIR ( 人感 )<br>センサー|NeoPixel ストリップ 12||H ブリッジ<br>モーター<br>ドライバ|デュアル 4 入力 NAND ゲート
|土壌水分<br>センサー|NeoPixel ストリップ 16|||デュアル 4 入力 AND ゲート
|チルト<br>センサー|NeoPixel ストリップ 20|||デュアル J-K<br>フリップフロップ
|温度<br>センサー|振動モーター|||デュアル<br>D フリップ
|ガス<br>センサー|DC モーター|||4 ビットラッチ
|キーパッド<br>( 4x4 )|エンコーダ付　DC モータ|||4 ビットバイナリカウンタ
|DIP<br>スイッチ DPST|マイクロ<br>サーボ|||4 ビット加算器
|DIP<br>スイッチ SPST ( x4 )|ホビー用<br>ギアモーター|||8 ビットシフト<br>レジスタ
|DIP<br>スイッチ SPST ( x6 )|圧電ブザー|||Johnson<br>10 進カウンタ
||IR リモート|||7 セグメント<br>デコーダ
||7 セグメント<br>ディスプレイ|||8 ポート I2C<br>エクスパンダ
||LCD 16x2
||LCD 16x2<br>( I2C )
||7 セグメント LED ( 4桁 )