GAINERを使ってみよう
by K.I
2009/01/10〜
Index
- うだうだ日記で、Processingというプログラム環境?が紹介されていた。
- 何気なくダウンロードして、Demoを見てみたらナカナカ良さそう。
- それで、さらに検索していたらGAINERで、Processingを開発環境として使うことが出来るらしい。
- このGAINERって、 ことぶ記の寿さんがやってたGAINER?
- 今度はGAINERで検索してみると、どうもそうらしい。知らなかったんだけど、結構大きなプロジェクトになってるみたいだ。
- これはハードとソフトが 公開されている。すばらしい。
- GAINERのMPUはPSoCなので、自分のところは開発環境はインストール済みだし、手持ちも部品だけでなんとかなりそうだ。
- Processingを試してみようと思っていたんだけど、思いもよらずに電子工作の方に来ちゃったな〜。
- GAINERっていうのは、自作のユーザインターフェースを使って、コンピュータのプログラムを動かしたり、
- 逆にPCのプログラムから、自作のインターフェースを操作するためのものらしい。
- ハード的には、28pinDIPのMPUと、USB-SerialブリッジICが乗ってるだけで単純だけど、
- MPUのPSoCは決して高速のMPUではないけど、アナログ要素を持ってるし、内部配線をいろいろ弄れるので、外付け部品をかなり節約出来たりする。
- ライブラリも豊富なので、実験的なものを作るにも向いている。
- それにUSB-Serialブリッジを使ったのは良いと思う。
- USBをちゃんと使おうとすると、プログラムが難しくなっちゃうけど、Serialインターフェースならばとりあえず簡単に使える。
- USBインターフェースのあるPSoCもあるけど、アナログ関係の回路が貧弱になってしまうし。。
- ハードを単純化して、使う開発環境の方をいろいろ用意して、誰でも使えるようにっていうコンセプトなんじゃないかな〜と思う。
- 開発環境を用意してくれてるっていうのは、やっぱりとても有難い。
- さらに調べてみると、今はGainerって別にPSoCに限らず、PICとかAVRとかが使ったものもあるようだ1。
- まぁ自分の場合は、今のところ開発環境が揃ってるのはPSoCなので、それで行こう!
1アナログ回路は結構違うので、完全互換じゃないのかもしれないけど。
[top]
- GAINERのハードは、キットで安く売られており、小さくて良さそうなので、そのうちに買おうと思ってるけど、
- 公開されている回路図を見ると、とりあえず手持ち部品で作れそうなので、クローンを作ってみる。
- と言っても、ブレッドボードに秋月のFT232RLのモジュールとCY8C29466を乗せて配線するだけだ。
- 配線キットの線材を切ったり曲げたりしなくて良い様にしたので、ちょっと窮屈になってしまってるけど。
- でも、最低限の配線で済ますことが出来たと思う。
- まぁ毎回配線するのは面倒だし、そもそもPSoCの開発環境が無いと出来ないので、素直にキットを買ったほうが簡単だけどね。
- 実際のGainerには、過電流防止用のヒューズが入ってるみたいだけど、秋月の232RLモジュールには入ってない様なので、配線間違いは注意が必要。
- PSoCに、Gainerのファームウェアを書き込む。
- 今回作ったクローンには、ICSP用のヘッダピンを立ててあるので、PSoC MiniProgですぐに書き込みが出来る。
- まず、Gainerの ファームウェアをダウンロードする。
- 解凍すると、gainer.hexというファイルが1個あるだけだ。
- PSoC Programmerを起動して、gainer.hexを書き込む。
- USB-Serialブリッジは、PC側からみてCOMポートに見えるようにドライバを入れる必要がある。
- ドライバを ダウンロードして、圧縮ファイルを解凍するとドライバのフォルダが出来る。
- GAINERを、USBケーブルでPCに接続する。→接続した瞬間、緑色のLEDがチラっと点灯して、すぐに消える
- 新しいハードウェアの検出ウィザードが開くので、自動インストールじゃなくて、ドライバのフォルダを指定する。
- 次へのボタンを押すと、インストールを開始する。→時間が掛かるので数分待つ。
- ドライバのインストールを完了すると、もう一回ドライバのインストールをやらされるみたいなので、
- ドライバインストールが終わると、緑色のLEDが点灯した状態になる。
- シリアルポートから、コントロール出来るかどうかテスト。
- とりあえず、HyperTerminalでボーレートを38400bps、フロー制御をなしに設定。
- これで、*をキー入力すると、バージョン番号が表示されるはずだが。。
[]*! →なんだこれ?
文字化けか。。。タクトスイッチを押しても何も表示されない。。。
- さて困った。プロンプトらしい?マークも表示されないしなぁ。
- USB-SerialモジュールのRxとTxを直結すると、ちゃんとキー入力が表示される。
- 文字キーを打った後に*を打つと、例えばA*とタイプすると以下のように[]内に文字が表示される。
[A]*!
ってことは、ボーレートも問題無いんだろうなぁ。何が悪いんだろう?
- もう一度手順を見直してみる。
- あれ、もしかするとこの?はプロンプトじゃなくてキー入力なのか。。
?* →ってキー入力すると、
?1.1.0b01* →ちゃんとバージョン番号が表示された!
- 手順にはちゃんと書いてあったのに、プロンプトがあるだろうという思い込みでした。。
- で、タクトスイッチに反応するのは、コンフィグレーションを変更した後なのか。。。
KONFIGURATION_1*
N*F*
- LEDのON/OFFは、以下のコマンドで出来ます。
h* →LED点灯
l* →LED消灯
[top]
- 自分の環境は、WindowsXPでProcessing1.0.1をインストール済み。
- チュートリアルを見ながら、Processing用のライブラリをインストール。
- それによると、 ここからダウンロード出来るということだが、v1.1.0rc5には、Processingのライブラリが含まれていないようだ。
- Pacageの下のgainerのリンクをクリックして、全バージョンを表示してみる。v1.1.0rc4には、Processingが含まれているようだ。
- ダウンロードして、解凍したものを指示に従って、Processingのインストールディレクトリにコピーする。
- 結局のところ、example,lib,libraries,referenceのディレクトリをそのまま上書きすれば良いみたいだ。
- 一応、MyDocumentのProcessingにも、exampleを入れておく。
- チュートリアルで説明されているbuttonというプログラムが無いので、代わりにbuttonFunctionというのを動かしてみる。
- すると、ClassNotFoundExceptionエラーになってしまって実行できない。
- LEDプログラムも同様。
- これによると、ProcessingのバージョンアップでGainerに付属のライブラリと整合がとれていないことがあるらしい。
- これで、エラーは出なくなった。
- でもLEDは画面上のボタンクリックでLEDが点灯するが、
- buttonFunctionはタクトスイッチに反応してくれない。
- Processingのインストールディレクトリに上書きして実行すると、やはりClassNotFoundExceptionエラー。
- LEDプログラムを実行すると、画面上に小さなWindowが出て、それがボタンになっている。
- buttonプログラムを実行すると、やはり画面上に小さなWindowが出るが、それが表示器になっている。
- Windowは最初は黒いが、Gainerのタクトスイッチを押すと白くなる。離すと黒に戻る。
- buttonFunctionはbuttonプログラムと同様に、タクトスイッチを押すとWindowが赤く、離すと青くなる。
- buttonプログラムと違って、ボタンが押された時のイベント処理(gainerButtonEvent)で動いている。
- とりあえず、Processing→Gainerの基本的な動作確認はOK!
[top]
- デフォルトでは、GAINERの入出力は以下のように設定されているらしい。
- デジタル出力×4ポート →20,16,17,18pin
- アナログ出力×4ポート →8,7,6,5pin
- デジタル入力×4ポート →24,25,26,27pin
- アナログ入力×4ポート →4,3,2,1pin
- なるほど。とりあえず役目を固定させて理解しやすくしてるワケか。
- とりあえず、ProcessingのGainerデモを試してみよう!
- デジタル出力の確認のために、以下のようにデジタル出力に4個のLEDを接続してみる。
- 同じブレッドボード上に配線することも出来そうだが、ゴチャゴチャになっちゃうので別のブレッドボードで配線する。
digitalOut
- Processingのデモから、digitalOutを選んで実行してみる。
- 1,2,3,4,q,w,e,rのキー入力で、デジタルポートにいろいろ出力するプログラムだ。
import processing.gainer.*;
PFont myFont;
Gainer gainer;
void setup(){ // 初期設定
size(400,200);
myFont = loadFont("CourierNewPSMT-24.vlw");
textFont(myFont, 24);
gainer = new Gainer(this);
}
void draw(){ // ウィンドウ表示
background(0);
text("Please press key ",20,20);
text(" '1' and 'q' ",20,60);
text(" '2' and 'w' ",20,100);
text(" '3' and 'e' ",20,140);
text(" '4' and 'r' ",20,180);
}
void mousePressed() // マウスクリック時処理
{
//this is fast
if(mouseButton==LEFT)
gainer.digitalOutput(0x00); // デジタルポートに00を出力
if(mouseButton==RIGHT)
gainer.digitalOutput(0xff); // デジタルポートにFFを出力
}
void keyPressed() // キー入力時処理
{
if(key == '1'){
gainer.setHigh(1); // デジタルポート1のみHighに
}
if(key == 'q'){
gainer.setLow(1); // デジタルポート1のみLowに
}
if(key == '2'){
//this is late
gainer.setHigh(0); // デジタルポート0〜3をHighに
gainer.setHigh(1);
gainer.setHigh(2);
gainer.setHigh(3);
}
if(key == 'w'){
//this is late
gainer.setLow(0); // デジタルポート0〜3をLowに
gainer.setLow(1);
gainer.setLow(2);
gainer.setLow(3);
}
if(key == '3'){
//this is faster than setHigh(int) and setLow(int)
boolean b[] = {true,false,true,false};
gainer.digitalOutput(b); // デジタルポート0,2をHigh、1,3をLow
}
if(key == 'e'){
//this is faster than setHigh(int) and setLow(int)
boolean b[] = {false,true,false,true};
gainer.digitalOutput(b); // デジタルポート0,2をLow、1,3をHigh
}
if(key == '4'){
//this is faster than setHigh(int) and setLow(int)
int p[] = {0,1,3}; // デジタルポート0,1,3をHigh(2はLow)
gainer.setHigh(p);
}
if(key == 'r'){
//this is faster than setHigh(int) and setLow(int)
int p[] = {0,1,3}; // デジタルポート0,1,3をLow(2はHigh)
gainer.setLow(p);
}
}
- いろんなやり方でデジタルポート出力しているが、説明が要らない程、分かりやすいプログラムだ。
- setup →初期設定
- draw →アップデートイベントのようなものか。つまりウィンドウの表示が必要なとき実行2される
- mousePressed →マウスがクリックされた時に実行される
- keyPressed →キーが押された時に実行される
- これだけで、デジタル出力プログラムを書けるのは、すばらしい!
digitalOut2
- このプログラムを実行すると、
- それでリリースノートみたいな ページ(C:\Program Files\processing-1.0.1\reference\changes.html)が開く。
- うーん。とにかくframerateは、frameRateという名前に変更になったってことか。。
- で、直したら動いた。ふーん。文法が変わったのを教えてくれるのは、かなり親切だなぁ。
- このプログラムは、frameRate()で指定されたインターバルで、drawが実行されるらしい。
- タクトスイッチを押す度に、表示されるパターンがちょっとだけ変わる。
- Gainerのアナログ出力は各ポートに、PWMで0〜255までの256段階の出力が可能。
analogOut
- このプログラムは、Window上のマウスカーソル位置によって、LEDの明るさが変わるようになっている。
- 簡単だけど、マウスの動きでLEDの明るさが変わるのは、結構おもしろい!
analogOut2
- 実行してみて分かったが、ナイトライダー風(但し、片側方向のみの動き)のLED表示のためのプログラムのようだ。
- このプログラムでは、frameRateの指定は無いが、drawが連続して呼ばれているようだ。
- つまり、drawっていうのはアップデートイベントというより、idleイベントに近いと思われる。
- Gainerのアナログ入力は、4ポートの256階調のA/D変換。
→これはもう直してあります。。。
- これ以前にやったことがあったので、それを見ながらやれば簡単だと思ったんだけど、全然動かない。
- うーん。困った。。と思っていたら、週刊アスキーでなんとGainerの特集。
- それもGセンサ使ってる。。何かマネしたみたいに思われちゃうなぁ3
- その接続をみると、2番ピンをVDDに繋いでいる。以前にやった時の写真を再確認すると、確かにそうなってる。
AGND
- アナログ2入力分の数値表示と、値によって画面上に点を打つようになっている。
- アナログ入力0、1に、GセンサのZ軸、Y軸が接続されているので、動かすと数値が変わって、グラフの様に線が引かれるのが分かる。
analogInput_peek
- アナログ4入力分のデータ表示をする。
- これ、全然値が動かないので何故かな〜と思ったら、gainer.beginAnalogInput();が記述されていない。
analogInput_seq
- これはアナログ4入力分のデータ表示をするのは、analogInput_peekと同じ。
- マウスクリックした時に、値を固定してLEDが光るようになっている。
2あとから気が付いたけど、これは連続的に実行されるルーチンらしい。
3っていっても、うだうだ日記の影響でProcessingをやったんだからマネなんだけど。。
[top]
- Gainerって、結構実用的かも。
- 結局PSoCで普通に作るのと同じなんだけど、設定を固定してあるので、
- PCのアプリケーションの作成に集中出来るから、楽ちんだ。
- しかし週刊アスキーで紹介されたのは、ビックリした。
- Processingは、予想以上に面白そうだ。
- PCのアプリケーションで、こんなに簡単にインターフェース出来る環境は初めてだ。
- 今回はGainerのお試しだったので、Processingの能力を生かしてないけど、
- インタラクティグな機能を非常に簡潔に記述できそうだ。これから色々と試してみたい。
[top]
[電子工作関連に戻る]