フォトリフレクタは回路が2つついてて、1つはLED、もう1つはフォトトランジスタ(照度で抵抗値が変化する素子)になっている。電気を流すことで反射光の照度を抵抗値として取得することができる装置である。安くてっちゃいのを秋月電子で探してみるとTPR-105があった。
フォトリフレクタ(反射タイプ) TPR-105: 半導体 秋月電子通商 電子部品 ネット通販
角が欠けてる方がLED。LEDは1から2に電流を流す。フォトトランジスタは3から4に電流を流して電流値を見る。データシートによるとLEDの方は20mAなので5Vから引っ張って抵抗は250Ωがないので220Ωで。フォトトランジスタの方は同じく5Vでやると1MΩで割といい感じになった。
これをシリアル通信で送って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までの数の過去の値を保存しておいて、それを更新していくという感じ。フォトリフレクタに手を近づけたり離したりすると以下のようになる。
フォトリフレクタ自体はライントレースとかに使えるようなのでこれからいろいろやってみる。
コメント