2013年12月10日火曜日

展示について

電子工作ゼミ2013の展示を1階ギャラリーで行う予定です。
期間:

1/20 準備・搬入
1/21ー25 展示期間(最終日25日は展示終了後搬出)
開館時間:11:00から17:00
*期間中ギャラリー内にだれもいない場合は、セキュリティ上一旦施錠し2F事務室へ解錠を申し出る

2013年12月3日火曜日

12/09の授業(後期最終)

次回12/09は最後の授業となります。

いままで使ったサンプルや利用したいセンサ、あるいは出力デバイスなど持参し、ひとつの入出力デバイスの仕組みを、各自の設定において構築し、デモンストレーションしてもらいます。次回までに各自の入出力デバイスのサンプルを考えて来て下さい。
次回授業までに準備が間にあわない場合は、授業内の作業で解決したいと思います(各自の設定にあわせて、アドバイスいたします)。

必要なもの:
・各自の入出力デバイスの案
・各自の入出力デバイスに必要なセンサや出力装置
・Arduino(マイコンボード、ブレッドボード、その他部品など)
・Processing (Webカメラなど含む)

2013年11月19日火曜日

11/25の授業:Processing(Webカメラをつかった動体検知)

次回11/25の授業は引き続きWebカメラを用いて、動体検知の実験をします。
時間があれば、カメラをセンサーにして、接続されたArduinoと連動させたいと思います。

必要なもの:
・ノートパソコン
・Webカメラ(ノートパソコン内蔵型も可)
・Arduinoボード類


サンプル1(Processing):カメラがとらえた画面中で動くもの(画面に変化がある部分)を察知して、その動いている部分の平均座標値を求めて、その位置に円を描くサンプル。変数toleranceは、色の許容値なので、上げればより鈍く、下げればより敏感に反応します。

import processing.video.*;
Capture video;

int w=320;
int h=240;
color[] exColor=new color[w*h];
float x,y;
int sumX,sumY;
int pixelNum;
boolean movement=false;
int tolerance=40;

void setup(){
  size(320, 240); 
  video = new Capture(this, w, h);
  video.start();
  noStroke();
}

void draw() {
  if(video.available()){
    background(0);
    video.read();
    set(0,0,video);
    loadPixels();

    movement=false;
    for(int i=0;i<w*h;i++){     
      float difRed=abs(red(exColor[i])-red(video.pixels[i]));
      float difGreen=abs(green(exColor[i])-green(video.pixels[i]));
      float difBlue=abs(blue(exColor[i])-blue(video.pixels[i]));
     
      if(difRed>tolerance && difGreen>tolerance && difBlue>tolerance){
        movement=true;
        pixels[i]=color(0,255,0);
        sumX+=i%w;
        sumY+=i/w;
        pixelNum++;
      }
     
      exColor[i]=video.pixels[i];
    }
    updatePixels();
    if(movement==true){
      x=sumX/pixelNum;
      y=sumY/pixelNum;     
      sumX=0;
      sumY=0;
      pixelNum=0;
    }
  }
 
 
  fill(255,0,0);
  ellipse(x,y,20,20);
  fill(0,40,255);
}


サンプル2(Arduino):
動きを検知したProcessingのプログラムに対して、シリアル通信でArduinoと連結し、サーボモータを動かすサンプル。Processing上の動くオブジェクトのX座標(横の動き)に対して、サーボモータの首振りの角度が対応しています。

#include <Servo.h>
Servo myServo;

void setup(){
  Serial.begin(9600);
  myServo.attach(9);
 
}

void loop(){
  if(Serial.available()>0){
    int val=Serial.read();
    int x=map(val,0,255,0, 179);
    myServo.write(x);
  }
 
  delay(15); 
}


サンプル2(Processing):上記サーボモータをつないだArduinoに対するProcessing側のサンプルです。Processindgサンプル1の内容に変数float x2,y2を加えてlerp()をつかうことで、円の動きをやや滑らかにする計算をさせています。

import processing.video.*;
Capture video;
import processing.serial.*;
Serial myPort;

int w=320;
int h=240;
color[] exColor=new color[w*h];
float x,y;
float x2,y2;
int sumX,sumY;
int pixelNum;
boolean movement=false;
int tolerance=40;


void setup(){
  size(w, h); 
  video = new Capture(this, w, h);
  video.start();
  noStroke();
  myPort=new Serial(this,"/dev/tty.usbserial-A9005baQ",9600);
  //上記"/dev/tty.usbserial-A9005baQ"の部分には各自のシリアルポートをいれてください
}

void draw() {
  if(video.available()){
    background(0);
    video.read();
    set(0,0,video);
    loadPixels();

    movement=false;
    for(int i=0;i<w*h;i++){     
      float difRed=abs(red(exColor[i])-red(video.pixels[i]));
      float difGreen=abs(green(exColor[i])-green(video.pixels[i]));
      float difBlue=abs(blue(exColor[i])-blue(video.pixels[i]));
     
      if(difRed>tolerance && difGreen>tolerance && difBlue>tolerance){
        movement=true;
        pixels[i]=color(0,255,0);
        sumX+=i%w;
        sumY+=i/w;
        pixelNum++;
      }
     
      exColor[i]=video.pixels[i];
    }
    updatePixels();
    if(movement==true){
      x=sumX/pixelNum;
      y=sumY/pixelNum;     
      sumX=0;
      sumY=0;
      pixelNum=0;
    }
  }
 
 
  fill(255,0,0);
  //ellipse(x,y,20,20);
  //myPort.write(int(map(x,0,width,0,255)));
 
  x2=lerp(x,x2,0.9);
  y2=lerp(y,y2,0.9);
  ellipse(x2,y2,20,20); 
  myPort.write(int(map(x2,0,width,0,255)));
 
  fill(0,40,255);
}


2013年11月1日金曜日

11/11の授業:Processing(Webカメラをつかった色認識)

次回は、Webカメラ(Processing)を用いて、色認識のプログラムの実験をします。

必要なもの:
・ノートパソコン (Processingをインストール済み)
・Webカメラ(ノートパソコン内蔵型も可)

なお、前回のマトリクスLED演習で未消化の部分があれば随時補習します。

サンプル1:
部屋を暗くして、懐中電灯の点光源を動かした軌跡を画面に描きます。画面クリックで背景を黒にリセットします。

import processing.video.*;

Capture video;
int w=640;
int h=480;

void setup() {
  size(w, h);
  video = new Capture(this, w, h);
  video.start();
  background(0);
}

void draw() {
  if(video.available()){
    video.read();
  }
 
  loadPixels();
 
  for(int i=0;i<w*h;i++){
    if(brightness(video.pixels[i])>=250){
      pixels[i]=color(255,0,0);
    }
  }
 
  updatePixels();
}

void mousePressed(){
  background(0);
}


サンプル2:
目立つ色のボールなどを用意して、画面上でそのボールをクリックして、いったん対象となる色を覚えさせます(画面左上に色表示)。そのボールを動かせば、画面上の円が追跡します。矢印キーの左右をつかって、色の許容範囲を設定できます(画面左上の数値:初期値20)。数値を大きくすれば、近似色の範囲が大きくなります。

import processing.video.*;
Capture video;
int w=320;
int h=240;

int tolerance=20;

PFont font;
color targetColor=color(255,0,0);

boolean videoImage=true;

void setup(){
  size(w, h);
  smooth();

  video = new Capture(this, w, h);
  video.start();
  font=createFont("Monaco",10);
  textFont(font);
  noStroke();
}

float x;
float y;
int sumX,sumY;
int pixelNum;

boolean detection=false;

void draw() {
  if(video.available()){
    video.read();
    if(videoImage){
      image(video, 0, 0);
    }else{
      background(0);
    }

    detection=false;
   
    for(int i=0;i<w*h;i++){

      float difRed=abs(red(targetColor)-red(video.pixels[i]));
      float difGreen=abs(green(targetColor)-green(video.pixels[i]));
      float difBlue=abs(blue(targetColor)-blue(video.pixels[i]));
      if(difRed<tolerance && difGreen<tolerance && difBlue<tolerance){
        sumX+=(i%w);
        sumY+=(i/w);
        pixelNum++;
        detection=true;
      }
    }
   
    if(detection){
      x=sumX/pixelNum;
      y=sumY/pixelNum;
      sumX=0;
      sumY=0;
      pixelNum=0;
    }
  }

  fill(255,0,0);
  ellipse(x,y,20,20);
  fill(targetColor);
  rect(0,0,10,10);
  text(tolerance,20,10);
  String s;
  if(detection){
    s="detect";
  }else{
    s="none";
  }
  text(s,40,10);
}

void keyPressed(){
  if(key=='v'){
    if(videoImage){
      videoImage=false;
    }else{
      videoImage=true;
    }
  }
  if(key==CODED){
    if(keyCode==LEFT){
      tolerance-=1;
    }
    if(keyCode==RIGHT){
      tolerance+=1;
    }
  }
}

2013年10月3日木曜日

10/21の授業:マトリクスLED+Webカメラ

次回の授業は10/21です。
ひきつづき前回利用したマトリクスLEDを使用しつつ、ProcessingによるWebカメラと連動させる演習を行う予定です。
 前回のマトリクスLEDについては、このページ(2008建築発明工作ゼミ)を参考に配線ならびに点灯実験を行ってきてください。使用しているマトリクスLEDによっては、配線番号や極性が異なることがあるので、各自確認してきてください(分からなければ、次回の授業で)。

必要なもの:
・ノートパソコン (ArduinoとProcessingをインストール済み)
・Arduinoボード+USBケーブル
ブレッドボード(できれば小型なもの2個)
ジャンパワイヤー(オスーオスタイプ:できれば20本以上)
マトリクスLED(アノードコモンタイプ)
・Webカメラ(ノートパソコン内蔵型も可)




Arduino側のプログラム(アノード/カソードコモンで極性が逆の場合は、digitalWrite()内のHIGH/LOWを逆にしてください):
 
//8x8の二次元配列を用意
byte matrix[8][8];

void setup(){
  //出力ピンの設定、すべてオフにする
  for(int i=2;i<=17;i++){
    pinMode(i,OUTPUT);
    digitalWrite(i,LOW);
  }
  //シリアル通信開始
  Serial.begin(9600);
}

void loop(){
  //シリアル通信(64個分のデータ)
  if(Serial.available()>63){
    for(int k=0;k<8;k++){
      for(int l=0;l<8;l++){
        //読み込んだ値を配列に代入
        matrix[k][l]=Serial.read();
      }  
    }
  }

  //各LEDの点灯制御
  for(int i=2;i<=9;i++){
    //列の点灯
    digitalWrite(i,HIGH);  //極性が逆の場合HIGHをLOW

    for(int j=10;j<=17;j++){
      //行の点灯
      digitalWrite(j,LOW); //極性が逆の場合LOWをHIGH
      //行の点灯継続時間
      delayMicroseconds(1+matrix[i-2][j-10]);
      //行の消灯
      digitalWrite(j,HIGH);  //極性が逆の場合HIGHをLOW
      //行の消灯継続時間
      delayMicroseconds(256-matrix[i-2][j-10]);    
    }
    //列の消灯
    digitalWrite(i,LOW); //極性が逆の場合LOWをHIGH
  }
}


Processing変更版:

import processing.video.*;
import processing.serial.*;
Capture cam;
Serial port;

int w=640; //画面幅
int h=480; //画面高さ
int s=60;   //モザイク一辺のサイズ

boolean start=false; //シリアル通信開始用フラグ
int[] pixelValue=new int[64];

void setup() {
  size(w,h);
  cam = new Capture(this, w,h);
  cam.start();

  stroke(1); //モザイクの外形線の色
  //noStroke(); //外形線なしの場合
}
int cnt=0;
void draw() {
  if (cam.available() == true) {
    cam.read();
    for(int i=0; i<w*h;i++){  //カメラ画像を8x8のモザイク画像に変換
      int x=i%w;
      int y=i/w;
      if(x%s==0 && x/s<8 && y%s==0){
        fill(cam.pixels[i]);
        rect(x, y, s, s);
       
        pixelValue[cnt]=int(brightness(cam.pixels[i]));
        cnt++;
        if(start){
          int pixColor=int(brightness(cam.pixels[i]));
          port.write(pixColor); //色データ値送信
        }
      }
    }
  }
  println(cnt);
  cnt=0;
}

void mousePressed(){  //クリックでシリアル通信開始または停止
  start=!start;
  if(start){
    port=new Serial(this,"/dev/tty.usbserial-A40014iU",9600);
  }else{
    port.stop();
  }
}


2013年9月10日火曜日

9/30の授業:マトリクスLED

次回は3週間後の9/30になります。
次回は主にArduinoをつかって、マトリクスLED制御の演習を行う予定です。
前回のWebカメラ演習とも関連した内容となります。ひきつづき複数の画素制御について演習していきます。
尚、マトリクスLEDについては以下のものを用意してきてください。

必要なもの:
・ノートパソコン
・Arduinoボード+USBケーブル
ブレッドボード(できれば小型なもの2個)
ジャンパワイヤー(オスーオスタイプ:できれば20本以上)
マトリクスLED(アノードコモンタイプ)
*マトリクスLEDには、アノードコモンタイプとカソードコモンタイプがあります。複数のLEDの陽極(+)を共有接合してあるものか、陰極(ー)を共有接合してあるものかになりますが、今回はアノードコモンタイプを使う予定です(入手困難であればカソードコモンタイプでも構いません)。
また、マトリクスLEDがブレッドボードに対してサイズが大きいので、できれば小型なブレッドボードを2枚用意して、その2枚にまたがるように配置するとつかいやすくなります。
上記8x8のマトリクスLEDには、合計64個のLEDが内蔵されており、端子数も16個あるので、最低でも20本はジャンパワイヤーが必要となりますので、足りない場合は追加しておいてください。

 授業内のサンプル: (左上から順番にひとつずつLEDを点灯させる)
マトリクスLEDにはアノードコモンタイプとカソードコモンタイプがあり極性が逆になります。
以下プログラム内のdigitalWrite()のHIGH/LOWが逆になります。 
 
*アノードコモンタイプの場合:

void setup(){
  //16本のピン(2~17)をデジタル出力に設定
  for(int i=2;i<=17;i++){
    pinMode(i,OUTPUT);
  }
}
void loop(){
  //行(横)の繰り返し処理
  for(int i=2;i<=9;i++){     //行(2~9番ピン)
    digitalWrite(i,LOW);    //LOWで点灯

    //列(縦)の繰り返し処理
    for(int j=10;j<=17;j++){ //列(10~17番ピン)
      digitalWrite(j,HIGH);   //HIGHで点灯
      delay(100);            //点灯時間
      digitalWrite(j,LOW);  //列をオフにする
    }

    digitalWrite(i,HIGH);     //行をオフにする
  }
}


*カソードコモンタイプの場合:

void setup(){
  //16本のピン(2~17)をデジタル出力に設定
  for(int i=2;i<=17;i++){
    pinMode(i,OUTPUT);
  }
}
void loop(){
  //行(横)の繰り返し処理
  for(int i=2;i<=9;i++){     //行(2~9番ピン)
    digitalWrite(i,HIGH);    //HIGHで点灯

    //列(縦)の繰り返し処理
    for(int j=10;j<=17;j++){ //列(10~17番ピン)
      digitalWrite(j,LOW);   //LOWで点灯
      delay(100);            //点灯時間
      digitalWrite(j,HIGH);  //列をオフにする
    }

    digitalWrite(i,LOW);     //行をオフにする
  }
}
 
 

2013年9月6日金曜日

9/09の授業:Webカメラの演習

後期初回(9/09)は、Webカメラを用いた実験を行いたいと思います。
Processingのvideoライブラリをつかって、Webカメラをセンサとして利用する内容に発展していく予定です。
また必要に応じてArduinoとの連携を行います。

必要なもの:
・ノートパソコン
・Webカメラまたはパソコン内蔵カメラ
・Arduinoボード類一式




モザイク画像の表示:

import processing.video.*;

Capture cam;

int w=640; //画面幅
int h=480; //画面高さ
int s=10;   //モザイク1辺のサイズ

void setup() {
  size(w,h);
  cam = new Capture(this, w,h);
  cam.start();
 
  stroke(0); //モザイクの外形線の色
  //noStroke(); //外形線なしの場合
}

void draw() {
  if (cam.available() == true) {
    cam.read();
    for(int i=0; i<w*h;i++){
      if((i%w)%s==0 && (i/w)%s==0){
        fill(cam.pixels[i]);
        rect(i%w, i/w, s, s);
      }
    }
  }
}

変数sを変えれば、モザイクの細かさが変化します。
また、wとhを変えることで、表示サイズとカメラから取り込む画像サイズを変えることができます。
このプログラムでは、640×480画素数で読み込んでいる画像データを
if((i%w)%s==0 && (i/w)%s==0){...}
の条件文をつかって、iについては横を10個(変数sの値分)とばし、縦も10個とばしのピクセルの位置の色データだけをfill()に適用させてrect()で矩形(モザイクの1粒)を描かせています。

2013年8月22日木曜日

後期授業

 後期授業は、9/9から開始します。

後期は、前期の内容を復習しながら、やや応用的な内容の演習を行う予定です。

ノートパソコン(Processing+Arduinoインストール済み)、
Arduinoボード+ブレッドボード+ジャンパワイヤ+その他部品等、
は、毎回持参してください。

後期授業日程:
09/09 
09/30
10/21
11/11
11/25
12/09

2013年7月18日木曜日

次回の授業(7/22:前期最終授業)Processing+Arduino演習2

7/22(前期最終授業)は、ひきつづきProcessingとArduinoを連携させた演習を行います。

必要なもの:
・各自のノートパソコン(Processingインストール済み)
・Arduinoボード
・USBケーブル(Arduinoとパソコン接続用)
ブレッドボード、ジャンパワイヤ、その他部品など


 授業内サンプル:
ArduinoのanalogRead端子0番ピン(他2本はGNDと5V端子へ接続)に接続した可変抵抗器(ヴォリューム)を動かすことで、Processing上の画面(Pong:パドル)を操作する。

Arduinoのプログラム:

int val;

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

void loop(){
  val=analogRead(0)/4;
  //Serial.println(val);
  Serial.write(val);
 
  delay(50);
}



Processingのプログラム:

import processing.serial.*;
Serial myPort;

int x;
int y;
int xdir;
int ydir;
int val;

void setup(){
  size(256,300);
  x=80;
  y=100;
  noStroke();
  smooth();
  rectMode(CENTER);
  xdir=1;
  ydir=1;
 
  myPort = new Serial(this, Serial.list()[0], 9600);
}

void draw(){
  background(0);
  ellipse(x,y,20,20);
  rect(val,250,60,15);
 
  x=x+xdir;//x+=xdir;
  y=y+ydir;
  if(x<
10 || x>width-10){
    xdir=xdir*(-1);//xdir*=-1;
  }
  if(y
<10){
    ydir=ydir*(-1);
  }
  if(y>height){
    y=10;
  }
  if(x>val-30 && x<
val+30 && y==250-17){
    ydir=ydir*(-1);
  } 
}

void serialEvent(Serial p) {
    val = p.read();
}

2013年7月4日木曜日

次回の授業(7/08)Processing+Arduino演習1

7/08は、ProcessingとArduinoを連携させた演習を行います。
シリアル通信という方法で、Arduinoに接続したセンサから、パソコン上(Processing)の画像を操作します。

 必要なもの:
・各自のノートパソコン(Processingインストール済み)
・Arduinoボード
・USBケーブル(Arduinoとパソコン接続用)
ブレッドボード、ジャンパワイヤ、その他部品など

 

2013年6月19日水曜日

次回の授業(6/24)Arduino演習2

6/24は、前回にひきつづきArduino電子工作の演習を行います。

必要なもの:
・各自のノートパソコン
・Arduinoボード
・USBケーブル(Arduinoとパソコン接続用)
ブレッドボード
ジャンパワイヤ(オス−オス)

2013年5月30日木曜日

次回の授業(6/10)Arduino演習1

次回6/10は、Arduino電子工作の授業を行います。
Arduinoボードというマイコンを用いて、電子工作の基礎を学びます。

必要なもの:
・各自のノートパソコン
・Arduinoボード(以下に説明あり)
・USBケーブル(Arduinoとパソコン接続用)
・Arduinoソフトのインストール(ダウンロードページ
 各OSに応じてソフトをダウンロードしてください(Arduino1.0.5のほう)。

Arduinoボードの入手方法:
Arduinoボードには用途などに応じて幾つかの種類がありますが、
「Arduino Uno」もしくは「Aruino Uno Rev3(最新版)」の入手をおすすめします。

通販なら、Amazonやスイッチサイエンスにて購入できます。価格は2700円前後です。

【永久保証付き】Arduino Uno
スイッチサイエンス
売り上げランキング: 3,866


Arduino Uno Rev3
Arduino Uno Rev3
posted with amazlet at 13.05.30
GHEO SA
売り上げランキング: 2,715

また、秋葉原の千石電商などでも直接購入できます(通販も可)。



より大きな地図で 秋葉原工作マップ を表示

2013年5月28日火曜日

Processingの基礎

Processingソフトを起動すると、ウィンドウ上部に6つのボタンがあります。
左から順番にいくと:
・Run:書き込まれたプログラムを実行します。
・Stop:実行したプログラム(別ウィンドウ)を終了します
・New:新しいプログラムを書き込むためのウィンドウを開きます。
・Open:すでに保存されているプログラムを指定して開きます。
・Save:書き込んだプログラムを保存します。
・Export Application:書き込んだプログラムをアプリケーションとして書き出します。


書き込んだプログラムの保存先は、以下の方法で確認(または変更)できます。
Macなら、メニューバーの「Processing>環境設定...」をクリックで設定の画面が現れます。Windowsなら「File>Prerferences」 。
以下が、設定の画面です。
上部にあるSketchbook location:の欄に保存先のアドレスが書かれています。変更したい場合は、この欄を書き換えてください。保存されたProcessingファイルの拡張子は「.pde」になります。次回からは、「Open」ボタンなどをつかって、そのファイルを開いて下さい。また、「File>Recent」からも最近つかったプログラムであれば、開くことができます。あるいは、「File>Sketchbook」から選んで開くこともできます。

Processingのインストール

この授業では、プログラミングを学習するために、Processingというソフト(開発環境)をつかいます。以下にProcessingのダウンロード+インストール方法を説明します。

・まず、Processingのサイトにアクセスします。http://www.processing.org/
・最初のページの「Download」もしくは「>> Download Processing」をクリック。
・ダウンロードページから、WindowsやMacなどの使用しているOSにあわせて、Processingをダウンロード。最新版は、現在Processing 2.0 beta9になっています。
ダウンロード先は、WindowsならProgram Files、Macならアプリケーションフォルダがいいでしょう。インストール後、Program FilesやアプリケーションフォルダにProcessingが入っているか確認してください。
・インストールされたProcessingソフトを起動すると、以下のようなウィンドウが開きます(Macの場合)。

・白い空白の部分にプログラムを書いていきます。ためしに既にインストールされているサンプルプログラムを動かしてみます。
メニューバーの「File>Examples...」をクリックするとサンプルのウィンドウが出て来ます。
・ためしに、サンプル内の「Basics>Arrays>Array」をクリックしてみます。そうすると、もうすでにプログラムが書き込まれたウィンドウがでてきます。
・ウィンドウ上部のRunボタン(再生マークのようなアイコン)をクリックすると、このプログラムが実行(Run)されます。実行されると、以下のような画像(実行結果)が別ウィンドウにでてきます。実行結果が表示されれば、Processingソフトを問題なくインストールできたことになります。
 ・「Run」ボタンの右側にある「Stop」ボタンを押せば(または実行結果のウィンドウを閉じるボタンをクリック)、実行結果のウィンドウは閉じて、このプログラムは終了します。

*尚、サンプルウィンドウ内のサンプルで正常に動かないものもあります。原因や改善については、Processingサイト内のForumで解決に向けてディスカッションされています。


2013年5月23日木曜日

次回の授業(05/27)Processing演習2 

次回5/27は、ひきつづきProcessing(プログラミング)の演習を行います。

必要なもの:
・各自のノートパソコン(ない場合は学校のものを使用)

*また個人的に興味のあるデバイスなど(前回のKinectのように)あれば、個人的にやりとり致します。

2013年5月12日日曜日

電子工作ゼミ2013開講

電子工作ゼミ2013(改め:建築工作ゼミ2012)開講

開講日:全12回 隔週月曜日 19:00-20:30

05/13 Processing1
05/27 Processing2
06/10 Arduino1
06/24 Arduino2
07/08 Processing+Arduino1
07/22 Processing+Arduino2
*前期はプログラミングと電子工作の基礎演習。

*後期は応用的な実験/演習を予定しています。
09/09 
09/30
10/21
11/11
11/25
12/09

*毎回各自のノートパソコンを持参してください。
*また、各自の興味あるデバイスなどがあれば、随時個人的に対応します。