小林です
先日の010に関するディスカッションにも関連するのですが、フィジカルなUIを扱うためのクラスを試験的にAS3ライブラリに追加してみました。
IAMAS内で行うAS3のワークショップ用のサンプルを用意していた時、イディオム的に出てくるフィルタの使い方などを隠蔽してもうちょっと抽象度をあげられないかな、というところから作ってみました。
※Arduino用のHardware Abstraction
Libraries(http://www.arduino.cc/playground/Code/HardwareAbstraction)をある程度参考にしています。
いずれもシンプルなものですが、ボタンやLEDといったものをもう少し高いレベルで扱えるようにしているつもりです。また、GainerでもArduinoでも同じように扱えます。
http://code.google.com/p/funnel/source/browse/#svn/trunk/libraries/actionscript3/src/funnel/ui
加速度センサも、「適切にスケーリングしてsinθの値を求めてそこから逆サインでさらにラジアンから度に変換」といった一連の処理を内部的に行うようにしたAccelerometerクラスを用意してみました。以下はButtonとLEDの使用例です。
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import funnel.*;
import funnel.ui.*;
public class ArduinoTest extends Sprite {
private var aio:Arduino;
public function ArduinoTest() {
var config:Configuration = Arduino.FIRMATA;
config.setDigitalPinMode(12, IN);
config.setDigitalPinMode(13, OUT);
aio = new Arduino(config);
// 必要であればここでソース/シンクも指定する(デフォルトはソース)
var led:LED = new LED(aio.digitalPin(13), LED.SOURCE_DRIVE);
// 必要であればここでプルアップ/ダウンも指定する(デフォルトはプルダウン)
var button:Button = new Button(aio.digitalPin(12), Button.PULL_DOWN);
// ボタンが押されたとき
button.addEventListener(ButtonEvent.PRESS, function(e:Event):void {
// LEDを間隔200msで2回点滅
led.blink(200, 2);
});
// ボタンが長押しされたとき
button.addEventListener(ButtonEvent.LONG_PRESS, function(e:Event):void {
// LEDの値を1000msかけて1にセット
led.fadeTo(1, 1000);
});
}
}
この後はHブリッジなどの基本的な入出力をいくつか用意しようかなと思っておりますが
・こういうのも必要なのでは
・そもそもそんなものは必要ないのでは
など、もしご意見などあればお気軽に聞かせていただけたらと思います。:)
> たまによくわかりそうな人が来ていて余裕がありそうなときは接続を
> GNDにしてみたら、VCCにしてみたらというように(ソース、シンクの
> 言葉は使わないにしても)やってみることがあります。が、まったくの
> 初心者にこの辺のことを含めてやるには、すごく時間がかかってしまいます。
> 実際には、このへんのことをやるにはどの程度の時間がかかるものなのでしょう?
参加者の人数にもよると思いますが、説明する、しないで簡単にやっても30分くらいは変わるかなと思います。いきなり知識を詰め込みすぎるのも問題だと思いますので、余裕のある人があとから調べられるようなキーワードが補足として資料などにあるといいのかなと思います。
このあたり、どこまでが基礎知識として知っておいてもらいたいと考えるかにもよりますよね。昔のワークショップ(週に2回で1月くらいかけていた時)ではこの辺りも全部盛り込んでいましたが、確かに時間のない時には省略してしまうことも多いです。とはいえ、例えばフルカラーLEDを説明しようとすると、アノードコモンとかカソードコモンに触れる必要が出てきますので、どこかのタイミングでは説明すべき内容かなとは思います。
> 主要なインタラクションのプロパティは変数に定義済み
> ハンドラも定義済み
> 変数と関数である程度のことができるという点です。
> このあたりをProcessingのすぐエントリーできる特徴と考えると
> オブジェクトを使う時点でもはやエントリーのしやすさは考えなくても
> よいのかもと思ってしまっています。
> ので、きっちりUIクラスも実装したいと思います。
AS3を使ったワークショップの場合、既にFlashやFlex
Builderでの経験があることを前提にしてしまう場合が多いのですが、Processingを使う場合には、そもそもProcessingが初めてだったり、プログラミングも初めて、という場合が多いですよね。
自分の場合には、JavaでのHello
Worldのように、いきなりクラスとかを書かなければならないのではなく、println()だけ書けば昔のBasic感覚で使えるのがかなり印象的でした。そうした意味で「これはおまじないですのでとりあえずこう書いてください」という説明をしなくてはならない場面が少ないのがProcessingのいいところだと思っています。
オブジェクトを扱うのは確かに一つの大きなハードルで、それを説明しないでいきなりドットシンタックスが登場するのをどう説明するのか?、という点が大きな分かれ道になると思います。
このあたり、実世界の例えを持ち込んで説明しようとする教科書が多いのですが、それはかえって理解を妨げている気がします。例えばですが、全て関数で書く方法で説明し、ある程度の規模のものを扱うにはこれでは不便だと実感してもらった上でクラスを説明する、という方法が(OOPが登場した背景を考えても)自然でいいのかなと思っています。とはいえ、うまく誘導するのは難しいのですが...。
※遠藤さんがすすめていらっしゃる「全て関数ベースで」というのは、おまじない無しで説明するというところを徹底する上で重要なアプローチだと思っています。「そんな段階はすぐにクリアできるじゃん」と思ってしまうと意義がそれほど感じられないかもしれませんが、実際のところ配列や関数でつまずく初心者はかなり多いと思いますので...。
> Funnelは初心者向けなのか?というと、僕は「違う」とこたえたいのですが、
> そのへんどうなんでしょうか?
「初心者に使えないか」といわれるとそんなことはないと思います。がしかし、エントリーしやすくするための仕組みは整えつつも、狙っているのはそこから先の実践的にプロトタイピングしていくエリアかなと思っています。
2009/5/20 takanori endo <sweeta...@gmail.com>: