티스토리 뷰

로봇에 사용될 거리센서가 초음파 센서로  정해졌다.

 

초음파 센서는 적외선을 사용하는 타입에 비해 직진성은 떨어지지만

 

작동 범위가 넓고 실외에서도 잘 작동한다는 장점을 가진다.

 

1~2천원대의 초음파 센서도 있지만 다수의 센서를 사용할때 배선이 많아진다.

 

다수의 센서를 동시에 이용할때는 1:N 통신이 가능한 485나 i2c가 사용된다.

 

485나 232와같은 비동기 통신과 spi/i2c와 같은 동기 통신의 차이는 clock을 내보내는 선이

 

있느냐 없느냐이다. 비동기 통신의 경우 clk선이 없기때문에 배선은 하나 줄어들지만

 

통신속도(baud)를 변경할 때 master와 slave 둘다 설정을 변경해줘야한다.

 

반명 동기 통신의 경우 배선이 하나 늘어나지만 통신속도의 설정은 master쪽에서만 해주면된다.

 

 

 

SRF-02는 I2C를 사용하는 초음파센서로15cm~4m범위에서 측정이 가능하다.

 

여기에 올리는 코드 정보는 I2C를 사용하는 SRF 센서들에 호환될것이다.

 

i2c 구동을 위해 wiringPi 라이브러리를 이용하였다.

 


SONAR::SONAR(uint16_t _id)
{
	id=wiringPiI2CSetup(_id);
}

bool SONAR::RequestData() 
{ 
	return wiringPiI2CWriteReg8(id,0,81); //send 81(cm response) to 0(command) 
} 

uint16_t SONAR::GetValues()
{
	return wiringPiI2CReadReg16(id,2)/256;// read 2 byte from 2(result hi)
}

 

 

위 함수들을 이용하기 위해서는 wirinPiI2C.h를 include해야한다.

 

wiringPiI2CSetup(_id)함수는 i2c통신을 초기화해주며 id를 반환해준다.

 

 wiringPiI2CWriteReg8(id,0,81)

 

해당 id(초음파센서)의 81번 레지스터에 0을보내면 센서는 거리측정을 한뒤 data레지스터에 담아둔다.

(인치의 경우 80번 레지스터, 시간으로 받으려면 82번)

 

wiringPiI2CReadReg16(id,2)

 

2번 레지스터에서 2바이트를 읽어온다. 해당값은 cm단위이다.

 

참고로 RequestData 수행후 일정시간 기다린 이후에 GetValue를 해야 정상적인 값이 나온다.

 

당연하지만 빛과 달리 소리는 느리기 때문에 왕복에 시간이 걸리기 때문이다.

 

예를 들면 1m거리의 물체를 측정하기 위해서 음파는 2m의 거리를 왕복한다.

 

이 때 음파의 속도는 340m/s이기때문에 2/340=5.88msec 정도의 시간이 걸린다.

 

실험결과 약 1m거리를 측정할때는 15~20ms정도 기다려야했다. 다른 블로그들을 보니

 

무작정 60ms을 기다리라고 하지만 본인이 원하는 최대 측정거리에 맞게 기다리면 된다.

 

데이터 레지스터의 값은 65ms이 지난 후 지워지기 때문에 그 이상 기다려서는 안된다.

 

만약 본인의 컨트롤 loop이 60ms보다 빠르다면  카운트 변수를 만들고 데이터를 요청한 후

 

 카운트가 일정 숫자가 될때마다 데이터를 가져오면 된다.

 


void SONAR::SetID(uint16_t newid)
{
                    wiringPiI2CWriteReg8(id,0,0xA0);
                    usleep(20000);
                    wiringPiI2CWriteReg8(id,0,0xAA);
                    usleep(20000);
                    wiringPiI2CWriteReg8(id,0,0xA5);
                    usleep(20000);
                    if(newid > 0x77)
                    {
                        newid=0x77;
                    }
                    wiringPiI2CWriteReg8(id,0,newid*2);
}

 

마지막으로 srf 02 센서는 0x70로 id가 세팅되어 오는데 id를 변경할 필요가 있다면

 

위에 올려놓은대로 0xA0 0xAA 0xA5를 차례대로 보낸후 0번 레지스터에 원하는 id*2의 값을 보내면 된다.

 

정말 당연하게도 0x77이상의 id로 세팅해도 세팅이 된다. 다만 라즈베리파이는 0x77보다 큰 id를 가지는

 

i2c장비와는 통신할 수 없다. 심심해서 테스트해봤는데 아두이노로 id를 되돌려야했다..

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함