FSR (Force Sensing Resistors) 힘 감지 센서, FSR402센서
FSR은 압력이 가해지면 저항값이 줄어드는 원리를 이용하여 압력, 무게, 터치 등을 힘이나 압력을 감지하는 센서다. 아래 그림과 같이 여러 개의 레이어가 중첩되어 있으며, 맨위에는 semi-conductor, 맨 아래는 active dot 영역이 존재한다. 압력이 존재하지 않을 때는 semi-conductor가 active dot에 닿지 않지만 압력이 높아질 수록 semi-conductor가 active dot에 많이 닿기 때문에 저항이 낮아지는 원리를 이용한 센서이다. FSR 데이터 북을 참고하면 모양과 크기가 여러가지로 나오지만 FSR 센서의 특성과 원리는 모두 동일하다.
그림. 1 FSR 힘 센서의 구조
그림 2는 FSR의 무게에 따른 저항의 크기를 나타낸 것이다. 압력이 없을 때는 무한대의 저항을 가지지만 어느 정도 이상의 압력이 가해지면 수 kΩ 정도의 저항이 발생하게 된다. 또한 압력과 저항값이 선형적이지 않기 때문에 (아래그림은 log scale 이다) 정밀한 측정에는 어려움이 있다.
그림. 2 FSR의 실물과 힘에 따른 저항 크기
FSR의 회로 구성 방법은 매우 다양하지만 그림 3과 같이 밑단 저항과 버퍼(voltage follower)를 사용하는 방법이 가장 간단한 방법입니다. 그림 3은 밑단 저항에 따라 출력 전압의 형태가 달라지는 것을 확인할 수 있습니다. 따라서 압력 범위에 맞게 RM 저항을 적절히 선정하는 것이 중요합니다. 또한 스트레인 게이지와 마찬가지로 온도, 히스테리시스 특성 등을 보상하는 것도 정밀한 측정에 도움이 되겠습니다.
그림. 3 FSR 이용 회로와 힘에 따른 출력 전압의 크기
FSR은 주로 전자악기(전자 피아노, 전자 드럼 등)나 터치센서, 지면 반응력 센서 등으로 많이 활용되고 있다.
아래 첨부한 센서의 데이터 쉬트를 참고한다.
이미지 소스 참고: https://m.blog.naver.com/lagrange0115/220637039236
아래 테스트 코드에서 사용한 라즈베리파이와 FSR402센서 연결도 참고(메이커를 위한 라즈베리파이. p.352)
아래 파이선 코드를 참고하여 테스트 한다. 이 코드를 보완한 코드를 아래에 추가로 올려둔다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #!/usr/bin/env python import spidev import time import os Vcc = 5.0 R1 = 1000 # SPI 버스를 초기화한다. spi = spidev.SpiDev() spi.open(0,0) # fsr402 출력값을 계산한다. def fsr420_Registor(voltage): R = (R1 * Vcc)/voltage - R1 return R # MCP3008에서 fsr402 저항 값을 읽는다. def ReadChannel(channel): adc = spi.xfer([1,(8 + channel)<<4,0]) data = ((adc[1]&3) << 8) + adc[2] return data # 우리는 MCP3008 디지털 출력 0번 채널을 이용할 것이다. mcp3008_channel = 0 # 측정 주기를 설정한다. delay = 0.01 # gnuplot에서 분석할 수 있는 파일을 생성한다. f = open('fsr402.dat', 'w') index = 0 try: while True: # mcp3008에서 FSR402의 저항 값을 읽는다. analog_level = ReadChannel(mcp3008_channel) Vout = analog_level * Vcc / 1024.0 if(Vout == 0.0): Vout = 0.001 # FSR402의 저항 값을 계산한다. Rfsr = fsr420_Registor(Vout) print "Digital:", analog_level, " Voltage:", Vout, " R(K Ohm):", Rfsr / 1000.0 data = "{} {} {} {}\n".format(index, analog_level, Vout, Rfsr / 1000.0) f.write(data) time.sleep(delay) index += 1 except KeyboardInterrupt: print "Now Exit" f.close() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #!/usr/bin/env python import spidev import time import os Vcc = 5.0 R1 = 1000 # Open SPI bus spi = spidev.SpiDev() spi.open(0,0) # Calculate fsr402 registor value def fsr420_Registor(voltage): R = (R1 * Vcc)/voltage - R1 return R def ReadChannel(channel): # adc = spi.xfer2([1,(8+channel)<<4,0]) adc = spi.xfer([1,(8+channel)<<4,0]) data = ((adc[1]&3) << 8) + adc[2] return data # Define sensor channels(SS01) mcp3008_channel = 0 # Define delay between readings delay = 0.01 f = open('fsr402-2.dat', 'w') index = 0 try: while True: analog_level = ReadChannel(mcp3008_channel) Vout = analog_level * Vcc / 1024.0 if(Vout < 2.2): Vout = 0.001 Rfsr = 5000000 analog_level = 100 else: Rfsr = fsr420_Registor(Vout) print "Digital:", analog_level, " Voltage:", Vout, " R(K Ohm):", Rfsr / 1000.0 data = "{} {} {} {}\n".format(index, analog_level, Vout, Rfsr / 1000.0) f.write(data) time.sleep(delay) index += 1 except KeyboardInterrupt: print "Now Exit" f.close() |
'라즈베리파이' 카테고리의 다른 글
온습도 센서 DHT11 - 비동기 방식으로 값을 얻는 C코드 (0) | 2019.04.01 |
---|---|
라즈베리파이 카메라 사용법 상세한 자료 파이선 코드 [링크] (0) | 2019.04.01 |
라즈베리파이 BMP180 대기압 측정센서 C와 Python 코드 (0) | 2019.03.26 |
모든 센서종류, 센서타입 리스트 (0) | 2019.03.26 |
라즈베리파이 2대를 사용한 UART 채팅 프로그램 C, Python 사용 (0) | 2019.03.22 |