今度はDDSをpythonで制御してみます。pythonからFTDIチップを制御するためにpylibftdiというライブラリが使えそうです。まずはこれをpipでインストールしておきます。
$ pip install pylibftdi
pythonの場合、システム中にいくつか異なるバージョンのpythonがインストールされている場合がありますので、どのバージョンが対象になっているか注意しておく必要があります。PYTHONPATHなどの環境変数で設定できるようですが、pipのインストール対象と一致しているかを気をつける必要があります。
インストールができたら、rubyの時と同様にまずはLチカを試してみます。おまじないとしてシリアルドライバを外しておく必要があるのは同様です。
$ sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext
以下のファイルblink.pyを作成(ダウンロード)します。0.5秒毎にポートをON/OFFしています。簡単ですのでやっていることは判ると思います。
実行すると、LEDが点滅するはずです。
$ ./blink.py
さて、Lチカがうまくいったら、今度はSPIデバイスを制御してみます。rubyの時と同様AD9859を制御の対象とします。SPIデバイスにビット毎に書き込む機能などをSPIDeviceクラスとして用意し、それを使ってAD9859クラスを作ります。今回もコンフィグが簡単にできるよう、また複数のインスタンスを動作させられるように留意します。
というわけで作ったコードがこちらです。dds.py
これを使ったサンプルは以下のようになります。ピン接続やクリスタルの周波数をセットしてデバイスを初期化し、最後に発生させる周波数をセットします。
これをコマンドにしたのがこちらです。ddsbase.py
rubyの時と同様に周波数を引数で指定します。
$ ./ddsbase.py 10e6
振幅をdBで指定することも可能です。その他オプションでクロック倍率やクリスタル周波数も設定できるようにしてみました。以下はヘルプの表示です。
./ddsbase.py -h
Usage: ddsbase.py \[options\] \[freq(Hz)\] \[amplitude(db)\]
Options:
-h, --help show this help message and exit
-v, --verbose make lots of messages \[default\]
-m MUL, --mul=MUL set PLL multiplier \[default: 16\]
-c FREQ set crystal frequency to FREQ \[default: 25000000.0\]
以上、pythonでもDDSをコントロールすることができるようになりました。今回もFT232RLを使用しましたが、FT245RLでも同じコードで制御可能です。
今回初めてpythonのコードを書いてみましたがpython流の書き方に結構ハマりました。いつも使っているrubyと似ているようで、いろいろ細かい違いあるのでいちいち引っかかります。pythonでselfが必須なことはどうしても冗長に感じます。また、メソッド呼び出しに括弧が必ず必要ですが、書き忘れてもエラーにならず見落としてしまい、しばらく悩んでしまいました(rubyやperlでは省略可能なので)。ここは慣れるしかありません。最近はpythonの利用が増えているので、慣れておけば今後役に立つと思います。
- 上記で使用したコード@github https://github.com/edy555/dds-ctrl
- pylibftdi https://pypi.python.org/pypi/pylibftdi
- DDSBASE https://zao.jp/radio/dds-base/index.php
- アナログデバイセズAD9859 https://www.analog.com/jp/digital-to-analog-converters/direct-digital-synthesis-dds/ad9859/products/product.html
- FTDI社 FT232RL https://www.ftdichip.com/Products/ICs/FT232R.htm
- BitBangモードアプリケーションノート https://www.ftdichip.com/Support/Documents/AppNotes/AN_232R-01_Bit_Bang_Mode_Available_For_FT232R_and_Ft245R.pdf
- 秋月のAE-UM232R https://akizukidenshi.com/catalog/g/gK-01977/