우여곡절 끝에 손에 넣게된 ADIS16365 6축 관성센서(6 DOF Inertial sensor)..
그리고, 센서 테스트를 위해 ADISUSBZ 보드까지 구매를 했다.
매뉴얼을 다운받아서 보자.
http://www.analog.com/en/sensors/inertial-sensors/adis16365/products/evaluation-boardstools/resources.html?display=popup
ADISUSBZ 매뉴얼 : http://www.analog.com/static/imported-files/eval_boards/ADISUSBZ.pdf
ADIS16365 데이터시트 : http://www.analog.com/static/imported-files/data_sheets/ADIS16360_16365.pdf
위 url로 이동해서 보면 Evaluation Tool overview가 있다. 드라이버들과 데이터를 확인해 볼 수 있는 소프트웨어가 있다. 매뉴얼대로 프로그램을 다운받아 설치하면, "C:\Program Files\Analog Devices iSensors\ 폴더에 프로그램들이 있다. 여기에서 Adis16350_Rev_14.exe파일을 실행하면 된다. 위에서 본 매뉴얼에 설치부터 실행방법까지 자세하게 설명되어 있으니, 따로 설명하지는 않겠다.
참고로, ADIS16365를 사용하기 위해서는 ADISUSBZ보드에서 JP1을 5V로 점퍼셋팅을 바꿔줘야 한다는 것(보드에서 JP1을 찾아서 점퍼를 바꿔끼우면 된다.). 셋팅을 하지 않으면 데이터가 정상적으로 안나오거나 자이로데이터가 나오지 않을수 있다. 이거 안해놓고 센서 고장난거 아냐? 라고 한다면... 삽질하겠지요..
프로그램을 돌려보니.. 데이터는 정상적으로 다 나오는것 같다.
데이터를 읽어보려면 왼쪽편에 Loop 체크박스에 체크하고 START버튼을 누르면 된다. 메뉴에서 Calibration하는 메뉴도 있으니 메뉴얼을 잘 읽어보면 어떤 기능인지 잘 설명되어 있다. 참고하도록..
자 이제 이것을 가지고 프로그램을 짜야하는데.. 가만히 보니 NI Labview로는 쉽게 구현이 가능하도록 제공하고 있다.
http://www.analog.com/en/sensors/inertial-sensors/adis16365/products/evaluation-boardstools/eb_NI_LabVIEW_based_I2C_and_SPI_Drivers/resources/fca.html
근데 난 Labview는 쓰지않고, C++로 구현하고 싶은데 어떻게 하는가..
구글링으로 찾다가 누군가 만들어놓은클래스가 있다.
이것을 압축을 풀면, ADISUSBZ.cpp, ADISUSBZ.h파일이 있다. 이것을 이용하면 된다.
이 클래스를 내 프로그램에 가져다가 놓고, 인스턴스를 생성해서 쓴다. 위 압축파일안에 Dicas.txt파일이 있는데 그안에 사용방법에 대한 간단한 설명이 있다.
ADISUSBX lUsbX;
lUsbX.Initialize( "\\\\.\\Ezusb-0" );
위처럼 인스턴스를 생성하고 Initialize함수를 호출하는데 인자는 \\\\.\\Ezusb-0로 하면 된다.
ADISUSBZ 보드를 보면 Cypress사의 cy7c68013 칩을 사용하고 있는데, EZ-USB FX2 USB 마이크로컨트롤러이다. 이때문에 디바이스를 연결할때 디바이스명을 \\\\.\\Ezusb-0으로 하는 것같다.
자, 이제 ADISUBZ 헤더파일을 보자.
다른건 볼 필요없고, public으로 된것만 보자. 함수가 2개 뿐이다.
bool Initialize( const char * aDeviceName );
short ReadInt14( unsigned char aAddress );
Initialize함수의 인자는 디바이스의 이름인데, 이전에 말한 것처럼 \\\\.\\Ezusb-0 로 하면 된다.
디바이스가 정상적으로 연결되면 Initialize함수를 호출시 true가 반환될 것이다.
ReadInt14 함수는 ADIS16365센서의 어드레스의 값을 읽어오는 함수인것 같다. 어드레스?
ADIS16365 데이터시트에 메모리 맵(Memory Map)을 보면 어드레스 정보가 테이블로 나와있다.
테스트를 위해 SUPPLY_OUT의 adress인 0x02를 인자로 호출해봤다.
short result = adisusbz.ReadInt14(0x02);
리턴값으로 2077이 나온다. 이 값을 Hex값으로 변환하면 0x081d이다. 이 값을 아래 테이블을 보면 값을 알 수있다.
0x814가 5V에, 0x001이 높을때마다 0.002418V가 올라가니 대략 5.021762V가 출력되는 것을 확인했다.
정상적으로 통신이 되는 것같다.
이 클래스를 시간이 되면 좀더 사용하기 쉽게 확장하여 만들어서 올리겠습니다.
예제 프로그램과 같이..
'Robotics > Hardware Tech.' 카테고리의 다른 글
라즈베리파이 실행 (2) | 2012.11.29 |
---|---|
라즈베리파이(Raspberry Pi) 512M 구매 (0) | 2012.11.26 |
IMU(Inertia measurement Unit) (0) | 2009.06.14 |
무선랜 신호강도 측정 (0) | 2009.05.12 |
사이클 서비스(Cycle Service) (0) | 2008.10.20 |