Arduinoを使ってパルス波のデューティ比(一定周期のON/OFF時間全体に占めるONの時間)を変化させることによる変調であるPWM/Pulse Width Modulation/パルス幅変調を可視化してみるページ。
これまでPWMってなんか面倒そうと思い込んで見てみぬふりを決め込んできたのですが、PWMなら、これに対応したArduinoボードのデジタルピンの電圧を変えることもできることを知り、そういうことなら全然難しくないじゃん...と一気に氷解。
それなら、マルチメータで電圧の変化を確認してみよう、ついては、追従できる間隔を設けたスケッチを書こう、そういえば、オシロってこういう時に使うんじゃないか?と思い、確認してみることにしました。
オシロについては組み立て済みも未だ動作検証未完のDSO138はさておき、回路を組み動作確認できたKyutech Arduino Scope、Oscilloscope-Arduino-Processingですが、今ひとつピンと来ておらず、初めて自発的に、こういうケースでこう使ってみればよいのかと思えた今回、超ウルトラものすごくスーパーとってもスペシャル最高ベリーベリー非常にスッキリしたのでした。
一方、同様の状況だったロジアナもUSB接続ロジアナ、ArduinoとProcessingから成るDIY Logic Analyzerは動作確認済み、今回もPulseView、Saleae Logicオリジナルソフト共に使ってはみたのですが、こちらは、相変わらず、よくわからずじまい...。
ちなみに、こんなレベルだから、一応、組み立て、動作確認はしたものの、ICL8038 機能信号発生器も使いこなせていません。
というわけで今回は、LEDとデジタルマルチメータ(DMM)、オシロスコープ、ロジックアナライザを使ってPWMを可視化してみることにしました。
後述のスケッチにあるようにPWMによりLEDの明るさ(電圧)を5段階で増減させつつ、各電圧をマルチメータで計測してみたのが、この動画。
消灯を含め、5段階にLEDの明るさが変化しつつ、DMM上では、約0〜1.5mV(約0V)、約0.9V(約1V)、約1.781V(約2V)、約2.662V(約3V)、約3.541V(約4V)、約4.43V(約5V)と変化しているのが見てとれます。
同じく、PWMによりLEDの明るさ(電圧)を5段階で増減させつつ、オシロスコープで計測してみたのが、この動画(あ、周波数間違えた...)。
5段階にLEDの明るさが変化しつつ、オシロ上では、パルス幅(デューティ比)が変化しているのが見てとれます。
左に映っているのはLED回路、右のケース入りは、Kyutech Arduino Scope。
測定は、2チャンネル対応のKyutech Arduino ScopeでCH1/CH2の内、CH1に相当するA1ピンにLED回路のプラス側から引き出したジャンパワイヤを接続し、kit_scope.pdeを実行することで行ないました。
今回使ったのは、以前、750円で買ったUSBロジックアナライザ 8ch 24MHz、このCH0にLED回路のプラスから引き出したジャンパワイヤを接続し、測定。
よくわからないまま、[50k samples]、[16MHz]、そして[PWM]を選択、PulseViewを起動、[Run]した結果。
定期的にON/OFFしていること、デューティサイクルが20%程度、時間にして1msであるらしきことはわかりました。
Saleae Logicを起動、なんとなく選んだ[Logic 8]のデフォルト値を使い、[Start Simulation]した結果。
こっちは、電圧が5Vであることくらいしか、理解できなかった...。
回路とスケッチについては後述しますが、オシロやDMMは別としてAmazonマーケットプレイス激安店からチョイスすれば、抵抗とLEDを各1個とジャンパワイヤ数本、ブレッドボードだけなら100円前後、Arduinoボードを入れても300〜600円前後でいけるかと。
回路とスケッチはこんな感じ。
以前、PWMについて気になったサイトは見つけられず、代わりに、たどり着いたPWM と Arduino でのアナログ出力を参照させて頂くことにしました。
これによるとArduino Uno/Nano/Pro MiniなどのボードならD3/D5/D6/D9/D10/D11ピンでPWMを利用可能、PWMの周波数は約490Hz、D5、D6は約980Hzということで、ここでは結果、D5を使いました。
今回、5V 16MHzのNanoを使ったのでスケッチでは、1〜5V間で1Vずつ増減ループさせつつ、DMM表示が間に合うように、また、LEDやオシロの波形の変化が見やすいように、3秒の間を置くことにしました。
尚、リンク先にもありますが、51というのは、デジタルピンの値は0-255として表われるため、5(V)で割って1Vあたりを求めた値であり、リンク先の工夫に習ってスケッチを書いてみました。
LED回路は、ブレッドボード上にArduinoボードの出力用デジタルピン(ここではD5)を適当に抵抗220Ωを介したLEDのプラス側に、LEDのカソード側をArduinoボードのGNDにつなぎ、DMMとオシロ、ロジアナで出力を確認するため、プラス部分からジャンパワイヤを引き出しておくだけ。