なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

MacOSXでFTDIのBit-Bangモードを試す

Posted by arms22 on 2008年05月18日 2  0

FTDIのUSBシリアル変換IC FT232RL にはデータ端子を8bitの双方向IOポートとして使う Bit-Bang モードがあります。このモードを使えば FT232RL に接続したハードウェアをPCアプリから直接制御することができます。

秋月電子から FT232RL を搭載したUSBシリアル変換モジュールが販売されています。Writer509用にこのモジュールを購入したのですが、汎用IOポートとして使えると分かってかなり得した気分です。早速このモジュールを使って Bit-Bang モードを試したいと思います。

D2XXドライバのインストール
FTDIから Bit-Bang モードを利用する為の D2XX ドライバが提供されています。D2XX ドライバは Windows, Linux, MacOSX と各種プラットフォーム用のドライバが提供されています。
ここからMacOSX用のD2XXドライバをダウンロードしてきて、次のようにターミナルから手動でインストールします(※管理者権限が必要です)。

cp libftd2xx.0.1.0.dylib /usr/local/lib
cd /usr/local/lib
ln -sf libftd2xx.0.1.0.dylib libftd2xx.dylib

VCPドライバのアンロード
D2XXドライバとVCP(仮想COMポート)ドライバは同時に使用できないため、VCPドライバがインストールされている場合は、VCPドライバをアンロードします(※要管理者権限)。
kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext
OSXを再起動すれば、またVCPドライバはロードされます。VCPドライバを再ロードしたい場合は次のようにします(※要管理者権限)。
kextload /System/Library/Extensions/FTDIUSBSerialDriver.kext
VCPドライバをアンインストールしたい場合は、次のファイルを別の場所に移動させます(※要管理者権限)。
/System/Library/Extensions/FTDIUSBSerialDriver.kext


LEDチカチカ
ブレッドボードに簡単なLED制御用の回路を作成。
bit_bang_led_test.jpg

D2XXドライバに付属していたサンプルを元に標準入力から入力された数値を、D0~D7端子に出力するプログラムを作成した。D0にLEDが接続されているので、'1'と入力するとLEDが点灯、'0'と入力するとLEDが消灯する。ソースコードは続きを読むで。

Bit-Bangモードの使い方
FTDI社USB-8ビットパラレル変換器FT245RLをMacOSXで使う
USB パラレル FTDI FT245RL を使ってみる
FT232RL USBシリアル変換モジュール

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "ftd2xx.h"

// Globals
FT_HANDLE ftHandle = NULL;

void quit()
{
if(ftHandle != NULL) {
FT_Close(ftHandle);
ftHandle = NULL;
printf("Closed device ¥n");
}

exit(1);
}

int main(int argc, char *argv[])
{
DWORD dwBytesInQueue;
FT_STATUS ftStatus;

signal(SIGINT, quit); // trap ctrl-c call quit fn

ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK) {
/*
This can fail if the ftdi_sio driver is loaded
use lsmod to check this and rmmod ftdi_sio to remove
also rmmod usbserial
*/
printf("FT_Open failed = %d ¥n", ftStatus);
if(ftStatus == FT_DEVICE_NOT_FOUND)
printf("ftdi device not found ¥n");
else if(ftStatus == FT_DEVICE_NOT_OPENED)
printf("ftdi device not opend ¥n"
"unload ftdi_sio ¥n"
"linux) rmmod ftdi_sio ¥n"
"osx) sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext ¥n");
return 1;
}

ftStatus = FT_SetBitMode(ftHandle, 0xff, 0x04); // D0-D7 output
if(ftStatus != FT_OK) {
printf("Failed to set bit mode ¥n");
}

ftStatus = FT_SetBaudRate(ftHandle, 9600);
if(ftStatus != FT_OK) {
fprintf(stderr,"FT_SetBaudRate failed = %d ¥n");
return 1;
}

ftStatus = FT_Purge(ftHandle,FT_PURGE_RX|FT_PURGE_TX);
if(ftStatus != FT_OK) {
fprintf(stderr,"FT_Purge failed = %d ¥n");
return 1;
}

int x;
do {
printf(">");
scanf("%x",&x);

char c = x & 0xff;
FT_Write(ftHandle, &c, 1, &dwBytesInQueue);

}while(x != 0xaa);

if(ftHandle != NULL) {
FT_Close(ftHandle);
ftHandle = NULL;
}

return 0;
}

Ads by Google

2 Comments

やもり says..."Bitbangで赤外線リモコン"
Bitbangで赤外線リモコンしてみました。興味ありましたら、のぞいてやってください。よろしくお願いします。
2010.10.02 19:36 | URL | #7/O/DC8. [edit]
anonymous says..."Marvericks"
0S 10.9 (Mavericks)ではOSにVCPドライバ相当が標準でバンドルされるようになったみたいで、kextunloadするのは以下のとおりになったようです。

sudo kextunload -bundle com.apple.driver.AppleUSBFTDI
2013.12.02 16:56 | URL | #- [edit]

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。