フォトリフレクタTPR-105Fの使い方

秋月電子通商で扱っているフォトリフレクタTPR-105Fを使ってみました。 秋月では以下の2種類を扱っています。

DAとDBの何が違うのかAIに聞いてみると 「反射型フォトセンサのDAランクとDBランクの違いは、 主に検出距離と検出精度にあります。DAランクは一般的に検出距離が短く、 精度もDBランクに比べて低い傾向があります。一方、DBランクは検出距離が長く、より高精度な検出が可能です。」 とのことです。値段も同じなのDBを使っておけば良いと思います。

TPR-105Fは縦2.7mm、横3.2mmの小さな部品です。



光を出す発光素子と、光を受信する受光素子を持っています。 光を反射する物体(白紙)に近づけると、反射した光を受光し、 光を吸収する物体(黒紙)に近づけると、光を受光できなくなります。



TPR-105Fの仕様書はこちらにあります。

回路図





                
                
実験

次のpdfのように、白から黒のテストパターンを印刷して準備します。 ただし、インクジェットプリンタではダメでレーザープリンターで印刷します。 インクジェットプリンタでは黒に反応しませんでした。



上の回路の出力をArduinoのA/D変換に接続して電圧を測定します。



センサーと紙の距離は5mm、10mm、15mmを実験しました。距離が短くても長くて感度が悪くなります。 離し過ぎると白を感知できなくなります。近過ぎると黒が検知しずらくなります。 調度良い距離を探さないとなりません。

下の表は、センサーと紙の距離を変えて、黒の濃さの違う所をタッチして A/D変換器の値を直接読んだ値です。5mmではGRB0, RGB:50, RGB:102は675,360,46 と区別できる値して認識できます。しかし、それ以上に薄いと白と変わらなくなってしまいます。 白と黒を判断するならば、5mmでも使うことができます。 10mmでは色の濃さに応じて中間の値が出ることがわかります。 色の濃さを判断したいのであれば、10mmくらいが最適であることがわかります。 15mmも離してしまうと、黒、白を判断できなくなります。

距離\RGB 0 50 102 154 206 255
5mm 675 360 46 35 30 26
10mm 902 621 300 135 42 38
15mm 929 922 902 771 645 556

ただし、センサーにはばらつきがあり、最適値は実験に使ったセンサーに寄るところが大きい可能性があります。

動作確認

以下の動画は、ArduinoのA/D変換の情報をMIDIに変換して、 Control Change Monitorで表示した動画です。 このグラフは白がY軸上で大きな値に、黒がY軸上ゼロに近い値に表示されます。 センサーと紙の距離は5mmです。上の表にあるように、距離が5mmですのでRGB:154は白に(Y軸上で上に張り付いている)識別されます。



プログラム

ArduinoはPro Micro  amazon link を使っています。 MIDIUSBのライブラリを使うことができます。

センサーと紙の距離は5mmの時のA/D変換器の最大値と最小値のをMIDIの0x00〰︎0x7Fにアサインします。

#include "MIDIUSB.h"

#define White_Vol 26
#define Black_Vol 675

int a3;
uint8_t rxb=0;

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

void loop() {
  float fa3;
  uint8_t rx3;
  midiEventPacket_t CC = {0x0B, 0xB0, 0x01, 0x00};  //CC=1

  a3=analogRead(A3);
  fa3 = (float)(a3-White_Vol)/(Black_Vol-White_Vol);
  if(fa3≥1.0) fa3=1.0;
  else if(fa3<0.0) fa3=0.0;
  rx3 = (uint8_t)(fa3*0x7F);

  if(rx3!=rxb){           //値に変化があった時だけMIDIを送信する
    Serial.println(a3);
    CC.byte3 = 0x7F-rx3;  //黒だと値が小さく、白だと大きい
    MidiUSB.sendMIDI(CC);
    rxb=rx3;
  }
}