Gainer mini は、 Flash や Processing と組み合わせて使う以外に USB I/O モジュールとして使うことができます。そこで、今回はGainer miniを USB I/O モジュールとして使ってみます。
表1のように Gainer mini には、ディジタル入出力、アナログ入出力のピン数が異なる八つのモードがあります。そのうち、二つのモードは、マトリクスLEDとラジコン・サーボの利用のためのモードとなっています。
表1 Gainer mini のモードとピン配置の一覧
■Gainer mini の八つのモード 表1を見てください。基板のシルク印刷は、モード1にあわせた表記になっていることがわかります。モード1以外では、ピン配置に注意してください。たとえば、モード5ではシルク印刷がain 0 のピンが、ディジタル入力の0番となります。
モード1から6までは基本のモードですが、アナログ入力、ディジタル入力、アナログ出力、ディジタル出力のピンの割り当て数が異なります。モード7は、マトリクスLED専用のモードです。モード8は、アナログ入力が4ピン、ディジタル出力が4ピン、ラジコン・サーボ出力が8ピンのモードです。
■Gainer mini 用の C ライブラリ
Gainer mini を玄箱 PRO で使うための C ライブラリとサンプル
gainerm-lib-0.1.tar.gz を作成しました。玄箱 PRO でしかテストしていませんが、Debian/GNU Linux では、そのままコンパイルできると思います。FreeBSD/NetBSDなどでも少しの修正で動くでしょう。ダウンロードして以下の手順でコンパイルしてください。
tar xzvf gainerm-lib-0.1.tar.gz cd gainerm-lib-0.1 make 実行する前に
前回 を参考に Gainer mini を認識できるようにしてください。コンパイルについては Makefile を参照してください。
■LED とボタンを使ってみる 作成したライブラリでは、最初に関数
int gm_open(char *dev, int mode); を呼び出し、Gainer mini を初期化します。dev はデバイス・ファイル、mode は Gainer mini のモードです。返り値はデバイス・ファイルを開いたファイル記述子です。
asy = gm_open("/dev/ttyUSB0", 1); のように変数に入れておき、後で使います。次のようなコールバック関数
void button_pressed() { fprintf(stderr, "button pressed\n"); } void button_released() { fprintf(stderr, "button released\n"); } を
gm_button_pressed = button_pressed; gm_button_released = button_released; と登録しておくと、ボタンを押したときと離したときに、button_pressed() 関数と button_released() 関数がそれぞれ呼び出されます。基板上の LED を点灯・消灯するには、それぞれ
gm_led_on(int asy) gm_led_off(int asy) 関数を使います。詳しくは sample0.c を見てください。またコンパイルした sample0 を実行してみてください。実行結果は
前回 のビデオと同じです。
■ディジタル出力を使ってみる モード1でディジタル出力を使ってみます。使える関数は、
void gm_dH(int asy, int n) void gm_dL(int asy, int n) void gm_dout(int asy, int d) の三つです。gm_dH() と gm_dl() は n 番のピンをそれぞれ H (5V)、L (0V) にします。gm_dout() では変数 d の各ビットの 1/0 でディジタル出力のビットの H/L を指定します。 回路図は次のようになっています。
図1 Gainer mini と LED をつなぐ回路(sample 1 と 2 用)
sample1ではdout0からdout3のみ使います。aout0からaout3はアナログ出力を試すときに使います。sample1.c をコンパイルした sample1 を実行してみてください。1ピンに流す電流は最大で 10mA 程度までとしたほうがよいでしょう。
L のときにも回路によっては電流が流れます。そのときの電流の大きさも 10mA 程度までとしてください。
■アナログ出力を使ってみる モード3でアナログ出力を使ってみます。モード3では dout の4本を含めて、合計8本がアナログ出力になります。使える関数は、
void gm_aout1(int asy, int n, int a); void gm_aout(int asy, int *a, int n); です。gm_aout1() は n 番目のピンに a の値の出力を出します。gm_aout() は配列 a[] に入れた値を出力します。n はモードに合わせた配列の大きさです。モード1, 2 では n を 4, モード3, 4 では n を 8 にします。値の範囲は 0 から 255 (0x00 から 0xff)です。
回路図は図1のとおりです。sample2.c のプログラムを実行すると、徐々に LED が明るくなります。
1ピンあたりの出力電流は、ディジタル出力のときと同じで 10mA 以下にしてください。またアナログ出力と呼んでいますが、正確には PWM 出力です。0 のときには 0V が、255 のときには 5V が出ています。
1 から 244 の値のときには、ある周期で値に比例した時間 5V で残りの時間 0V を出すことを繰り返しています。回路によっては問題になるので注意してください。
■ディジタル入力を使ってみる スイッチを回路図のようにつなぎます。
図2 スイッチとボリューム(半固定抵抗)を Gainer mini とつなぐ(sample3 と 4 用)
半固定抵抗(ボリューム)は次のアナログ入力のサンプルで使います。ディジタル入力を試す sample3 では Gainer mini のモードを1にしています。ディジタル入力は、入力が L (0V) か H (5V) かを読みます。使う関数は、
unsigned long gm_din(int asy) です。入力ピンの第iビット(iは0から3または7)が、返り値の第iビットに反映されます。論理積を使ってスイッチのつながっている第0ビットを判定しています。
■アナログ入力を使ってみる この sample4 では Gainer mini のモード4を使います。このモードでは din 0 から din 3 もアナログ入力になります。使う関数は、
int gm_ain(int asy, int *a, int n); です。配列aに入力の値が入ります。配列はモードに合わせた大きさ(モード1,3,8では4、モード2,4では8)を用意してください。nには配列の大きさを入れます。入力の範囲は 0 から 255 の範囲です。0が 0[V], 255 がおおよそ 5[V}に相当します。USB の電圧を基準にしているので、パソコン(USB ハブやケーブルを含めて)によって多少入力値が変わります。sample4を実行するとビデオのようになります。
sample4.c を見るとわかるようにスイッチもサンプルのように、アナログ入力でも扱うことができます。
■マトリクス LED を使ってみる
モード7でマトリクスLEDを使ってみます。関数は次の二つです:
void gm_mled(int asy, int n, int *row); void gm_mled88(int asy, char *led); gm_mled()は、桁 n のLEDの明るさ(0から15)を入れた配列を指定します。gm_mled88()は、8x8のマトリクス全体の明るさ(0から15)を入れた配列(大きさ64)を指定します。回路図のように組み立ててください。
図3 Gainer mini にマトリクス LED をつなぐ (sample 5 用)
sample5を実行するとビデオのようになります。
Gainer mini 単体だと流せる電流が少ないので暗めです。明るくするにはトランジスタ・アレイを使います。回路図(
TD62382使用 と
TD62383使用 )を示しておきます。
■ラジコン・サーボを使ってみる
最後にモード8でラジコン・サーボを使ってみます。関数は二つあります。
void gm_rc(int asy, int *a, int n); void gm_rc1(int asy, int n, int a); gm_rc() は、ラジコン・サーボの角度をまとめて指定します。配列 a に各ピンに出力する値を入れ、nは8を渡します。gm_rc1()の引数 n はピンの番号(0から7)、a が角度です。角度の範囲は 0 から 255 です。使用するサーボによって実現される角度は違います。実際に動かして確かめてください。
サーボは写真のようにつなぎます。写真のサーボでは、茶色が信号の線だったので R/C 0 (aout 0) のピンにつなぎ、茶色をグラウンド、赤を5Vにつないでいます。ほかのサーボを使うときは配線の色が違ったり、ピンの並びが違うこともあるので注意してください。
図4 Gainer mini とラジコンサーボをつなぐ (sample6)
sample6.c のプログラムを実行してみてください。最初は gm_rc() の例、次が gm_rc1()の例となっています。gm_rc1()の例では少しずつ角度を変え、Gainer mini の基板上のボタンを押すと元の位置に戻るようになっています。
■終わりに Gainer mini を使った基本的なプログラムを紹介しました。さらに音声ファイルの再生などと組み合わせるとインタラクティブで楽しいシステムができるのではないでしょうか。またデスクトップ PC でしたら画像(動画)と組み合わせるのも面白そうです。本稿を活用していただければ幸いです。
光永 法明
コメントする