前回はLチカを動作させるためのスケッチとデジタル入出力ピンの動作について説明した。今回はデジタル入出力ピンの利用方法や0~5Vの中間電圧を出力するPWMについてTinkercadのシミュレーションを通じて示してみたい。
1. LEDインジケーター
Tinkercadのコンポーネント---すべて---から出力機器の種類をみてみるとLED、モーター、圧電(スピーカー)、表示器があるが、一番単純なLEDインジケーターがよいだろう。何か信号が入力されたとき、ユーザーがボタン操作をしたときにLEDを点灯、点滅、消灯をすることで機器のステータスを表示する。Tinkercad上のモデルでLEDとArduinoのデジタル入出力ピンを接続すればよいが、Tinkercadのコンポーネントからブレッドボード(小)を利用して配線を行う。Tinkercadはシミュレーターなので、部品から直接ワイヤで端子同士を接続できるが、実際の電子工作ではブレッドボードを使うとはんだ付け不要なので便利なことが多く、Arduinoの電子工作例でよく使われている。下図がブレッドボードで線で示したところが導通している。Tinkercadではブレッドボードの端子をマウスオーバーすると導通している端子を示してくれる。使い方についてはhttps://www.sunhayato.co.jp/blog/2015/03/04/7を参照するとよい。
Arduinoの2ピンを5V出力に設定し、ブレッドボードを介してLED(赤)に接続したシミュレーションの様子を示す。本来インジケーターとしては、ボタン、スイッチ、その他外部入力に応じてLEDを点灯、消灯、点滅させるが、今回は単純にプログラム実行でLED点灯のみとする。なおスケッチはとりあえずvoid setup()
内にpinMode(2, OUTPUT);
, digitalWrite(2, HIGH);
としてvoid loop()
内は空にした。LEDは点灯するが、!マークが現れるのでLEDをマウスオーバーすると警告の中身が表示される。今回の場合は、LEDの推奨最大電流20mAに対して53.5mAが流れているので寿命が短くなるというもの。
ちなみに実際にはやってはいけないが、9V電池につなぐと!から表示が変わり破損の可能性を示してくれる。
LEDに過電流が流れないように保護抵抗を設けるのが一般的で、例えば150Ωの抵抗を入れてシミュレーションを実行すると、!マークが消えてLEDは点灯する。
なお最大電流20mAは典型値であって、電子工作を実際に行う場合は使用するLEDのデータシートを確認する必要がある。またTinkercadの警告はLEDに過剰電流やデバイス(AttinyやESP8266など)への過剰電圧が供給された場合に表示されることがあるが、すべてのNG配線に対して警告が出るわけではない。例えばLEDの正極と負極を入れ替えて9V加えると、実際は逆電圧がかかり過ぎてLEDが破損するが、Tinkercad上ではLEDが点灯しないだけで特に警告は表示されない。また、例えばこれだけはやるな!Arduino Unoを破壊する10の回路 | IDEAHACKに取り上げられているような配線を行っても特に警告は表示されない。当然ではあるが実際の電子工作では、各部品の最大電圧、電流、正負など十分に注意する必要がある。
2. デジタルピンのPWM出力
デジタル入出力ピンはLOWとHIGH、Arduino Unoの場合0Vと5Vのみの出力となるがボード上'~'マークが付いているピン:3,5,6,10,11についてはPWM(Pulse Width Modulation)によって0~5Vの中間電圧を出力することができる。パルス出力のパルス幅を変えることにより、実効電圧を0Vと5V以外に制御することができる。(チョッパ制御 - Wikipediaなど参照)
デジタルピンからPWM出力するためには、スケッチにanalogWrite(pin,val);
を記述する。pinは出力するピン番号で3,5,6,10,11のいずれかで、valはパルス幅(デューティー比)を0~255の範囲で入力する。val=0で0V、val=255で5Vの出力に相当する。例えば1V出力する場合は、255/5=51をvalに設定すればよい。なおパルスの周波数は5,6ピンは約980Hzでそれ以外は約490Hzということで、3ピンと6ピンから1Vを出力し、マルチメーターとオシロスコープで出力を確認するシミュレーションを実行した。オシロスコープはコンポーネントのところで基本からすべてに切り替えると選択できる。パルス波形を適切に表示するためオシロスコープをクリックしてメニューから"分割あたりの時間"を1msに設定した。
スケッチについては、setup()
内にanalogWrite()
を記述してloop()
内は空にした。なおアナログ出力に関してはpinMode()
の設定は不要。
void setup(){ analogWrite(3, 51*1); analogWrite(6, 51*1); } void loop(){ }
マルチメーターの電圧はそれぞれパルス電圧の平均値"約1V"を表示している。またオシロスコープは短めの0/5Vパルス信号であり、また3ピンよりもと6ピンのパルスの方が周波数が高いことが確認できる。analogWrite()
のパルス幅の数値を変えるとオシロスコープで表示されるパルス幅やマルチメーターの電圧表示が変化する。デジタルピンのPWM出力の使用例としては、LEDの明るさ調整やモーターの回転速度調整などが挙げられる。
3. PWMによるLEDの明るさ調整
PWMによりピン7から4V、ピン3から0.5Vに設定してた出力をLEDに接続し、また1.5V電池にLEDを接続したものと、なにも接続していないLED(明るさの参考のため)をTinkercadでシミュレーションしてみた。Tinkercad上のLEDの明るさは、4Vの方が0.5Vよりも明るいことがわかる。ところで1.5V電池に接続されたLEDよりもピン3からの0.5Vの方が明るいということに気づく。この理由は、通常のLEDは順方向電圧*1が2V付近にあることに起因する。LEDに電流を流して光らせるためには順方向電圧以上の電圧をかける必要があり、順方向電圧を下回ると流れる電流が急激に減るという性質がある。PWMは0Vと5Vの出力時間を調整することで、平均値として0~5Vの中間電圧を生成しており、LEDは5Vで一瞬点灯し0Vで消灯していることになる。一方で1.5V電池は1.5Vの電圧を常時供給しているが、順方向電圧の2Vよりも低いので電流があまり流れず、LEDは暗く点灯している。結果としてPWMの0.5Vの方が1.5V電池よりもLEDは明るくなっている。Aruino Unoの場合は、0~5Vのアナログ電圧はPWMで生成しているが、Arduino DueのDAC0, DAC1ピンはD/A変換により生成しているのでLEDの明るさ調整をする場合は注意が必要だ。なおシミュレーションでは1.5V電池に関してはほとんど電流が流れないので保護抵抗なしにしているが、通常は保護抵抗を入れたほうがよい。ピン7、ピン3に接続しているLEDはそれぞれ150Ωの保護抵抗を入れている。あと、あくまでTinkercadのシミュレーション上の明るさであり、実際の見え方は使用するLEDによって違うので、電子工作をする上では実際にLEDを点灯させながら出力する電圧を調整する必要がある。
4. まとめ
今回はデジタルピンの出力動作としてPWMを中心に説明した。またデジタル出力をLEDに接続した場合の注意点、PWMによる明るさ調整についてTinkercadのシミュレーション例を示した。次回はデジタルピン、アナログピンへの入力について説明したい。
*1:順方向電圧についてはこちらも参照:LEDの順方向電圧VFとは