Study/HardWare

포토센서 종류와 연결방법

Answer Choi 2018. 3. 14. 15:55
반응형

 

포토센서는 주로 물체를 감지하는데 사용됩니다.

 

종류로는 투과형, 미러 반사형, 확산 반사형등이 있습니다.

 

<오토닉스 홈페이지>

 

 

투과형은 투광기와 수광기 2개로 이루어져 있으며, 투광기에서는 적외선을 발사하고, 수광기는 

 

이 적외선을 받게 됩니다. 적외선이 들어오게 되면 감지가 안된 것이고, 안들어오면 감지가 되었다고

 

생각을 하게 됩니다.

 

미러 반사형은 적외선을 쏘는 부분과 받는 부분이 하나로 이루어져 있으며, 

 

적외선을 발사하여 미러를 통해 반사하여 감지합니다.

 

만약 물체가 감지되면 적외선을 받지못해 인식을 하게 됩니다.

 

확산 반사형은 미러 반사형처럼 쏘는 부분과 받는 부분이 하나로 이루어져 있지만, 미러가 없어

 

물체가 없을경우에는 적외선을 받지 못하다가 물체가 감지되면 적외선을 받게되는 구조입니다.

 

 

이 3가지중 가장 거리가 길고 인식률도 좋고 정밀도가 좋은 것은 투과형입니다.

 

하지만 투광기와 수광기를 모두 설치해야하는 단점이 존재합니다.

 

 

투과형인 BMS5M-TDT를 사용하여 MCU에서 읽을 수 있도록 회로를 구성해 보겠습니다.

 

 

홈페이지나 센서를 구매하시면 제어출력 회로도가 있습니다.

 

이 모델의 경우 NPN출력과 PNP 출력 2가지가 있는데 BMS5M-TDT는 NPN입니다.

 

 

그리고 이건 제품의 연결도 입니다.

 

전원은 12V~24V 를 사용할 수 있습니다.

 

저는 갈색에 24V, 청색 0V를 인가했습니다.

 

그리고 흰색( 24V)에 연결하면 Dark ON이 되고, 

 

청색(0V)에 연결하면 Light ON이 되는데 

 

Dark ON은 감지가 되면 흑색으로 출력이 나오고,

 

<Dark ON 모드>

 

Light ON은 감지가 안되었을때 흑색으로 출력이 나오는 모드입니다.

 

<Light ON 모드>

 

 

이제 MCU에 연결을 해야하는데 보통은 MCU GPIO가 3.3V~5V입니다.

 

하지만 센서는 24V전원을 사용해서 24V가 나오게 됩니다.

 

따라서 포토커플러를 사용하여야 합니다.

 

대표적인 포토커플러로는 PC817이 사용됩니다.

 

 

 

포토커플러는 입력측과 출력측이 절연되어 있습니다.

 

따라서 입력측이 24V라도 출력측에서는 3.3V나 5V로 내보내 줄 수 있습니다.

 

포토커플러 연결방법은 아래와 같습니다.

 

 

센서의 24V전원과 출력을 포토커플러 입력으로 넣고,

 

출력쪽엔 MCU의 전원과 저항을 통해 MCU 디지털 입력으로 넣어주면 됩니다.

 

위 회로기준 풀업저항이 걸려있어, 평상시 D2에 HIGH신호가 들어가게되고,

 

센서가 감지되는 경우 D2에 LOW신호가 들어가게 됩니다.

 

Dark ON이냐 Light ON이냐에 따라 입력값이 달라지게 됩니다.

 

 

Dark ON모드로 간단히 테스트를 진행했습니다.

 

 

MCU는 ESP8266기반의 nodMCU를 사용하였습니다.

 

회로는 위 참고회로를 기반으로 

 

PC817

 

PC817 1번 10k-24V

 

PC817 2번 포토센서 출력(검은색)

 

PC817 3번 nodMCU GND

 

PC817 4번 10k-3.3V, nodMCU GPIO2번

 

포토센서

 

갈색, 흰색 24V

 

파란 GND

 

검정 PC817 2번

 

으로 연결하였습니다.

 

 

연결된 후 투광기에만 불이 들어오고 수광기는 불이 꺼져있습니다.

 

 

중간에 물체 감지시 수광기에도 불이 들어옵니다.

 

 

 

 

테스트 장면입니다.

#define debug Serial
#define di 2

void setup() {
  // put your setup code here, to run once:
  debug.begin(115200);
  pinMode(INPUT,di);
}

void loop() {
  // put your main code here, to run repeatedly:
  debug.println(digitalRead(di));
  delay(1000);
}

 

반응형