趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • USB-IOを動かしてみる(後編)

    投稿日 2011年 12月 6日 コメントはありません

    USB-IO(秋月版)へのアクセスをプログラムにまとめてみました。プログラムとしてはポート1のビット0につないだLEDを点滅させるだけのものです。ついでにデジタル入力データも表示しているので、ポート2をGNDに落としたり離したりするとそのようすもHEXデータとして見えてきます。

    プログラムとしては、ほとんど参考にさせていただいたサイト(プログラム中を参照)とほとんど同じことをしているだけですので、完全コピペの部分は抜いてあります。追試される場合はリンク先から引用してください。

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/ioctl.h>
    #include <linux/hidraw.h>
    
    // 下記関数は右記サイトより引用:http://www.magical-technology.com/hiroya/blog/2008-04-05T22_15_41.html
    int hidraw_open(int vendor, int product, int mode)
    {
    <<途中省略>>
    }
    
    #define VendorId 0x1352
    #define ProductId 0x0121
    
    int main(int argc,char *argv[])
    {
    	int fd = hidraw_open(VendorId, ProductId, O_RDWR);
    	char led_on[] = { 0x00, 0x20, 0x01, 0x01 };
    	char led_off[] = { 0x00, 0x20, 0x01, 0x00 };
    	char sts[65];
    	int i,j;
    
    	for(i=0;i<10;i++){
    		// LED点灯
    		write(fd, led_on, sizeof(led_on));
    		read(fd, sts, sizeof(sts));
    		for(j=0;j<8;j++) printf("%02X ",sts[j]);
    		printf("\n");
    		sleep(1);
    		// LED消灯
    		write(fd, led_off, sizeof(led_off));
    		read(fd, sts, sizeof(sts));
    		for(j=0;j<8;j++) printf("%02X ",sts[j]);
    		printf("\n");
    		sleep(1);
    	}
    	close(fd);
    }

    動かすには普通にコンパイルして、ルート権限で実行(sudoをつけて実行)すればOKです。

    ただ、実行前に

    # printf "\x00\x0f9\x00\x00\x00\x00\x0fe\x0f\x00\x00\x00\x00" > /dev/hidraw3

    として、ポート1のビット0を出力に設定したあと一旦USBケーブルを抜いて、差しなおしておく必要があります。(hidraw3の部分も環境に応じて修正が必要)