実験・実技に役立つプログラミング (Version 0.6)
講習の内容は、 パーソナルコンピュータで扱うことが容易な IOモジュールとよばれる 入出力装置を用いて、
途中で、小テストとして実習課題を設定しています。 要求されたプログラム作成を終えたところで、教員の確認を受けてください。 確認シート
この講習で行うことは、センサーからデータを読み取り、 それを処理するまでの道筋を説明します。実際に、教材を取り出しながら作業を進めていきます。
このセクションでは、Gainerに関する説明を行います。
Gainerはコンピュータへ外部の情報を取り込んだり、 外部の機器を操作するための信号を出すための装置です。 これを一般的な呼称としてIOモジュールと呼ぶこともあります。 Gainerは1万円前後の予算で一つのセットを購入することができます。 また、インターネット上の http://gainer.cc/ にアクセスすることにより、Gainerに関する様々な情報が得られます。
今回の授業では、Apple社のMacintoshというコンピュータでで使用しますが、 一般で利用されるWindowsPCでもほぼ同様の使い方が出来ます。
早速、手元の教材を確認します。
今回利用するのは、 Gainer-miniと呼ばれるモジュールです。 28個の電極があり、ここにモジュールの電源やセンサーを接続します。
パーソナルコンピュータにはUSBのソケットがあります。メモリやキーボードなどを接続するために使われますが、このソケットを用いてGainerとコンピュータ本体を接続します。
この実習で用いるコンピュータではディスプレイの右側の裏にUSBのソケットが複数ありますから、そのうちの一つにこのケーブルのコネクタを接続し、もう一方のコネクタをGainer-miniに接続します。接続したら、Gainer上のランプが点滅を始めます。
次に行う作業に伴い、知っておくべき事柄について解説を行います。
抵抗という電子部品があります。見かけの形は同じですが、 個々の部品ごとに抵抗値をもっていて、一つ一つが異なるものだと考えてください。
その値は数字で記入するのではなく、色で表示がなされています。 4本の縞があって色がついているものです。 それらの4つの色を見分けることにより抵抗値が区別できるようになっています。 たとえば、以下の抵抗値の読み方のページで紹介されています。
抵抗には向きはなく、リード線の一方と他方を区別無く利用できます。
そのほかにも、教材の中には、トランジスタや発光ダイオード、ダイオードといった電子部品がはいっています。これらの中にはさまざまな素子がリード線に接続されるように組み込まれています。リード線の順番には決まりがあり、それぞれの向きがあります。 接続時には資料を良く見て向きを間違えないようにしてください。
皆さんの手元にある、センサ、LEDなどを確認してください。 本日の実習は、これらを用います。 (この番号は、+GAINERという書籍のセクションに対応しているため、) 番号は連続していません。 箱から取り出して、一つ一つどのようなものがあるかを確認しておいてください。 (確認のための用紙を配布します。)
お願い。パーツ類は、大学での教育で使用します。 使用後は、もとの袋に戻していただくようにお願いします。
CDSセルというセンサです。カメラの露出計のセンサとして長い間使われてきました。
センサの前に物体をおいて、そのセンサまで何センチぐらいあるのかということが検出できるというセンサです。光学的な原理をもちいて、物体に照射した反射光により距離を測定します。80センチぐらいまでの距離が測れます。
圧電スピーカが入っています。スピーカですがマイクロフォンの一種として使われていると考えればよいと思います。振動により電位が発生することを利用して振動の測定を行います。
実際には、色ではなくて、白黒の判定をするものです。赤外光を発して、前においたものからどれくらい反射光が返るかを測定することにより、置かれたものが黒いのか白いのかを判断します。
赤外線センサです。トイレで人が居なくなると水が流れますが、 そのための検地装置としても利用されているようなものです。 人間が赤外線を発していることを利用しています。 前に赤外線の光源があっても、同じところにじっとしていると反応しなくなります。
WIIリモコンのように、加速度を検知することができます。 重力も加速度なので、センサの傾きも調べることが可能です。
白色のLED(発光ダイオード)です。電球代わりに使います。 かけた電圧と流れる電流の関係は、 電球のようにオームの法則に従うものではありません。
三原色のLEDが一つのパッケージに入ったものです。
7つの細長いLEDと、一つの点状のLEDが8の次と小数点の形状に配置されています。 数などを表示する装置として使用します。
携帯電話のマナーモードで利用するのがこれです。じつのところは、モータにバランスの偏った錘がついているものです。Gainerが制御できる電力は大きくないので、トランジスタを用いて電流の制御をします。
これらのセンサを用いるとどのようなことができるのでしょうか?
部品の点検が終わったところで、 Gainerをコンピュータに接続してみます。
Processingでプログラムをすることにより、 Gainerを制御することができます。 まず、USBケーブルによってコンピュータとGainerを接続してみてください。 (ここでは、ブレッドボードは使いません。) Gainerの基板上でLEDがゆっくり、点滅しているのがわかります。
ブレッドボードというのは、+GAINERの35ページに記述がありますが、 電子部品を差し込むことによって回路を構成することができる実験装置のようなものです。いったん、USBケーブルをはずして、Gainerをブレッドボードに接続してみましょう。 Gainerチュートリアルというパーツ袋があります。 以下では、パーソナルコンピュータから供給される電源を用いて動作する簡単な回路を構成してみます。
この作業の中では、ブレッドボードに電子部品を接続すると どの部品とどの部品が接続されることになるのかということに 注意してください。不用意に接続するとコンピュータ本体が壊れます。
作業にあたっては、 資料の30ページからの記述を参考にして、 ブレッドボード上で回路を構成してください。
教員の指導に従いながら、最初の回路を組みます。
課題: ブレッドボード上に、タクトスイッチとLEDを接続し、 タクトスイッチでLEDの点滅を制御できることを確認しなさい。 (ここでは、Processingのプログラミングは必要とはしません。)
原理に関する話 です。 興味があるかたはお読みください。
Processingでプログラムをすることにより、 Gainerを制御することができます。 さっそく試してみましょう。
まず、USBケーブルによってコンピュータとGainerが接続された状態になっていることを確かめてください。 Gainerの基板がブレッドボードについていても、ついていなくてもかまいません。
このあとは、Gainerに(コンピュータ以外)何も接続せず、Gainerの基板上にあるLEDを点滅させるプログラムを動作させてみましょう。
ちょっと面倒なのですが、以下のような操作が必要です。 ファインダを開くと書類というアイコンがあります。 この書類の下にあるフォルダを順に、Processing、Libraries、Gainer、examples、gainer-examples、LED、の順に追っていきます。 ここで、LED.pdeというアイコンをクリックしてください。 すると、Processingを使うためのシステムが立ち上がります。
このプログラムが正常に動くと、画面に出ている四角い領域で、マウスボタンを押している間だけ、Gainer上のLEDが発光するという動作をします。
電源の部分をショートさせるとコンピュータの本体が壊れる可能性があります。 とくに、ブレッドボードを使った作業においては以下のことに注意してください。
ブレッドボードを用いて回路を構成し、 Gainerを実際に用いたプログラミングを行います。センサからの入力を中心に学びます。 これらの情報は、http://gainer.cc/Tutorial/HowToUseGainerWithProcessingなどに記載されています。(このサイトの情報については、まだ、記述が十分でないところもあるようです。)
import processing.gainer.*; Gainer gainer; PFont myFont; void setup() { size(300, 255); myFont = loadFont("CourierNewPSMT-24.vlw"); textFont(myFont, 24); gainer = new Gainer(this); gainer.beginAnalogInput(); } void draw() { background(0); text("analogInput[0]: " +gainer.analogInput[0],10,80); text("analogInput[1]: " +gainer.analogInput[1],10,110); text("analogInput[2]: " +gainer.analogInput[2],10,140); text("analogInput[3]: " +gainer.analogInput[3],10,170); } |
注目すべきところは、 gainer.analogInput[0], gainer.analogInput[1], gainer.analogInput[2], gainer.analogInput[3] という配列の値に、それぞれの電極に加えられた電圧に対応する値が得られることです。
http://gainer.cc/Tutorial/HowToUseGainerWithProcessing?p=7 を参照すると、入力(や次に学ぶ出力に関しても)するために用いることのできる、変数やメソッドについて知ることが出来ます。
課題:センサを一つ選び、センサからの入力を(時系列にそって)変化がわかるように視覚化するプログラムをつくりなさい。どのような表示にするのかという画面の設計も各自でおこなってください。
ヒントとしては、グラフを書く、色を変化させるなどの視覚化の手法が使えます。(グラフなどを書くには、一日目、二日目の資料が参考になります。)配布の資料である+GAINERにもいくつかサンプルプログラムがありますが、多くはProcessingではなく、ActionScriptという別の言語が使われているので、間違えないようにしてください。
Gainerを使って外界をコントロールすることを学びます。入出力の出力にあたる部分です。 以下のプログラムはanalogOutput.pdeの内容そのものです。(当然、このプログラムを再度入力する必要はありません。)
このプログラムの結果を見るためには、「10. フルカラーLEDを光らせる」で行われている接続を行います。
/* anaglogOutput */ import processing.gainer.*; Gainer gainer; void setup(){ size(250,250); gainer = new Gainer(this); stroke(255); } void draw(){ background(0); line(0,height/2,width,height/2); line(width/2,0,width/2,height); } void mouseMoved() { float rx = (float)mouseX / width; float ry = (float)mouseY / height; int v0 = int(255*ry); int v1 = int(255*rx); gainer.analogOutput(0,v0); gainer.analogOutput(1,v1); } void mouseDragged() { float rx = (float)mouseX / width; float ry = (float)mouseY / height; int v0 = int(255*ry); int v1 = int(255*rx); int values[] = {v0,v1,v0,v1}; gainer.analogOutput(values); } |
課題: マウスボタンの押し下げを行うと、 LEDが光る回路とプログラムを作成しなさい。
課題: タクトスイッチの押し下げを行うと、 LEDが光る回路とプログラムを作成しなさい。 使用するメソッドについては、これまで与えた情報から各自が調べること。
課題: センサーからの入力にしたがって、 フルカラーLEDの色を変化させるプログラムを作成しなさい。 「使用するセンサー」と「色へのマッピング」は、各自で対応を決めてください。
Gainerも使い慣れると、大きな装置をON/OFFしたりしたくなります。 ところが、Gainerでコントロールできるものは、 10ミリアンペアから25ミリアンペアのごく小電流で動くものに限られます。 そのときは、トランジスタで増幅することにより、 より大きな電流で動作する装置を制御します。
「14. 振動モーターを動かす」のところにあるモータの代わりに、 リレーという電磁式のスイッチを接続したりします。
自由課題として、 理科や美術、体育など、中学、高校の教材を想定したシステムを作ります。 最初の発想を得ること自体が、人によって案外難しいことなので、 以下の例から課題を選んでいただいてもかまいません。
あらかじめ複数の絵が用意するものとして、手のセンサからの距離によって選択される絵が変わる。(この絵は各自が書き換えても良い。)
加速度センサーの3軸から得られる値はx,y,z軸方向のベクトルの成分である。 このベクトルの大きさが一定になるかるかどうか調べる。
加速度センサから得られる傾きを赤、緑、青の三原色に対応させて、 色を変えるプログラムの作成。
距離センサを用いて、腕立て伏せカウンタを作成する。 設定されたある一定以下の値が採れるまで、カウントアップがなされないのを特徴とする。
フォトリフレクタを用いて、振り子の周期を測定する。 振り子の振幅を変えても 周期が変わらないことを理解する。 振り子の通過がうまくキャッチできるかが鍵。 測定した周期を刻々とグラフ化するといった高機能化が図れる。
最後に、本日使用したセットを、もう一度整理用の紙のうえにおきます。 もともとあった部品がそのまま存在するかどうかを確認したのち、 しまいます。破損などで、足りなくなった部品は必ず、 補充をしなければならないので丁寧な管理を行うことにしています。
参考書