Raspberry PiのハードウェアPWMを制御するクラスをMicroPythonで書いたものが動作しましたので、次はこのクラスをCで再度実装し、MicroPythonのネイティブクラスにしました。
ロジックはほぼそのまま使用していますが、MicroPython版との差分としては
・freq()メソッドを省略(もともとハードウェアの仕様として、PWMのインスタンスごとに周波数の設定を変更できないため)
・duty()とdata()が実質的に同じなのでduty()を省略
・定数DEFAULT_RANGEは省略(rangeの値自体はrange()で取得可能)
・rangeとdataをインスタンス生成時に指定可能とする
・インスタンス生成時にデフォルトでdata=480(デューティ比50%)とする
としました。また、PWMクラスはmachineモジュール内に入れました。
・クロック周波数のデフォルトは960KHzとする(クロック源をOSC(19.2MHz)とし、プリスケーラを20に設定)
・インスタンス生成時にデフォルトでrange=960とする(周波数1KHzとなります)
は変わっていません。
新規に追加したファイルがこちら、既存のファイルに対する修正がこちらになります。
ロジックを事前に検証済みでしたので、基本的なところは一発で動作しました。
しかしインスタンス生成やプリントアウトのコードが増えているとはいえ、MicroPythonで書くのと比べるとだいぶ行数が多いです。
使い方の例としては以下のようになります。
実行すると前々回と同様に1KHzでデューティ比が連続的に変化する波形を生成します。
Raspberry Pi Zeroでは音声出力ジャックはありませんが、GPIO18に圧電ブザーを接続すれば音が鳴ります。
現時点の積み残し項目は
・FIFOサポート
・クロックの変更
で、これらはいずれもインスタンス単体ではなく、PWM全体に対するパラメータ設定になりますので、別途実装しようと思います。
他の言語だとPWMクラスのクラスメソッドにするのが適切なような気がしますが、何だかPythonってクラスメソッドの影が薄い(言語仕様上は存在しますが)ような気がするので、どうするか検討中です。
コメント