つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション2 ~ Lチカ動作説明・補足

 前回((TinkercadによるArduinoシミュレーション1では、Tinkercadの導入とTinkercad上でArduinoのLチカ(オンボードLEDの点滅)を動作させた。今回はどのようにLチカが動いているのか説明したい。ところどころ注釈はいれているが、動作についてはArduino Unoを前提にしている。

1. コード

 ArduinoのコードはC/C++をベースとしているArduino言語と呼ばれており、またソースコードは"スケッチ"と呼ばれている。Lチカのスケッチは以下の通り:

void setup() {
     pinMode(13, OUTPUT);  // 13pinを出力に設定
}
void loop() {
     digitalWrite(13, HIGH);  //13pinからHIGHを出力
     delay(1000);  // 1000ms(1s)待機
     digitalWrite(13, LOW);  //13pinからLOWを出力
     delay(1000);  // 1000ms(1s)待機
}

setup(){...}はシミュレーション開始時(電源投入時)に一度だけ実行し、void loop(){...}はシミュレーション停止(電源オフ)するまで繰り返し実行をする。変数の定義などはvoid setup()の前に記述してもよい。

setup()内の処理

 Arduino Unoの場合、オンボード上のLEDはデジタル入出力ピンの13番と連動している。そこで、setup()内にデジタル入出力ピンの13番を出力に設定する処理としてpinMode(13,OUTPUT);と記述する。pinMode(pin,mode)はpinで設定したいピン番号(デジタルピン:0-13,アナログピン:A0-A5)を指定し、ピンの動作(mode)を出力;OUTPUT,(プルアップ抵抗付き)入力;INPUT_PULLUP,(プルアップ抵抗なし)入力:INPUTのいずれかを指定する。*1

loop()内の処理

 LEDを点灯するためには13ピンの出力をHIGH(Arduino Unoの場合5V出力)、また消灯するにはLOW(0V出力)に設定する。これを実行する処理としてはdigitalWrite(13, HIGH);とすれば13ピンは5V出力している状態になり、ボード上のLEDは点灯する。次にdelay(1000);とすれば次の行のコードを実行するまで1秒間待機となり、1秒間13ピンの出力5VとLED点灯が維持される。なおdelay関数の引数の時間の単位はmsであるため、1s=1000msということでdelay(1000));となる。1秒間待機のあとに、digitalWrite(13, LOW);とすることで13ピンは5Vから0V出力に変わりLEDは消灯する。次にLED点灯と同様に1秒間待機させるdelay(1000);を入れると1秒間LEDは消灯する。次の処理は、loop関数の一番上のdigitalWrite(13, HIGH);に戻るのでLEDは再び1秒間点灯し、次に1秒間消灯する点滅動作を繰り返していく。

Lチカ別の記述方法

 pinMode()digitalWrite()のピン番号を13として直接指定したが、ArduinoにはLED_BUILTINという定数が予め設定されており、例えばpinMode(LED_BUILTIN,OUTPUT);digitalWrite(LED_BUILTIN, HIGH);としても同じ13ピンの設定(Arduino Unoの場合)をしていることになる。また、HIGHは1、LOWは0と置き換えてもよくdigitalWrte(13,HIGH);digitalWrite(13, 1);digitalWrite(13,LOW);digitalWrite(13,0);としてもよい。if文や条件分岐のときにHIGHやLOWの代わり1または0を使うことがある。

2. Arduino Unoのピン配置

 Lチカのスケッチで説明した13番ピン含むTinkercadにおけるArduino Unoのピン配置・機能の概略を下図に示す。*2デジタル入出力ピンは出力時は0V(LOW)または5V(HIGH)を出力、入力時は0(V)をLOW, 5VをHIGHとして判定する。ただし~マークがついている3,5,6,10,11ピンはパルス波形のパルス幅をコントロールするPWM(Pulse Width Modulation)により0~5Vの中間の電圧を出力することができる。また0(Rx)/1(Tx)ピンはシリアル通信の入力/出力に使用することができる。アナログ入力ピンは0~5Vの入力電圧を10bit(0~1023)分解能で検出することができる。電圧入出力は、Arduino本体への電源供給やArduinoからセンサなどへの電源供給を行うことができる。PCと接続する場合はUSBから5V電源が供給されるが、電池など外部電源で駆動させるためにはDCジャックまたはVinピンに7~12V(推奨電圧)を入力する。なおTinkercadシミュレーション上ではArduinoはUSB接続になるたあまり使用する機会はない。(Vinピンはワイヤ接続できるが、DCジャックはワイヤ接続できない) 5V/3.3Vピンは5Vおよび3.3Vを出力するのでセンサなどに電源供給することができる。ただしTinkercadのシミュレーションではArduinoからの供給電力不足の概念がないようで、実際には供給電流が不足すると思うが例えばDCモーターを並べてもシミュレーションを実行すると高速で回転する。リセットについては、リセットボタンを押す(Tinkercadのシミュレーション中にクリック可能)とリセットがかかり、スケッチの先頭からプログラムが開始する。またリセットピンを外部スイッチなど用いて5V(HIGHレベル)から0V(LOWレベル)にしてもリセットがかかる。

f:id:ATATAT:20200102234802j:plain
TinkercadArduinoピン配置

3. デジタルピン出力信号の確認

 最後にデジタルピンから出力される信号(LOW/HIGH)をTinkercadのシミュレーションで確認してみる。Tinkercadコンポーネントからマルチメーターを回路モデルにドラッグアンドドロップで追加する。Tinkercadのマルチメーターは電圧/電流(アンペア数)/抵抗が測定でき、クリックしたときのメニュー表示のモードから何を測定するか選べる。デフォルトのモードは電圧になっているのでこのまま進める。Arduinoの13ピン端子をクリックするとワイヤが現れるので、マルチメーターの正極に合わせてクリックするとワイヤが接続される。(誤った端子をクリックした場合は、Ctrl+Zで取り消すか、どこか適当な端子に接続してワイヤをdelで消去する)ワイヤ作成時またはワイヤをクリックするとメニューがあらわれるのでColorを変更することができ、正極につながるワイヤを赤、負極につながるワイヤを黒とした。同様にArduinoのGND端子とマルチメーターの負極をワイヤでつなぐ。オンボードLEDと連動する13ピンの他に、2ピンも13ピンと同様にHIGH-LOWと出力させてみる。コンポーネントから再びマルチメーターをドラッグアンドドロップで追加し、13ピンと同じ要領で2ピンおよびGNDをマルチメーターとワイヤ接続する。
 2ピンの出力設定はLチカのスケッチでvoid setup()内にpinMode(2,OUTPUT);void loop();内にdigitalWrite(2, HIGH);digitalWrite(2, LOW);を追加する。(下図では13の代わりにLED_BUILTINとしている) シミュレーションを開始するとLED点滅と同時に13ピンの出力電圧が4.7V/0V、2ピンの出力電圧は5V/0Vで切り替わる。(下図はLED点灯時) これで13ピンの出力とオンボードLEDの点滅が連動していることが確認できた。ところで2ピンの出力は5Vで13ピンの出力は5Vではなく4.7Vになっているが、これは恐らくLEDによる電圧降下の影響と考えられる。以上Tinkercadコンポーネントのマルチメーターや(今回は用いていないが)オシロスコープを接続することにより、Arduinoの電気信号を確認することができる。

f:id:ATATAT:20200103155805j:plain
LED点灯時のデジタルピン出力信号

4. まとめ

 Lチカを動作させるスケッチの中身を説明した。Lチカに関わらず基本的にはArduinoのライブラリで定義されている定数や関数を組み合わせて記述していく。今回はpinMode(),digitalWrite()を取り上げたが 他の関数は日本語訳版リファレンスArduino 日本語リファレンスArduino公式英語版Arduino Reference - Arduino Referenceなど参照するとよい。Tinkercadコンポーネントからマルチメーターを追加することで、シミュレーション上で出力信号の確認できることも示した。次回からデジタル入出力ピン、アナログ入力ピンの動作について触れてみたいと思う。