라즈파이 3에 연결된 초음파 센서 SRF02에서 거리 값을 파이썬으로 읽습니다.

Raspberry Pi3의 i2c 핀에 거리 센서 인 SRF02라는 초음파 센서를 연결하여 초음파가 맞은 물체까지의 거리를 읽는 것을 생각합니다.



SRF02는 그 레지스터에 거리 정보를 저장하고 있기 때문에, 그 값을 어떠한 방법으로 읽으면 된다. C 언어 등에서도 읽을 수 있지만 여기에서는 Python으로 읽어 보겠습니다.

pigpio라는 라이브러리를 사용하기 때문에이 파이썬 스크립트를 실행하기 전에 pigpio를 실행한다고 가정합니다.
$ sudo pigpiod

상위 레지스터 0x02와 하위 레지스터 0x03을 읽고 거리 값으로 변환



Beaglebone Black (BBB)에 연결하여 사용했을 때는 사양서대로 C 언어로 읽고있었습니다. 라즈파이 3에 연결하고 pigpio와 Python으로 읽으려고하면 BBB와 레지스터에서 데이터를 검색하는 방법이 다릅니다.
같은 방식으로 거리로 변환하면 실제 거리와 다른 값이되었습니다.

그래서,
레지스터 Ox02, 0x03의 값을 10 진수 표시하고 거리를 바꾸면서 조사해 보았습니다.
15 ~ 600cm를 읽을 수 있도록 한 함수가 아래와 같습니다.
#srf02.py
import pigpio
h = pi.i2c_open(BUS, SRF02_I2C_ADDR)

def srf02_read(h):
   # レジスタ 0x02, 0x03 の値を読み取る
   high = pi.i2c_read_word_data(h,0x02)
   low = pi.i2c_read_word_data(h,0x03)

   low_low=int(bin(low&0b1111111),2)  # lowの下位7bitを抜き出して10進に変換 
                                      # 0-128cmの値が入る.
   low_high=int(bin(low>>15),2)  # lowを15bit右にシフトして10進に変換
                                 # 128-255cmの時に0b1になる
   high_low=int(bin(high&0b11),2)  # highの下位2bitを抜き出す
                                   # 256cm:0b01, 512cm:0b10
   dist =high_low*255+low_high*128+low_low
   return dist

실제로이 함수는 15cm - 600cm 범위의 거리를 거의 정확하게 반환합니다.
16cm 이하와 600cm 이상의 거리에서는 이 센서의 성능상 정확하게 거리를 측정할 수 없는 사양입니다.

왜 BBB의 I2C와 다른지는 수수께끼이지만,
2byte의 데이터를 저장하는 순서, 즉 인디언의 문제라든지, clock streach의 문제가 있을지도 모릅니다.

참고 URL
h tp // w w. 안녕하세요. 이. u k / 등

2대의 초음파 센서 간의 간섭 효과 실험



스티렌 보드의 벽에,
위 사진과 같이 2대의 SRF02를 가까이 하여 각각 거리를 측정 실험해 보았습니다.

SRF02 사이의 간격이 10cm 정도로 비교적 가깝기 때문에 서로 간섭 할 가능성이 있습니다.

벽까지의 거리가 30cm 전후와 비교적 가까우면 초음파에 의한 상호 간섭에 의한 거리 판독의 노이즈는 거의 볼 수 없었다.

오히려 거리가 100cm 정도로 떨어지면 몇 초에 한 번 멀리 떨어진 거리가 관측되는 것 같습니다.

도움이되면 다행입니다.

좋은 웹페이지 즐겨찾기