본문 바로가기

라즈베리파이

FSR402센서, FSR (Force Sensing Resistors) 힘 감지 센서 라즈베리파이 파이선 코드

반응형

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은 주로 전자악기(전자 피아노, 전자 드럼 등)나 터치센서, 지면 반응력 센서 등으로 많이 활용되고 있다.

아래 첨부한 센서의 데이터 쉬트를  참고한다.

interlink-fsr-user-guide.pdf

이미지 소스 참고:  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에서 분석할 수 있는 파일을 생성한다.
= 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
= 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()
 


반응형