RF関連に限らず、ちょっとした機能を持つチップやデバイスは、SPI(Serial Peripheral Interface)やI2Cで制御する必要がありますが、普通はマイコンなどを使います。最近ではArduinoなども開発環境も揃っていますので、気軽に使えてとても便利です。しかし、PC/Macと連携させて動作させたいという場合には、シリアル等で別途Arduinoと通信をしなければならず、ファームウェアも作成する必要があります。本来であれば単にいくつかのピンを制御したいだけなのに、冗長な感も否めません。昔であればプリンタのパラレルポートを使う場合もありましたが、PCからプリンタインターフェースが消えて既に久しいです。今であればUSBを使うべきところでしょう。
そこで今回ですが最近広く使われているFT232RLのBitBangモードを使ってみます。FT232RLとはFTDI社のUSBシリアル変換チップで、Arduinoにも使われています。このチップにはBitBangモードという入出力機能が用意されていて、シリアル入出力の代わりに8bit分の汎用I/Oポートとして利用することができます。今回はこちらを使ってみることにします。
BitBangモードによる入出力をするためには、制御するために何らかのコードを書く必要があります。ドライバとしてFTDI社純正のFTD2XXがあり、CベースのAPIが提供されていますので、これでコードを書くことは可能です。しかし、プロトタイピングや書いて試しての繰り返しのためにはもっと気軽に使いたいところです。そこで今回は使い慣れているrubyを使って、FT232RLのBitBangモードをスクリプトで制御してみることにします。
後で書く予定ですが、本当ならGNURadioと合わせて利用するためにpythonでやりたいところです。ですが、まずは使い慣れたrubyでちゃんと動作させてから、後ほど移行を考えることにします。
使用するAPIですが、libusbベースのlibftdiというライブラリがHomebrewでインストールできるようなので、今回はこちらを使ってみることにしました。libusbベースの実装は、Mac/Linuxの場合ドライバのインストールが不要なので面倒が一つ減らせます(FTD2XXの場合はドライバが必要です)。
FT232RLは、秋月のAE-UM232Rを使用します。最近は中華製のモジュールもありますし入手は容易です。ピン接続を示します。BitBangモードでのIOポートはD0-D7です。
MacからBitBangモードを使用するためには、おまじないが必要です。FT232RLをUSBに接続すると、通常はOSに組み込まれているドライバによりシリアルアダプタとして認識されてしまいます。この状態ではBitBangモードで使うことができませんので、事前にftd_sioドライバを外しておく必要があります。Macの場合には以下の操作をします。特権での操作なのでパスワードが必要です。
$ sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext
ちょっと面倒ですがこの操作はOSを再起動する度に行う必要があります。もしArduinoを使う場合など、FT232RLをシリアルとして使う必要があるなら下記で元に戻すことができます。
$ sudo kextload /System/Library/Extensions/FTDIUSBSerialDriver.kext
libftdiをbrew installします。依存しているlibusbもインストールされるはずです。
$ brew install libftdi
libftdiをインストールすると、いくつかテスト用のコマンドも同時にインストールされるのでまずはこれを試してみます。
$ /usr/local/bin/simple
ftdi_read_chipid: 0
FTDI chipid: FFC8BFF1
$ bitbang ftdi open succeeded: 0
enabling bitbang mode
turning everything on
turning everything off
fe fd fb f7 ef df bf 7f
fe fd fb f7 ef df bf 7f
fe fd fb f7 ef df bf 7f
fe fd fb f7 ef df bf 7f
disabling bitbang mode
うまく動いているようです。つづいて、これをrubyから使うために、libftdi-rubyをインストールします。githubでも公開されていますが、gemになっているのでインストールにはこちらを使います。
$ gem install libftdi-ruby
Fetching: libftdi-ruby-0.0.4.gem (100%)
Successfully installed libftdi-ruby-0.0.4
Gems updated: libftdi-ruby
Installing ri documentation for libftdi-ruby-0.0.4...
Installing RDoc documentation for libftdi-ruby-0.0.4...
0.0.4が入ればOKです。
テストスクリプトをここからコピペして動かしてみます。
$ ruby libftdi-ruby-test.rb
Context is:
usb_ctx = #
usb_dev = #
usb_read_timeout = 3
usb_write_timeout = 250000
type = 3279360
baudrate = 1
bitbang_enabled = 0
readbuffer = #
readbuffer_offset = 4096
readbuffer_remaining = 4096
readbuffer_chunksize = 64
writebuffer_chunksize = 0
max_packet_size = 0
interface = 2
index = 129
in_ep = 1
out_ep = 128
bitbang_mode = 1
eeprom = #
error_str =
module_detach_mode = auto_detach_sio_module
ちゃんとrubyからも認識していることが確認できたら、次にLEDを点滅させてみます。FT232RLの1番ピンとGNDの間に数百オームの抵抗とLEDを直列に繋ぎます。
スクリプトはこんな感じになります。
gemでlibftdi-rubyをインストールした場合、このファイルは /usr/local/lib/ruby/user-gems/1.8/gems/libftdi-ruby/examples/blink.rb に入るはずです。
動かしてみます。
$ ./blink.rb
うまく動いているようです。動画も上げておきます。
ちなみに、デバイスが接続されていない時には以下のエラーとなります。
-3: Ftdi::StatusCodeError
また、シリアルドライバがロードされている場合には以下です。
-5: Ftdi::StatusCodeError
LEDの点滅(通称Lチカ)ができたら、あとは何でも制御できるはずです。コンパイルもアップロードも不要なので、気軽に書いては試すことが繰り返せます。引き続きSPIデバイスの制御をやってみたいと思います。
はまったポイントとリファレンス
- libusbやlibftdiをインストールする際に、libusbのバージョン違いや、以前インストールしていたlibusb/libftdiが邪魔をしてうまくインストールできませんでした。一度それらを削除してから、改めてbrewで再度インストールするとうまくいきました。
- ドライバを外す際にエラーが発生することがありました。一度OSを再起動することで外せるようになりました
- 同様のモジュールにFT245RLを使用したものもあります。こちらもBitBangモードを使えます。まったく同じコードが動きますが、ピン配列が異なりますので注意が必要です。FT245RLの方が使いやすい配列です。https://akizukidenshi.com/catalog/g/gK-01799/
- FT2232HにもBitBangモードがありこちらは16bit使うことができます。さらにMPSSEという高速に制御する方法が提供されています。
- libftdiのrubyバインディングには2種類あるようです。gemでインストールできるlibftdi-rubyを使いました。
- github https://github.com/Undev/libftdi-ruby
- 最初libftdi-rubyで試したとき、ちゃんとbitbangモードが使えていた気がしたのですが、実は初期化が動作しておらず、libftdi-rubyではbitbangモードがまだサポートされていなかったことがわかりました。パッチを作ってPull Requestしたところ、すぐにマージしてくれてました。0.0.4以後に入っているはずです。Thanks > akzhan-san and Undev team
- 送ったpull request https://github.com/Undev/libftdi-ruby/pull/1
- libftdiの配布元 https://www.intra2net.com/en/developer/libftdi/
- C+Macで制御する例 https://hackaday.com/2009/09/22/introduction-to-ftdi-bitbang-mode/
- 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/
- 中華FT232RLモジュール aliexpress