Arduino / Processing Topics

※HTML5対応ブラウザでの閲覧推奨(あなたのブラウザは非対応です)

Appendix

ソフトウェアのインストール

Arduino、Processingともに、”日本語名を含まない”ディレクトリであれば、どこにおいても構いません。

スケッチブック(プログラム保存先)のフォルダ構成

標準設定(マイドキュメント内)の場合の例

マイドキュメント
├─Arduino
│ └─フォルダ
│   └─フォルダ名と同名の.pdeファイル
│
└─Processing
  └─フォルダ
    ├─フォルダ名と同名の.pdeファイル
    ├─サブで読み込む.pdeファイル
    ├─sketch.properties
    └─data
      └─フォントデータ.vlwファイル

可変抵抗器

可変抵抗器は、抵抗の値を変化させるこのできる抵抗である。
これにより、出力される電圧を変化させることができる。
A/D変換器などを用いれば、可変抵抗器を(ダイヤル、レバー等で)変化させた量を測ることができる。

可変抵抗器の使用例

可変抵抗器の接続例

上図であれば、青(GND)と黄(可変抵抗器による分圧出力)間の電圧を測定することにより、可変抵抗器の変化量を知ることができる。
つまり、この黄をArduinoのアナログ入力端子に接続し、

  int x = analogRead(0);
      x = x - 512;

とすれば、中心(1024/2 = 512)からの変化量を知ることができる。
例えば、縦・横の2方向に対し可変抵抗器があるジョイスティックの場合、2つの電圧値から、ジョイスティックの傾き方向・傾き量が分かる。

LEDのダイナミック点灯

用いるLED1つ1つをマイコンと接続し、on/offの制御をする場合、LEDの数が多いと、マイコンのピン数が足りなくなる場合がある。
このような場合、全てを1度に制御するのではなく、部分ごとに制御するのがダイナミック点灯である。
部分ごとに点灯・消灯させ、それを早いスピードで行なうため、複数のLEDが点灯しているように見える。

LEDのダイナミック点灯の例

LEDのダイナミック点灯例

上図(左)であれば、両端が5V・0Vに接続されているA・D・Eが光りそうであるが、LEDの極性より、A・Eのみが点灯する。
同様に、上図(右)であれば、Dのみが点灯する。

これを高速で繰り返せば、A・D・Eが同時に点灯しているように見える。
また、この回路では、1回でA・D・Eのみを点灯させるような電圧のかけ方はできない。
しかし、このようなダイナミック点灯を用いることで、同時にA・D・Eのみが点灯しているように見せることができる。

さらに、この回路では、LED6個に対し、電圧制御が5ヵ所で済むという利点もある。

参考 - 3×3×3 LED cube

1:27あたりから、ダイナミック制御に関する解説があります。
自分が作成した動画ではありませんが、参考程度にどうぞ。

LED CUBE 設計プログラム

数多くのパターンを作成する際、手間がかからないよう、Web上で動作するプログラム(JavaScript)を作成したので、参考にしてみてください。

シリアル通信(Arduino/Processing)

シリアル通信とは、1bitずつ送受信を行なう通信のこと。
逆に、複数bitを同時に送受信する通信を、パラレル通信という。
シリアル通信は1bitずつ通信を行なうため、伝送線路が1本(送信・受信で1本ずつ)で済むという利点がある。
今回は、シリアル通信=Arduinoで主に用いられるRS-232Cによる通信を指す。

シリアル通信 for Arduino

通信の設定

利用するポートの通信速度(ボーレート:boudrate[bps])を設定する。

通信速度は、通信する2つの機器で同じ速度に設定する。
よく用いられる速度として、「4800,9600,14400,19200,28800,38400,57600,115200」などがある。
※Arduinoでは9600が標準になっているので、これを用いるのが無難
以上から、ポートの設定は以下のように行なう。

void setup(){
  Serial.begin(9600);
}

受信

データの読込をArduino(マイコン)に命令したとしても、相手側が送信していなければデータはありません。
なので、

データの受信を確認
        ↓
データがあれば読込

という手順をとる必要があります。

int x;
if(Serial.available() > 0){  //受信データありなら実行
  x = Serial.read();     //受信データ読込
}

送信

送信するデータの形式により、命令を使い分ける必要があります。
これは、シリアル通信が1byte(=8bit)ずつ送信することによります。
また、数値のみを送信する"write()"命令と、複数のデータ形式を送信可能な"print()"を区別する必要があります。
1byteずつしか送れないため、数値を送信する場合は、0~255の範囲に収める必要があります。

// 命令例とそれぞれの出力値
  Serial.write(78);      //78
  Serial.write('N');     //78(ASCIIコード78=N)
  
  Serial.print(78);      //78
  Serial.print('N');     //'N'
  Serial.print("text");  //"text"

シリアル通信 for Processing

ライブラリの読込

Processingでシリアル通信を用いるには、ライブラリの読込が必要である。

// シリアル通信ライブラリ読込
  import processing.serial.*;
// インスタンスの生成
  Serial myPort;

通信の設定

利用するポート(ポート=シリアル通信を行なう信号の出入り口のこと)と、通信速度を設定する。

利用するポートの設定には、(PCのOSがWindowsの場合、)以下の2種類の方法がある。

myPort.list()[*];  //PCで利用中のポートの内、何番目を使用するか指定する("*"に番号を指定)
"COM1"             //利用するポート名を直接指定する

通信速度(ボーレート:boudrate[bps])は、通信する2つの機器で同じ速度に設定する。
よく用いられる速度として、「4800,9600,14400,19200,28800,38400,57600,115200」などがある。
※Arduinoでは9600が標準になっているので、これを用いるのが無難
以上から、ポートの設定は以下のように行なう。

  myPort = new Serial(this, [利用するポート] , 9600);

以下の解説は、シリアル通信を全て"myPort"で設定したものとして説明する。

受信

データの読込をArduino(マイコン)に命令したとしても、相手側が送信していなければデータはありません。
なので、

データの受信を確認
        ↓
データがあれば読込

という手順をとる必要があります。

int x;
if(myPort.available() > 0){  //受信データありなら実行
  x = myPort.read();     //受信データ読込
}

送信

送信するデータの形式により、命令を使い分ける必要があります。
これは、シリアル通信が1byte(=8bit)ずつ送信することによります。
1byteずつしか送れないため、数値を送信する場合は、0~255の範囲に収める必要があります。

// 命令例とそれぞれの出力値
  myPort.write(78);      //78
  myPort.write('N');     //78(ASCIIコード78=N)

シリアル通信命令の注意

ArduinoとProcessingでは、送受信するデータの形式について区別する方法が異なります。

通信機器 データの区別
Arduino 送信時
Processing 受信時
// Arduinoの例とそれぞれの出力値

// 送信
  Serial.write(78);      //78
  Serial.write('N');     //78(ASCIIコード78=N)
  
  Serial.print(78);      //78
  Serial.print('N');     //'N'
  Serial.print("text");  //"text"

// 受信
  int x = Serial.read();
// Processingの例とそれぞれの出力値

// 送信
  myPort.write(78);      //78
  myPort.write('N');     //78(ASCIIコード78=N)
  // そもそも、シリアル通信に"print()"命令が存在しない

// 受信(送信側が(int)78を送信した場合)
  int a = myPort.read();        //78
  int b = myPort.readChar();    //'N'

シリアル通信の豆知識

シリアル通信機器の接続

シリアル通信機器の接続では、電源の他に、データの送信をするTxポート、データの受信をするRxポートを接続する必要がある。
この際、勘違いされやすいのが、お互いの通信機器のTx,Rxポート同士を接続するのではなく、互い違いに接続(クロス接続)するということである。
送信側、受信側を理解して接続することが重要である。
また、お互いの通信速度(ボーレート:boudrate[bps])を揃えることも重要である。

通信機器A 通信方向 通信機器B
送信 Tx 受信 Rx
受信 Rx 送信 Tx

大きな値の送信

通常のシリアル通信では、1byte(=8bit)ずつデータの送信を行なう。
そのため、0~255の範囲でしかデータのやり取りができない。
255より大きい値を送信するためには、数値を小分けにして送信する必要がある。

例として、2byte(=16bit:0~65535)のデータを、1byteずつに分ける例を示す。

// 送信側
  int x = 1000;             //2進数表記:0000 0011 1110 1000
  int x_high = x >> 8;      //2進数表記:0000 0011
  int x_low  = x & 0x00FF;  //2進数表記:          1110 1000
  // x_high, x_low をそれぞれ送信
// 受信側
  // x_high, x_low をそれぞれ受信
  int x = (x_high << 8) + x_low;

このようにして小分けにしたデータを、それぞれ送信し、受信側でデータを読み取ることで、大きなデータを扱うことができる。
ただし、複数の値を(かつ順序が重要という場面において)送信する場合は、同期の状態に注意する必要がある。

非同期通信と同期通信

タイミング制御のない通信を「非同期通信」と言います。
逆に、タイミング制御のある通信を「同期通信」と言います。

※非同期通信も、実際は1byteの送信ごとに調歩同期をしていますが、細かいことはまた別の機会に…

通信時にクロック(タイミング制御)を伴わない非同期通信は、複数のデータを送信するときに、以下のようにデータの読取がずれることがあります。

送信 → ABABABABAB…
受信 →  BABABABABA… (?)
非同期シリアル通信の誤認識例

例えば人間でも、よそ見をしていたら話を聞き逃した、ということがあると思います。
マイコンで他の処理をしている間に受信したデータは、一旦バッファに保存されます。
しかし、この量にも限界があります。
これ以上のデータは、読込むことができません。

このような誤受信やデータの損失を防ぐことが必要になります。

Arduinoのシリアル通信概要
データ長 8bit
ストップビット 1bit
パリティ なし
フロー制御 なし
バッファサイズ 128byte

Arduinoは以上のような通信を行なう。
このため、以下のようなデータを扱う場合に、通信のタイミングを制御する必要がある。

  • 2種類以上のデータ
  • 0~255以外の値(データ長8bitを超える)

以下に、タイミングを制御した通信の一例を示す。

送信側 通信方向 受信側
受信データ(☆)をバッファに格納(一時保存) 受信準備ができたことを伝える
受信側の準備を確認
データを送信 受信データをバッファに格納
最初の受信データ(☆)を読込
(バッファクリア)
次回の通信まで待機
バッファ内の受信データが規定の個数になったら、順番に読込

このような通信を行ない、ArduinoからProcessingへ3つのデータを送信するスケッチ(プログラム)例を示す。

// Arduino(送信側)

int x, y, z;

void setup(){
  //シリアル通信の設定
  Serial.begin(9600);
}

void loop(){
  // アナログピンの値を読む(10bit:0~1023)
  x = analogRead(0);
  y = analogRead(1);
  z = analogRead(2);

  // 8bit(0~255)の範囲に直す
  x = x >> 2 ;  // x = x / 4 ;  と同じ意味
  y = y >> 2 ;
  z = z >> 2 ;
  
  // 合図用データがきたら送信
  if(Serial.available() > 0){
	//連続で通信し続けるとエラーの原因になるので、少しウェイトをかける
	delay(10);
	
	//データ送信
    Serial.write(x);
    Serial.write(y);
    Serial.write(z);
	
    // 合図用データ読込(バッファクリア)
    Serial.read();
/*  バッファクリアは、 Serial.flush(); でも行なうことができる。  */
  }
}
// Processing(受信側)

// シリアルライブラリ読込
import processing.serial.*;
Serial myPort;

int x, y, z;

void setup(){
  size(300,300);
  
  // シリアル通信の設定
  myPort = new Serial(this, myPort.list()[1], 9600);
  // ポートの設定は、適宜変更すること
}

void draw(){
  /* 描画処理を記述 */
}

// シリアル通信処理(受信時、割込み実行)
void serialEvent(Serial p){
  if(myPort.available() >= 3){
    x = myPort.read();
    y = myPort.read();
    z = myPort.read();
  }
}

// マウスクリックで通信開始
void mousePressed(){
  // 念のためバッファ領域を空にする
  myPort.clear();
  // 受信準備ができた合図用データを送信
  myPort.write(0);  //とりあえず0(特に意味はないです)
}

合図用データを具体的に「コレ」と決め送信する方が、さらに誤通信を防ぐことになります。
しかし、具体的に決めると、その値を送信データとすると、合図用データと勘違いする可能性があります。
このため、合図用データを送信データ範囲に含めることは望ましくありません。
データ長が8bitと少ないため、送信データ範囲を狭めることはしない方がよいと思いますので、今回は「適当なデータを1つ」送信することで合図としました。

複数の値を、「(xの値),(yの値),(zの値)」という文字列にして送信する方法もあります。
しかし、この方法では、送信されたデータは、ASCIIコードによる数値に変換されている(0 → 0x30 など)ため、ややこしいことになります。
また、データが多すぎると、バッファサイズを超えてしまいます。
後々、数値をASCIIコードにしても差し支えがなく、少ないデータのときのみの利用が好ましいでしょう。

ASCII(アスキー)コード

PCやマイコンで文字列が扱われる際、それぞれの文字列は数値に変換され処理が行なわれる。
その中でもよく用いられるのが、ASCII(American Standard Code for Information Interchange)である。
各国語ごとの文字に対応した文字コード規格が各国にあるので、扱う際には十分な注意が必要である。
(例)unicode(UTF-8)、Shift-JIS など

以下に、ASCIIコード表を示す。
なお、0x00~0x1F,0x7Fは制御文字、0x20は空白である。

ASCIIコード表
上位ビット
16進数0x0*0x1*0x2*0x3*0x4*0x5*0x6*0x7*
2進数000001010011100101110111
下位ビット0x*00000NLDESP0@Pp
0x*10001SHD1!1AQaq
0x*20010SXD22BRbr
0x*30011EXD3#3CScs
0x*40100ETD4$4DTdt
0x*50101EQNK%5EUeu
0x*60110AKSN&6FVfv
0x*70111BLEB7GWgw
0x*81000BSCN(8HXhx
0x*91001HTEM)9IYiy
0x*A1010LFSB*:JZjz
0x*B1011HMEC+;K[k{
0x*C1100CL,<L\l|
0x*D1101CR-=M]m}
0x*E1110SO.>N^n
0x*F1111SI/?O_oDL

ポート制御(Arduino)

Arduinoでは、

  digitalWrite( Dpin , value );
  digitalRead( Dpin );
  analogWrite( Dpin , value );
  analogRead( Apin );

といった命令により、各ピンの入出力を制御することができる。
しかしその実態は、各ポートを制御する命令を含んだ10行以上のコードからなり、コンパイルすると少なからぬ量のマシン語になる。
また、これらの命令では、同時に1つのピンしか操作できないという欠点がある。

AVRマイコンのポート・ビットレジスタ

Arduinoには、Atmel社AVRマイコンATmega328P(※機種によって異なる)が搭載されている。
元々、ArduinoはAVRマイコン向けC/C++言語を利用しているため、AVRマイコンのレジスタへ直接アクセスを行なうことができる。
これにより、同じプログラムを他のArduino(Atmel社製マイコン)で利用できなくなることや、デバッグが難しくなることが考えられる。
しかし、レジスタによるポート・ビット制御を行なうことで、次のような利点が挙げられる。

  • 高速な制御が可能
  • 複数ピンの同時制御が可能
  • 省メモリ化

以下に、各ポート・ビットのレジスタと、Arduinoとの対応を示す。

各レジスタの解説

各レジスタ解説と、それぞれに同じ意味を持つArduino Sletchとレジスタを利用したC言語による例を示す。
なお、動作はC言語によるプログラムの方が早い。(理由は前項参照)
※レジスタ解説の「*」には、ポート名のアルファベット1文字が入る。

DDR*

方向レジスタ。
入出力のモード値を格納する。

(例)digital pin 0~7をOUTPUTにする

// Arduino Sketch
  for(int i = 0 ; i < 8 ; i++)
    pinMode(i,OUTPUT);
// C/C++ source
  DDRD = B11111111;

PORT*

データレジスタ。
出力値を格納する。

(例)digital pin 0~7をHIGHにする

// Arduino Sketch
  for(int i = 0 ; i < 8 ; i++)
    digitalWrite(i,HIGH);
// C/C++ source
  PORTD = B11111111;

PIN*

入力レジスタ(read only)。
入力値を格納する。

(例)digital pin 0~7の値を読む

// Arduino Sketch
  int x[8];
  for(int i = 0 ; i < 8 ; i++)
    x[i] = digitalRead(i);
// C/C++ source
  int x[8];
  for(int i = 0 ; i < 8 ; i++)
    x[i] = DDRD >> i;
ポートレジスタ
ポート方向レジスタデータレジスタ入力レジスタ
PortDDDRDPORTDPIND
PortBDDRBPORTBPINB
Dポートレジスタ対応表
マイコン ポート
bit7bit6bit5bit4bit3bit2bit1bit0
Atmel
AVR
ATmega328P
DDRD
DDD7DDD6DDD5DDD4DDD3DDD2DDD1DDD0
PORTD
PORTD7PORTD6PORTD5PORTD4PORTD3PORTD2PORTD1PORTD0
PIND
PIND7PIND6PIND5PIND4PIND3PIND2PIND1PIND0
Arduino digital pin 7digital pin 6digital pin 5digital pin 4digital pin 3digital pin 2digital pin 1digital pin 0
Bポートレジスタ対応表
マイコン ポート
bit7bit6bit5bit4bit3bit2bit1bit0
Atmel
AVR
ATmega328P
DDRB
DDB7DDB6DDB5DDB4DDB3DDB2DDB1DDB0
PORTB
PORTB7PORTB6PORTB5PORTB4PORTB3PORTB2PORTB1PORTB0
PINB
PINB7PINB6PINB5PINB4PINB3PINB2PINB1PINB0
Arduino 水晶発振子digital pin 13digital pin 12digital pin 11digital pin 10digital pin 9digital pin 8

注意点

レジスタを直接操作すると、そのレジスタを他の処理で利用していても、その設定を書き換えることになる。
例えば、USBシリアル通信(ArduinoのD0,D1ピンを利用)が突然使えなくなることが考えられる。
そのため、利用中のレジスタを変更しないような保護策が必要となる。

(例) Dポートを全て出力モードにする
   ただし、シリアル入出力用ピン(PD0,PD1)は変更しない

  DDRD = DDRD | B11111100 ;

余談…

マイコンのポート操作は、レジスタに値を書き込む・読み取ることで行なわれる。
しかし、そのレジスタは各マイコン(PIC,H8,SH2,ARM etc...)ごとに異なる。
今時、いちいちレジスタの名前全部調べて、そのうち何ビット目がどうとか直接いじってるってのが原始的すぎるという意見もある。
そのような点で、直接的に入出力設定をできるArduinoは、もっともシンプルに入出力が学習できると感じる。
もちろん今回のように、それがデメリットとなる場合もあるが、これ自体を「レジスタ」という概念の学習の導入に用いるきっかけと見ることもできる。

参考

色の指定 - RGB型(Processing)

色は、光の三原色である「赤・緑・青」の混ぜ具合で指定する。
Processingでは、「color型変数」があり、数値や文字列同様、色の値を変数に代入して扱うことができるが、その方法はいくつか種類がある。
※色の指定には、RGB型の他にHSB型もあるが、ここでは解説しない。

グレースケール

色を明るさ(brightness)で指定する。(白、灰色、グレーなど)

  color c0 = color(255);  //白
  color c1 = color(0);    //黒

16進数表記 - RGB

各色を、2桁の16進数(00~FF or 0~255:256段階)で指定する。

  color c2 = #FF0000;         //赤(#RRGGBB)
  color c3 = color(0,255,0);  //緑(R,G,B)

アルファ値(不透明度)

色の不透明度を、256段階で指定する。
ただし、background()では、自動的に不透明となる。
※カラーの場合、「#RRGGBB」と「color(R,G,B)」では、アルファ値の指定方法が異なるので注意。

  color c0 = color(255,0);        //白、不透明度0%(完全に透明) = 白は意味を成さない
  color c1 = color(0,127);        //黒、不透明度50% = 背景が白なら、灰色に見える
  color c2 = #00FF0000;           //赤、不透明度0%
                                  //#AARRGGBB:透過率は、「前」に指定する。
  color c3 = color(0,255,0,255);  //緑、不透明度100%
                                  //(R,G,B,A):透過率は、「後ろ」に指定する。

図形の色指定

「塗り色」と「枠線の色」をそれぞれ指定した後、各図形を描画する。
色指定は随時変更可。
なお、「line()」や、曲線の色は、「枠線の色」で描画される。

  fill(255);                   //塗りつぶし:白
  stroke(0);                   //枠線:黒
  rect(0,0,10,10);             //四角形(□)
  fill(0);                     //塗りつぶし:黒
  rect(20,0,10,10);            //四角形(■)
  
  stroke(color(255,0,0,128));  //枠線:赤、半透明
  line(0,5,30,5);              //直線:赤、半透明

Bluetooth

Bluetoothとは、数m~数十m程度の距離において用いられる通信規格(IEEE 802.15.1)のことである。
2.4GHzの周波数帯を79チャンネルに分割し、最大24Mbpsで無線通信を行なう。
周波数ホッピングを行ないながら通信するため、ノイズに強い。

PCでのBluetooth動作 - Bluetoothスタック

PCでBluetoothモジュールを利用する際、Bluetoothスタックが必要となる。
これは、OS上でBluetoothハードウェアを動作させるためのドライバ・ソフトウェアである。
Windows向けの有名なものとして、Microsoft製、TOSHIBA製、BlueSoleil製がある。
※主観ですが、機能・コストから考えて、TOSHIBA製が使いやすいようです。(Microsoft製:機能不足、BlueSoleil製:有償)

モジュール紹介 - Bluetooth Mate(SparkFun製)

SparkFun製Bluetooth Mateは、3.3~6V電源で動作し、シリアル通信で利用可能なBluetoothモジュールである。
ピン配置がArduino Pro向けに設計されているため、Bluetoothによるプログラミングが可能になる。
シリアル接続のboudrateは、標準で115200bpsである。
日本国内の技適認証を受けていないため、利用には注意が必要である。
以下に接続例を示す。

Bluetooth機器接続

上図において、「PC~Bluetoothモジュール」をAndroid端末に置き換えることで、Android端末上から接続機器を操作(または逆)が可能になる。
(Android端末には、通常Bluetoothモジュールが内蔵されている)

Androidアプリケーション(Processing)

Andoroid と Java と Processing

Androidアプリケーションは、通常Javaを用いて作成される。
Javaを簡易的に扱うことができるようにした開発環境がProcessingである。
つまりProcessingでも、JavaによるAndroidアプリケーションを作成することが可能である。

Processingで作成されたプログラムのソースファイルは、「.pde」という拡張子を持っている。
しかし、メインとなるpdeファイル(=画面上で最も左にあるソースファイル)以外は、Javaのソースファイルを表す「.java」という拡張子で作成することができる。
これにより、簡易的ではない本格的なJavaプログラミングを行なうこともできる。
ProcessingでAndroidアプリケーションを作成するには、Javaで各種センサのクラス・パッケージを読み込むことが必要である。

開発環境の構築

ProcessingでAndroidアプリケーションを開発するには、以下の環境が必要になります。

  • Processing (Androidモード)
  • Android SDK (AVD:Android 2.2 Platform - API Level 8)
  • JDK (Java Debvelopment Kit)

JDKをインストールしないと、Android SDKでアプリケーションのBuildができません。

Android SDKのインストール~設定

以下のサイトから、Android開発キットをダウンロードし、インストールします。

Android SDK Managerから、「Android 2.2」のAVD(Android Virtual Device:Androidの仮想実行環境)をインストールします。
※これにより、開発したアプリをPC上で実行できるようになりますが、Androidのエミュレーション(仮想実行)がとても重いので、使い物にならないと思います…
可能なら、実機デバッグがよいと思います。

Processingの設定

ウィンドウ右上にある「STANDARD」をクリックし、「Android」モードに切り替えます。
初回設定時のみ、Android SDKのあるフォルダを尋ねられるので、指示に従い、Android SDKをインストールしたフォルダを入力します。

Android端末でのアプリケーション実行

Processingで普段通りプログラムを作成した後、Android端末をUSBでPCと接続し、メニューから以下の項目を選択・実行します。

Sketch > Run on Device

何も問題がなければ、少し待った後にAndroid端末上でアプリケーションが実行されます。
なお、実行と同時に、Android端末にアプリケーションがインストールされます。
※PCに比べて動作が重いので、ある程度処理を考えてプログラミングをする必要があると思います。

Androidのセンサ利用

多くのAndroid端末には、加速度センサや地磁気センサが実装されている。
これらのセンサを利用することで、PCでは実現できない機能を実装できる。

これらのセンサは、Android SDKにより制御のためのクラス・パッケージが準備されている。
よって、これらを利用するためには、各センサのインスタンスを用いれば良い。

eclipse for Android (作成中)

Androidアプリケーション

Android SDK

eclipse

JRE・JDK

JRE(Java Runtime Environment)は、Javaプログラムを実行するために必要な環境である。
Processingや、これにより作成されたプログラムの実行に必要である。

JDK(Java Development Kit)は、Javaプログラムを開発するために必要な環境である。
Android SDKや、eclipseによるコンパイルの実行に必要である。

Processing