もう一ヶ月ぐらいたってしまいましたが、2008/11/18に、社内で「フィジカルコンピューティング勉強会」をやりました!
Make:TOKYOで小林茂さんのはじめてのArduinoワークショップに参加して非常に楽しかったことと、会場内の作品の中でArduinoを使ったものが多かったことを話していたら、興味を持つ人が多かったので、Arduinoの紹介と簡単なデモを行うことになりました。
チームラボには、そもそもマイコンに関わり合いのないエンジニアが多くいますし、大学や趣味などで組み込み・IC制御などをしていたエンジニアからも、「最近流行らしいので、一回Arduinoの現物を見てみたい」との声が上がり、10人ほどのメンバーが集まりました。
まずは、勉強会のタイトルになっているフィジカルコンピューティングという概念の説明を、IAMASの資料(Apple Store Ginzaのプレゼン)や最近PDFが公開されたMAKEのArduino記事を使って行いました。PDFへのリンク(6ページ、約1.9MB)
「マウス・キーボード・モニター以外のインターフェースでコンピュータと対話しよう」という話の後に、Arduinoの現物と、開発環境のデモをしました。
今日のデモは2つ。
- パソコン上からマイコンを制御する。
パソコン上のArduino IDEをつかってプログラミング(サンプルソースのLED制御)を行い、ArduinoのLEDを光らせる - マイコン上に接続したスイッチから、パソコンを制御する
Arduinoにスイッチ(可変抵抗器)を接続し、パソコンのProcessingを使って書いた
サンプルソース(Arduinoのサンプルソースの、コメントを和訳したもの)を焼き込んで、LEDが光る様子をデモ。
/*
* LEDをチカチカさせてみる
* 最初のArduinoトライアルとして、基盤に載っているLEDをチカチカさせてみましょう。
* 基板上のLEDは13番PINなので、13番にLEDを指してもピカピカします。
* 1秒ごとに、点灯/消灯が切り替わります。
* 基盤上の部品だけで試せるので、Arduino以外何もいりません。
*
* http://www.arduino.cc/en/Tutorial/Blink
*/int ledPin = 13; // 13ピンのLEDとして、ledPinという変数を作ります。
void setup() // 初期化をします。
{
pinMode(ledPin, OUTPUT); // 13番のデジタル出力を設定します。
}void loop() // 以下の処理をループします。
{
digitalWrite(ledPin, HIGH); // ledPinをONにします。
delay(1000); // 1秒(1000ミリ秒)待ちます。
digitalWrite(ledPin, LOW); // ledPinをOFFにします。
delay(1000); // 1秒待ちます。
}
開発環境のインストールやフラッシュROMの焼き込みが簡単で、短いソースでいきなりマイコンからLEDを制御できることに、大学などでマイコンに触れていたエンジニアも驚いていました。
その後、可変抵抗器(ボリューム)を使って、アナログの入力をPCに伝える、というデモをやりました。
arduinoと可変抵抗器を、ジャンプワイヤを使って接続し、arduino IDEを使って、arduinoにボリュームからの情報をシリアル入力として受け付け、コンピュータに伝えるプログラムを書きます。
int val; //読み取り値の変数を用意
void setup(){
Serial.begin(9600);
}void loop(){
//アナログ入力0番ピンの値を読み取り(0~1023)
//4で割った値を変数valに入れる(0~255)
val=analogRead(0)/4;
//シリアルでvalを送信(BYTEフォーマット)
Serial.print(val,BYTE);
//1秒間に20回ループ(0.05sec)とする
delay(50);
}
arduino IDEを閉じて(立ち上げっぱなしだと、シリアル入力をIDEで受け取りっぱなしになってしまう)
次に、描画、グラフなどに優れた開発言語のProcessingを使って、IAMASのサイトにあるランダムに円を描くプログラムを改変して、ボリュームをひねると円の大きさが変わるプログラムをパソコン上で立ち上げました。
//シリアルライブラリを取り入れる
import processing.serial.*;
//myPort(任意名)というオブジェクトを用意
Serial myPort;int x; //図形のX座標の変数を用意
void setup(){
//画面サイズ
size(400, 400);
smooth();
fill(128);
stroke(32);
//シリアルポートの設定
myPort=new Serial(this,”COM5″,9600);
}//繰り返しランダムな場所に円を描く
void draw() {
float posX = random(0, 400);
float posY = random(0, 400);
float ellipseSize = random(x, 40);
ellipse(posX, posY, ellipseSize, ellipseSize);
}
void serialEvent(Serial p){
//変数xにシリアル通信で読み込んだ値を代入
x=myPort.read();
}
無事に、確認できました!
講師の自分含め、マイコンや電子機器には初めて触るメンバーばか