フォトリフレクタは回路が2つついてて、1つはLED、もう1つはフォトトランジスタ(照度で抵抗値が変化する素子)になっている。電気を流すことで反射光の照度を抵抗値として取得することができる装置である。安くてっちゃいのを秋月電子で探してみるとTPR-105があった。

フォトリフレクタ(反射タイプ) TPR-105: 半導体 秋月電子通商 電子部品 ネット通販

TPR-105_dim

角が欠けてる方がLED。LEDは1から2に電流を流す。フォトトランジスタは3から4に電流を流して電流値を見る。データシートによるとLEDの方は20mAなので5Vから引っ張って抵抗は250Ωがないので220Ωで。フォトトランジスタの方は同じく5Vでやると1MΩで割といい感じになった。

TPR-105F_ブレッドボード

 

これをシリアル通信で送ってprocessingで表示したい。

arduinoの方のコードは超シンプル。

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

void loop () {
  Serial.write(analogRead(A1));
}

processing側。

import processing.serial.*;
Serial port;
PFont ricty;
int[] y;
int   x;
int   val;
int   size;
int   time;

void setup() {
  size(1000, 600);
  port = new Serial(this, "SERIAL_PORT_PATH", 9600);
  size = width/2;
  x = 0;
  y = new int[size];
  val = 0;
  time = 0;
  ricty = loadFont("Ricty-Regular-24.vlw"); // ここはお好みで
  textFont(ricty, 24);
  smooth();
}

void draw() {
  for (int i=0; i<size-1; ++i) y[i] = y[i+1];
  y[size-1] = int(map(val, 0, 255, -height, height));

  // frame
  background(40);
  stroke(#999999);
  strokeWeight(1);
  line(0, height/2, width, height/2);
  line(0, height/4, width, height/4);
  line(0, 3*height/4, width, 3*height/4);
  line(width-time%(width/2), 0, width-time%(width/2), height);
  line(width/2-time%(width/2), 0, width/2-time%(width/2), height);
  if (time % (width/2) == 0) time = 0;
  fill(40, 100);
  rect(0, 0, width, height);

  fill(220);
  text(val, 10, 35);

  stroke(#eebbcc);
  strokeWeight(2);
  for (int i=0; i<size; ++i) {
    point(i, -y[i]/3+height/2);
  }

  ++time;
}

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

シリアル通信で得た値をオシロスコープ風に点のプロットで 表示する。配列yにsizeまでの数の過去の値を保存しておいて、それを更新していくという感じ。フォトリフレクタに手を近づけたり離したりすると以下のようになる。

スクリーンショット_2014-01-06_3_06_18-4

フォトリフレクタ自体はライントレースとかに使えるようなのでこれからいろいろやってみる。

関連記事

Pythonでプロセスを監視して終了したらgmailを使ってメール送信する(Python3版)

もはやこれは地球ではない。ルーブルアブダビの異次元の美しさ

あなたは光の護封剣の絵を描けますか?

300ドル15W中華半導体レーザーカッター買った その4

300ドル15W中華半導体レーザーカッター買った その3

numpyでsequence too largeエラーの回避法

コメント

コメントを返信する

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です