MicroPython的午睡(101) ESP32版、PWMのサンプルプログラムそのまま

Joseph Halfmoon

前回ESP32版のMicroPythonが復活したので触っていきたいと思います。よい塩梅に比較対象になるボードを別シリーズで使い始めたのでそちらの進捗とも合わせて、実験してまいりたいと思います。今回はPWM出力であります。キホンのキなのでドキュメントとサンプルも充実。今回はサンプルそのまま動かしてみただけ。

※「MicroPython的午睡」投稿順 Indexはこちら

ESP32版MicroPythonのPWM出力

PWM(Pulse Width Modulation)は、出力するパルス幅(デューティ比)と周波数を制御することでデジタル出力でアナログ的な制御をするのに使われます。一定の周波数でパルス出力しながらそのデューティを変えることでLEDの点灯時間を制御して明るさを変更するとか、モータの回転数を変えるなど応用は数々あり。

さてESP32版のMicroPythonでもPWMを使うことが多いからかドキュメンテーション(日本語)しっかりしとりますなあ。下記のページからいろいろ辿ることができます。

Docs > ESP32 用クイックリファレンス

上記のページにESP32の名のもとに複数存在するいくつかの系統のチップ毎、チャネル数などの説明が掲載されています。今回使用しているのはESP32 DevKitCボードであるので、上記ページに記載されている中では単にESP32と記されている列が該当します。全16チャネルのPWMが使用可能。ESP32系はピン配置の自由度が高かった記憶。だいたいのデジタル端子がPWM出力に使えるのではないかと(勿論、チャネル数の制限内で。)

なお、ESP32 DevKitCの場合、ボード表面にシルクで印刷されている端子番号をそのまま使ってMicroPython上でのPIN指定をすることができました。別資料を開かなくてもいいのでラクちん。

上記クイックリファレンスからたどれる以下のページをみたら、今回やろうとしていたPWMの周波数の変更や、デューティ比の変更のサンプルプログラムがありました。

Docs > ESP32 用クイックリファレンス > ESP32用 MicroPython チュートリアル > 2. パルス幅変調

今回は以下のタイトルのもと、上記ページに掲載されているサンプルプログラムをほぼほぼそのまま使わせていただきます。なお、ピンだけは当方のボードの配線の都合で22番(サンプルプログラムでは5番)に変更してます。

    • スムーズな周波数変更の例
    • スムーズなデューティ変更の例
比較対象機

別にどちらのマイコンが良いとか、どちらの処理系が優れているという気はないのです。しかしそれぞれのマイコン、それぞれの処理系のクセを比較することで理解も深まるという考えであります。比較対象機として、ルネサスRX631マイコン搭載のGR-CITRUSボードのRuby処理系(組み込み用のmruby)を眺めつつ、実験したいと思います。別シリーズ記事が以下に。

Rubyと一緒(2) GR-CITRUSでPWM信号出力を使ってみる

個人の感想としては、ESP32版のMicroPythonのPWM制御の方が「細かいところに手が届く」感じがします。GR-CITRUSボードのmruby処理系ではpwmメソッドは周波数固定(490Hz)でデューティのみ変更可能(でもtoneメソッド使えば周期可変のパルス信号も得られる。そのときはデューティ固定)という塩梅で、設定は簡単でしたが処理系からいじれる組み合わせには制限がありました。一方、MicroPythonはやろうとすればかなり低レベルなところまで設定可能です。そのかわりメンドイ(オシロみてプログラムした波形が本当に出ているのか確認したい)です。

実験

Thonny IDEからサンプルプログラムを流し込み、22番端子に出力されるPWM波形を観察したものが以下です。

まずは、「スムーズな周波数変更の例」の場合。こちらはデューティ比50%で、周波数500Hz付近から1000Hzまで「スムーズ」に変更しながら波形をみせてくれます。以下は周波数下限に近い550Hz付近の波形。550Hz

 

周波数840Hz付近まで上昇したところのスナップショットが以下に。840Hz

つづいて、「スムーズなデューティ変更の例」です。周波数は1000Hzで固定。デューティ比を0%から100%付近まで振っていきます。以下は約2%、限りなく0に近づいていくところ。1000Hz2P

つづいて約96%。ほぼほぼ一杯。1000Hz96P

今回はサンプル動かしただけだけれど、フレキシブルに制御できることは分かったよ。ホントか?

MicroPython的午睡(100) ESP32版、ブートモードに入らなくて焦りました へ戻る

MiroPython的午睡(102) ESP32版、8ビットのDAC使えた へ進む