Quadrotor20132013. 12. 13. 19:15

쿼드의 핵심인 센서와 보드에 대해 다뤄보겠습니다.

 

일반적으로 RC하시는분들은 제어보드를 FC보드(Flight Control Board)라고 하더라구요. 갑자기 생각난건데 처음 쿼드만드시는 분들은 용어가 생소해서 고생하실 겁니다.. 프롭이니 리포배터리니 통돌이모터 프롭밸런서 등등 이런 단어를 알아야 검색도 하고 공부도 하는데 모르면 난감해요 ㅠ


제어보드의 종류는 많습니다. 아두이노 같이 빵판처럼 온갖 프로그램을 올릴 수 있는 보드에도 제어 소스만 올리면 제어가 가능하니까요. 쿼드콥터 제조 회사나 커뮤니티에서 만들어 지는 것 같습니다. AeroQuad, MultiWii 등 오픈되어있는 소스도 있구요, 이 오픈소스들을 그대로 보드에 올려서 사용하려면 해당 소스에 맞는 하드웨어에 올려야합니다. (센서나 하드웨어사양이 충족되어야 한단 소리입니다)


제어보드의 사양은.. 당연한 소리겠지만 빠르면 빠를수록 좋습니다. 제어 알고리즘을 돌리는데 1초가 걸린다면 전혀 쓸모없는게 되어버리니까요. 

뜨기 위한 보드의 제어 주기는 최소 5ms는 되어야 뜰까말까입니다. 10ms로 하면 시소제어는 되는데 전혀 뜨질 않고, 5ms로 하면 불안정하게 뜨고, 3ms로 하니까 나름 안정적으로 뜨는것 같습니다. 제가 직접 겪은 이야기입니다 ㅠ 이 글을 읽는 여러분은 이런 고생 겪지 않길 바랍니다.


이 제어 주기라는 것은 센서와 깊은 연관이 있습니다. 보드가 아무리 빨라봤자 센서의 최대 샘플링 간격이 1초라면 보드 제어주기는 1초로 맞춰질수밖에 없기 때문입니다. 센서 구매시 잘 선택하시길 바랍니다. 제 경우는 최대 10ms의 속도를 가지는 50만원짜리 센서를 가지고 제어를 해 왔는데.. 지금 보면 되지도 않는 하드웨어 사양을 가지고 엄청 고생한거네요. 50만원짜리 고급 센서보다 9천원짜리 MPU6050이 더 빠른데 말이죠. 



위 표는 MPU6050의 사양입니다. 밑의 Update rate를 보시면 자이로는 최대 0.125ms, 가속도는 최대 1ms 이네요. 왜 범위로 되어있냐면~ MPU6050센서 내부의 레지스터를 조작해서 LPF를 쓸 수 있게 되어있는데, 그 LPF설정에 따라 유동적이기 때문이라는 생각이 드네요.

아무튼, 센서마다 이런 사양이 있으니까 꼭 참고해서 결정하시기 바랍니다.


MicrocontrollerATmega2560
Operating Voltage5V
Input Voltage (recommended)7-12V
Input Voltage (limits)6-20V
Digital I/O Pins54 (of which 15 provide PWM output)
Analog Input Pins16
DC Current per I/O Pin40 mA
DC Current for 3.3V Pin50 mA
Flash Memory256 KB of which 8 KB used by bootloader   
SRAM8 KB
EEPROM4 KB
Clock Speed16 MHz

위 표는 제어보드인 아두이노 Mega2560의 사양입니다. 메인 클럭 주파수가 16MHz인데, 이걸 가지고 제어 루프의 주기를 계산하기에는 좀 막연하네요. 빠르면 빠를수록 좋긴 한데 쓸데없이 빠른건 굳이 필요 없을테니까 잘 고르시기 바랍니다. 


아두이노의 16MHz는 실시간 영상처리하기에는 턱없이 부족한 주파수인데요, 700MHz이상가는 라즈베리파이를 사용하면 굳이 저처럼 휴대폰을 달지 않고도 영상처리를 할 수 있을거 같다는 생각을 요새 하고 있는 중입니다. 근데 라즈베리파이는 불안정하다는 이야기가 들리기도 하네요.


센서와 보드의 통신 환경도 결정할때 고려해야할 요소 중에 하나인데요, 센서 표를 보시면 인터페이스가 I2C방식이라도 되어있습니다. 저는 운좋게 아두이노 보드에서 I2C전용 핀과 통신용 라이브러리를 제공해서 쉽게 통신할 수 있었는데요. 만약 다른방식이고 보드가 그 방식을 지원하지 않는다면 아날로그 신호를 분석해서 통신을 구현해야할 수도 있습니다. 저는 그렇게까지 하고싶진 않았는데 다행히 보드가 지원해줬네요.. 참고로 아두이노는 I2C통신과 시리얼통신을 지원합니다.


I2C방식(TWI통신이라고도 함)에 대한 자세한 내용은 제 블로그(http://hs36.tistory.com/29)를 참고하시구요 


mpu6050와 통신하는 라이브러리와 예제도 첨부하겠습니다.

MPU6050.zip

 

그밖에 각종 I2C를 사용하는 장치들과 아두이노간 통신 라이브러리는

https://github.com/jrowberg/i2cdevlib/tree/master/Arduino

참고하시면 되겠습니다~ 














Posted by 너를위한노래

댓글을 달아 주세요

  1. 안녕하세요 이번에 4학년이 되는 컴퓨터 학과 학생인데 저희팀도 이번에 졸작으로 아두이노를 이용해
    쿼드콥터를 만드는것을 선정했는데 어떤것부터 해야할지 갈피를 못잡아 문의드립니다.
    아두이노에 대해서는 평소 교수님과 연구실 자체에서도 배우는 지라 각종 엑츄에터 장비와 센서는 다뤄봤습니다.
    저희가 생각하는 것은 블루투스 통신을 이용해 아두이노를 띄우고 나아가 gps모듈을 장착해서 해당 지점을 찍고 돌아오는 것을 목표로 하고 있는데 첫시작이 너무 힘드네요.. ㅜㅜ
    대략 블로그에 관한 글을 전부 읽어보았지만 아직 부품에 대해서는 어떤 종류의 프레임을 쓸지 그에 따른 모터나 프롭등을 정하지 못하여서 도움을 청하고자 문의드렸습니다.
    읽어주셔서 감사하고 꼭 답변 해주시면 정말 고맙습니다.

    2014.03.11 19:13 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 쿼드에 뭔가 장비를 실으실게 아니라면 320mm~350mm프레임을 쓰시는게 좀더 나을것 같습니다. 저는 450mm썼는데 생각보다 크기도 크고 무게도 나가더라구요. 320mm 쓰실거면 모터는 제가 쓴거랑 비슷한 크기와 성능으로 쓰시면 될거 같고~ 프롭은 10인치 말고 좀더 작은거 쓰시면 될거 같아요 8인치인가.. 여러 사이트 돌아다니면서 정보 수집하는걸 권해드리고싶네요~!

      2014.03.14 15:18 신고 [ ADDR : EDIT/ DEL ]
  2. Alex

    안녕하세요~! 저도 졸업작품으로 아두이노를 이용해서 쿼드콥터 제작을 계획하고 있는데요.
    우선 블로그에서 좋은 정보를 많이 올려주셔서 감사드립니다. 많은 도움 되고 있습니다.^^
    그런데 아두이노와 함께 사용하는 센서 관련해서 질문이 생겨 이렇게 댓글을 답니다.
    위에서 말씀하신대로 멀티위나 aeroquad에 맞는 하드웨어를 달고 함께 제공되는 Software를 사용해 기체를 쉽게 제어 할 수 있다라고 알고 있는데요, 만약 mpu6050 같은 센서를 직접 달아서 사용하면 이에 맞는 software는 모두 다 직접 코딩해야하나요?
    예를 들어, 기체 제어나, 안정화 알고리즘, 칼만필터 이런 것들을 직적 코딩하여 아두이노 보드에 올리는 것이 맞는지..?
    이렇게 한다면 너무 어렵지 않을 까요? 혹시 해보셨다면 어떠한 방법을 추천하는지 궁금합니다.
    그리고 이에 관련된 오픈 소스나 참고할 만한 것이 있으면 알려주시면 감사하겠습니다.

    2014.03.19 00:22 [ ADDR : EDIT/ DEL : REPLY ]
  3. rktkwlak

    안녕하세요. 블로그통해 많은 도움 받고있습니다.!!
    참고해가며 쿼드 제작중인데요 진동을 잡는게 정말 어렵네요 ㅜㅜ
    혹시 방진처리는 어떻게 하셨나요??
    그리고 mpu6050레지스터로 lpf사용하는 방법을 알 수 있을까요?
    글을 전부 읽어봤는데요 혹시 LPF사용하면 반응이 많이 느린가요??

    2015.02.01 01:37 [ ADDR : EDIT/ DEL : REPLY ]
    • 방진은 방진 댐퍼를 사서 센서 보드와 프레임 사이를 연결했습니다~ 근데 별로 효과는 없어보이더라구요. LPF사용법은 MPU6059.h의 LPF관련 해서 define되어있는 상수를 찾으신 다음 MPU6050.cpp에서 해당 상수를 검색해보시면 금방 아실 수 있을거예요~ LPF 가중치 정도에 따라 많이 느려질 수 있으니까 가중치를 바꿔보시면서 테스트해보세여

      2015.02.13 15:21 신고 [ ADDR : EDIT/ DEL ]
    • rktkwlak

      넵 답변 정말 갑사합니다!!!

      2015.02.17 03:15 [ ADDR : EDIT/ DEL ]
  4. 드론

    안녕하세요 저희도 아두이노로 드론을 만들고 있는데요
    정말 큰도움이 되고 있어 감사 드립니다
    다름이아니라 같은 mpu6050을 사용하고 있는데 위의 소스를 사용하면 가속도와 자이로 값이
    수평일때
    a/g: 288 44 14224 -744 148 -412
    a/g: 392 332 14540 -448 596 -601
    a/g: 104 888 15324 -599 322 -86
    a/g: 216 -32 15276 248 -544 158
    a/g: 84 -448 14684 -149 -950 -404
    a/g: 348 328 14068 -331 -498 -754
    a/g: 88 800 14052 -237 48 -143

    이런식으로 예상하지 못한 값이 나옵니다. 이러한 값이 뜻하는 것이 뭔지 잘모르겠네요 ㅠㅠ
    죄송하지만 이 값에 관하여 설명좀 부탁 드려도 될까요?

    2015.08.07 13:49 [ ADDR : EDIT/ DEL : REPLY ]
    • 잘 나오고 있네요~!
      왼쪽부터 차례대로 가속도센서 x, y, z, 자이로센서 x, y, z 값이 출력되는 것 같습니다. 맞나요?
      먼저, 가속도센서는 이론적으로는 0, 0, 16384값이 출력되어야 합니다(구매 후 레지스터를 안건드렸을 경우). 하지만 전기적인 노이즈가 섞여있고, 수평이라고 하셨지만 땅바닥이 완전한 수평이 아니기에 약간의 치우침(바이어스)과 노이즈로 시시각각 변하는 값이 출력되게 됩니다.
      그리고 자이로센서는 움직이지 않을 경우 0, 0, 0이 출력되어야 정상이지만, 센서 공정상(?) 바이어스가 포함되어있기 때문에 0이 아닌 값이 출력되는게 일반적이고, 역시 약간의 노이즈로 인해 변화하는 값이 출력됩니다.
      두 센서 모두 -32768~32768의 값을 출력시킬 수 있으니 몇 백정도의 값은 바이어스와 노이즈로 보시면 될 거 같네요.
      출력된 값은 데이터시트에 나와있는 정보를 토대로 스케일링 하셔서 사용하시면 됩니다~!
      제 블로그(http://hs36.tistory.com/18)를 참고하시면 도움이 될 듯 하네요.

      2015.08.07 14:06 신고 [ ADDR : EDIT/ DEL ]
    • 공대

      MPU6050을 Atmega128로 처리해서 각도를 계산하는데, 제어 주기가 약 7ms 정도 되더군요.. 128에서 상보필터를 통해 PID계산을 하는데 float 연산이 많아서(부동소수점 연산) 계산 속도가 느린것 같습니다. 혹시 처리 속도가 어떻게 되시나요? 혹시 DMP기능을 이용하시는건지..?

      2015.12.01 23:07 [ ADDR : EDIT/ DEL ]
  5. K_SSUN

    안녕하세요 이번에 대학교내에서 드론으로 영상처리관련 프로젝트를 진행하게되었는데요
    프로젝트 내용이 실시간으로 드론이 촬영한 영상을 받아와야되는데 지원받은 물품은 드론 부품과 mega2560입니다
    찾아보니 쿼드콥터는 uno로 많이 하시던데 mega나 uno로는 실시간으로 영상을 받아오기가 무리일까요?

    2016.03.18 18:40 [ ADDR : EDIT/ DEL : REPLY ]
    • Mega나 Uno의 속도로는 영상처리는 무리일 것 같습니다.. 해상도에 따라 다르겠지만 680*480은 무리일 것 같네요 ㅜ

      2016.03.23 15:42 신고 [ ADDR : EDIT/ DEL ]

Quadrotor20132013. 12. 13. 19:06

I2C의 개요

I2C (Inter-Integrated Circuit) 버스는 마이크로프로세서와 저속 주변 장치 사이의 통신을 위한 용도로 Philips에서 개발한 규격인데 두 가닥의 선을 사용하므로 TWI (Two Wire Interface)라고도 불리고 있다특허권 때문인지 잘 모르겠으나 Philips 이외의 회사들은 거의 대부분TWI라고 부른다. I2버스는 양방향 오픈 드레인 선인 SCL (serial clock) SDA (serial data)로 이루어져 있으며 매스터-슬레이브 형태로 동작한다. SCL은 통신의 동기를 위한 클럭용 선이고 SDA는 데이터용 선이다매스터는 SCL로 동기를 위한 클럭을 출력하며 슬레이브는 SCL로 출력되는 클럭에 맞추어 SDA를 통해 데이터를 출력하거나 입력 받는다단지 SDA 한 선으로만 데이터를 주고 받기 때문에 I2버스는 반이중 (half duplex) 통신만 가능하다. SCL 선과 SDA 선은 모두 오픈 드레인므로 두 선에는 각각 풀업 저항을 연결해 주어야 한다.

다음 그림은 I2매스터와 슬레이브들 사이의 연결을 보여주고 있다.



모든 I2매스터와 슬레이브 장치들의 SCL은 서로 연결되며 SDA 또한 서로 연결된다모든 장치들이 SCL SDA를 각각 공유하고 있으므로 매스터가 슬레이브를 개별적으로 지정하기 위한 방법이 있어야 한다. I2버스에서 매스터가 각 슬레이브를 구분하는 수단은 슬레이브의 주소이다모든 I2슬레이브 장치들은 7 비트의 고유한 주소를 가지고 있으며 매스터는 주소로 원하는 슬레이브를 지정한다주소의 길이가 7비트이므로 매스터는 최대 128 개의 슬레이브 장치들과 연결될 수 있다물론 슬레이브 장치들의 주소는 모두 달라야 한다.

 

앞의 그림에는 매스터가 하나 밖에 없지만 I2버스에 두 개 이상의 매스터들이 존재할 수도 있다버스에 연결된 장치의 수가 아무리 많아도 한 순간에는 오직 하나의 매스터와 하나의 슬레이브만이 통신할 수 있다현재 통신을 진행하고 있는 매스터가 버스 소유권을 가지고 있다두 개 이상의 매스터가 있는 경우에 현재 버스의 소유권을 가지고 있는 매스터 및 매스터와 통신을 진행하고 있는 슬레이브 장치 이외의 나머지 장치들은 이들의 통신을 방해하지 않아야 한다.

 

SCL SDA는 모두 오픈 드레인이므로 모든 장치들의 SCL SDA는 각각 와이어드 AND로 연결 되어 있다와이어드 AND 연결에서는 어느 한 장치라도 ‘0’을 출력하면 해당 신호의 상태는 논리 ‘0’이 된다만일 SCL이나 SDA에 연결되어 있는 어떤 장치가 논리 ‘0’을 출력한다면 다른 장치가 그 신호의 상태를 논리 ‘1’로 만들 수 있는 방법은 없다통신에 참여하지 않은 장치가 SCL이나 SDA로 ‘0’을 출력하면 매스터가 정상적으로 통신을 진행할 수 없다이것은 I2버스에 연결되어 있지만 현재 통신에 참여하지 않고 있는 장치들은 모두 자신의 출력을 플로우팅 상태로 유지해야 한다는 것을 뜻한다.

 

통신이 진행되지 않는 상황에서 모든 장치의 출력은 플로우팅 상태이므로 SCL SDA의 상태는 모두 논리 ‘1’이다이 상황에서 I2버스의 사용을 원하는 매스터는 SCL SDA로 시작 조건을 출력하며 버스 소유권을 주장하고 통신을 시작할 수 있다두 신호의 상태가 모두 논리‘1’이 아니라면 현재 다른 매스터가 버스 소유권을 가지고 통신을 진행 중에 있다는 것을 뜻하므로 그 매스터가 버스 소유권을 반납할 때까지는 다른 매스터가 새로운 통신을 시작해서는 안 된다.

 

다음 그림은 I2프로토콜의 시작 조건정지 조건그리고 데이터 안정 구간을 보여주고 있다.

<v></v>

I2프로토콜에서 SCL이 ‘0’인 구간에서는 SDA의 상태 변화가 허용되지만 SCL이 ‘1’인 구간에서는 SDA는 안정된 논리 상태를 유지해야 한다매스터가 슬레이브로 데이터를 출력할 때 SCL이 ‘0’인 구간에서 SDA의 비트 전환을 하며 SCL이 ‘1’인 구간에서는 SDA의 상태를 그대로 유지한다슬레이브가 데이터를 출력하고 매스터가 그 데이터를 읽을 때에도 마찬가지이다그래서 SCL이 ‘1’인 구간은 데이터가 안정한 구간이다.

 

I2프로토콜에서 SCL이 ‘1’을 유지하고 있는 구간에서 SDA의 상태가 변하는 것은 일반 데이터 전송이 아닌 특별한 조건을 의미한다. SCL‘1’인 동안 SDA가 ‘1’에서 ‘0’으로 바뀌는 것을 시작 조건 (start condition, S)이라고 하며 SCL이 ‘1’인 동안 SDA가 ‘0’에서 ‘1’로 바뀌는 것을 정지 조건 (stop condition, P)이라고 한다. I2통신을 원하는 매스터는 SCL SDA가 모두 논리 ‘1’일 때 SDA의 상태를 ‘0’으로 바꾸어 시작 조건을 출력하며 다른 장치들에게 통신의 시작을 알린다마찬가지로 통신을 끝낼 때에는 SCL이 ‘1’인 동안 SDA를 ‘0’에서 ‘1’로 바꾸어 정지 조건을 출력하며 버스 소유권의 반납을 다른 장치에게 알린다.

 

I2C의 패킷 형식

다음 그림은 I2버스에서 사용되는 데이터 패킷의 형식을 보여준다. ACK을 포함한 9 비트가 I2규격에서 통신의 기본 단위가 된다.

 

<v></v>

매스터는 SCL SDA가 모두 ‘1’인 상태에서 SDA를 ‘0’으로 바꾸어즉 시작 조건을 출력하면서 통신의 시작을 알린다시작 조건 이후부터는SCL의 상태가 ‘0’인 구간에서만 SDA의 논리 값이 바뀐다매스터가 SCL로 출력하는 클럭에 동기를 맞추어 SDA로는 데이터가 MSB부터 한 비트씩 출력된다. SCL은 항상 매스터가 출력하는 신호이지만 SDA는 현재의 동작이 매스터의 읽기냐 쓰기냐에 따라 매스터의 출력일 수도 슬레이브의 출력일 수도 있다.

 

비트 데이터가 클럭 싸이클 동안 SDA로 출력되면 그 데이터를 수신한 쪽에서 번째 클럭에 맞추어 그 비트 데이터의 수신 여부를 확인해 주는 ACK 비트를 출력한다다시 말해서 ACK 비트는 직전의 8 비트 정보를 수신한 쪽에서 그 정보의 송신자에게 직전 8 비트 정보에 대한 수신 여부를 확인하는 값이다. ACK 비트가 ‘0’이면 정상 수신을 나타내며 ACK 비트가 ‘1’이면 (항상 그런 것은 아니지만정상 수신이 아님을 나타낸다값이 ‘0’인 ACK 비트와 구분하기 위하여 값이 ‘1’ ACK 비트를 NACK (no acknowledgement)라고 부르기도 한다.

 

만일 매스터가 SDA로 비트 정보를 출력했다면 그 정보를 수신한 슬레이브가 9 번째 클럭에 SDA로 ACK 비트를 출력하여 매스터에게 수신 결과를 알린다이 때 매스터가 ACK 비트를 받으려면 번째 클럭 싸이클 동안 자신의 SDA 출력을 ‘1’로 유지하고 있어야 한다반대로SDA로 출력된 비트 정보가 슬레이브의 출력이라면 그것을 수신한 매스터가 9 번째 클럭에서 ACK 비트를 출력한다이 때 매스터의 ACK비트를 받기 위해 슬레이브는 자신의 SDA 출력을 ‘1’로 유지하고 있어야 한다.

 

비트 정보와 이어지는 ACK 비트의 전송이 끝난 다음에는 매스터가 정지 조건을 출력할 수도 있고 시작 조건을 다시 출력할 수도 있으며 다음 바이트 전송이 이어질 수도 있다다음 동작은 현재 진행 중인 동작이 무엇인가에 따라 달라진다.

 

I2C의 주소 지정 형식

모든 I2슬레이브 장치는 7 비트의 고유한 주소를 가지고 있으며 매스터는 이 주소를 사용하여 상대 슬레이브 장치를 지정한다다음 그림은 매스터가 슬레이브의 주소를 지정하고 데이터를 주고 받는 방법에 대한 설명이다.

<v></v>

먼저 매스터는 시작 조건에 이어서 자신이 원하는 슬레이브의 7 비트 주소를 출력한다버스에 연결되어 있는 모든 슬레이브 장치들은 SDA선을 계속 감시하면서 매스터가 출력한 주소가 자신의 주소와 일치하는지 여부를 검사한다만일 매스터가 출력한 주소가 어떤 슬레이브의 주소와 같으면 그 슬레이브는 ACK 비트에 ‘0’을 출력하여 매스터에게 응답한다매스터가 출력한 주소를 가진 슬레이브가 없으면 아무도ACK 비트로 ‘0’을 출력하지 않으므로 ACK 비트의 상태는 ‘1’을 유지하여 매스터는 NACK을 받게 된다.

 

매스터가 ACK을 받으면 이것은 자신이 출력한 주소를 가진 슬레이브가 응답했다는 뜻이므로 매스터는 다음 단계를 진행한다반면에 매스터가 NACK을 받으면 이것은 자신의 호출에 응답하는 슬레이브가 없다는 것을 뜻하므로 매스터가 더 이상 할 수 있는 일은 없다매스터는 정지 조건을 출력하여 현재의 상황을 종료하고 통신을 다시 시작해야 한다.

 

 

슬레이브 주소 비트 다음에 오는 8 번째 비트는 다음 동작이 매스터의 읽기인지 쓰기인지를 가리킨다매스터가 이 비트로 0을 출력했다면 이것은 매스터 쓰기임을 뜻하므로 슬레이브 주소 다음의 1 바이트 데이터는 매스터의 출력이다이 데이터는 앞서 주소가 지정된 슬레이브를 위한 것이므로 그 슬레이브가 이 값을 읽어 들인다반면에 슬레이브 주소 비트 다음에 오는 8 번째 비트가 1 이면 이것은 다음 동작이 매스터의 읽기라는 것을 의미한다그러므로 매스터에 의해 주소가 지정된 슬레이브는 ACK을 응답한 후 이어서 매스터에게 보낼 데이터를 출력한다.

 

주의할 것은 슬레이브 주소는 7 비트이지만 패킷의 상위 7 비트로 정렬되고 마지막에 R/W 비트가 LSB 위치에 추가된다는 것이다그렇기 때문에 슬레이브의 주소를 왼쪽으로 한 비트 쉬프트 시킨 후의 비트 값을 슬레이브의 주소라고 생각하는 것이 더 편할 수도 있다예를 들면 DS1037이라는 RTC 칩의 I2주소는 1101000b으로 고정되어 있다 DS1037 I2주소는 0x68이다. DS1037에 데이터를 기록해야 할 때 매스터는 I2버스로 시작 조건을 출력한 다음 11010000b을 출력한다. DS1037의 데이터를 읽고자 한다면 매스터는 I2버스로 시작 조건을 출력한 다음 11010001b을 출력한다그러므로 비트 값인 0xd0 DS1037의 쓰기 주소, 0xd1 DS1037의 읽기 주소로 생각할 수도 있다.

 

I2버스 규격은 I2버스의 전기적 특성 및 타이밍과 함께 앞에서 설명한 시작 조건정지 조건주소 지정 방법 등에 대해서만 규정하고 있다구체적인 통신 방법즉 매스터가 슬레이브의 주소를 출력한 다음 정지 비트를 출력할 때까지 주고 받는 데이터의 바이트 수슬레이브의 내부 레지스터 주소 지정 방법 등은 슬레이브 장치에 따라 달라진다매우 다양한 종류의 I2슬레이브 장치가 있으니 여러 가지 다양한 방법이 있을 수 있다.

 

대부분의 마이크로컨트롤러는 I2인터페이스를 지원한다그렇기 때문에 UART를 사용할 때와 비슷하게 I2관련 몇 개의 레지스터를 설정한 후 레지스터 읽기/쓰기를 통해 간단하게 I2통신을 실행할 수 있다마이크로컨트롤러가 I2인터페이스를 지원하지 않으면 프로그램을 통해 비교적 쉽게 I2프로토콜을 구현할 수 있다·수신 타이밍을 정확하게 맞추어야 하는 비동기 통신과 달리 매스터가 출력하는 클럭에 맞추어 모든 동작이 이루어지므로 타이밍에 관련된 어려움이 특별히 없기 때문이다.

 

I2통신의 예

직렬 EEPROM, ADC, DAC, RTC 등을 포함한 다양한 매우 장치들이 I2인터페이스를 지원하고 있다. I2슬레이브 장치와 통신을 하려면 그 슬레이브의 데이터쉬트를 참고하여 구체적인 통신 방법을 이해해야 한다다음 그림은 24LC64라는 64 Kbit 직렬 EEPROM의 내부 데이터를 읽기 위한 여러 방법 중 하나이다.

 

<v></v>

24LC64의 주소는 1010A2A1A0b로 정해져 있다 4 비트는 1010로 고정되어 있지만 뒤의 3 비트 A2A1A0는 사용자가 임의로 바꿀 수 있다.주소의 마지막 3 비트를 사용자가 조절할 수 있도록 24LC64는 이 3 비트에 각각 대응되는 3 개의 입력 핀 A2, A1, A0을 가지고 있다주소의 일부를 사용자가 정하도록 만든 것은 24LC64에 여러 가지 다른 주소를 부여할 수 있도록 하기 위한 것이다만일 24LC64의 주소가 완전히 고정되어 있다면 I2매스터가 구동할 수 있는 24LC64 1 개뿐이다.

 

위의 그림은 24LC64의 저장된 값을 특정 주소부터 연속으로 읽는 방법이다맨 먼저 매스터는 시작 조건을 출력한 다음 24LC64 7 비트 주소를 출력하고 8 번째 비트로 ‘0’을 출력하여 다음 동작이 쓰기라는 것을 알린다매스터가 지정한 주소와 동일한 주소를 가진 24LC64가 있다면 그 IC ACK을 출력하여 매스터에게 응답한다. ACK을 받은 매스터는 이어서 24LC64의 저장 공간 중에서 자신이 원하는 주소를 MSB부터 연속해서 출력한다. 24LC64의 저장 용량은 64 Kbits,  8 K 바이트이므로 내부 주소 지정을 위해서는 13 비트의 주소 정보가 필요하다그러므로 매스터는 두 번에 걸쳐 주소를 출력한다매 바이트를 받을 때마다 24LC64는 매스터에게 ACK을 보낸다.

 

24LC64 내부의 주소를 출력한 후 ACK을 받으면 매스터는 시작 조건과 슬레이브 주소를 다시 한 번 더 출력한다그런데 이번에는 매스터가24LC64의 데이터를 읽을 차례이므로 7 비트 슬레이브 주소 다음에 오는 8 번째 비트는 ‘1’로 설정한다. 24LC64가 다시 매스터에게 ACK으로 응답하면 그 다음부터 매스터는 24LC64가 출력하는 데이터를 연속해서 읽는다. 24LC64의 출력을 1 바이트 받을 때마다 매스터는 ACK을 출력하여 이를 24LC64에게 알린다. ACK을 받은 24LC64는 내부에서 주소를 1 증가시키고 새로운 주소의 데이터를 읽어서 다음 SCL 클럭에 맞추어 출력하게 된다데이터를 연속해서 수신한 매스터는 자신이 원하는 마지막 데이터를 받으면 이번에는 NACK을 출력하고 이어 정지 조건을 출력하여 통신을 끝낸다.

 

위의 예는 I2통신을 사용하는 24LC64를 사용하기 위한 많은 방법들 중 하나일 뿐이다. I2인터페이스를 가진 장치마다 사용법이 다르기도 하거니와 한 장치에서도 명령의 종류에 따라 다양한 방법이 있을 수 있다.

 

I2C의 장·단점

I2버스의 가장 큰 장점으로 슬레이브 장치의 수에 관계 없이 두 가닥의 선만으로 매스터와 슬레이브 사이의 양방향 통신이 가능하다는 것을 들 수 있다두 개 이상의 매스터를 사용할 수 있다는 사실은 I2버스가 가진 또 다른 장점이다.

 

반면에 I2버스의 양방향 특성은 오픈 드레인 구조에 기반을 두고 있으므로 근본적으로 동시 양방향 통신이 불가능하고 통신 속도를 높이기 어렵다표준 모드에서 I2통신의 최대 속도는 100 kHz이며 고속 모드에서는 최고 400 kHz까지 가능하다다른 동기 통신 프로토콜예를 들어 뒤에서 설명할 SPI와 비교하면 매우 낮은 속도이므로 I2버스는 저속 주변 장치와의 데이터 통신이나 주변 장치의 동작 모드 설정 등의 용도로 많이 쓰인다동작 모드 설정은 사용 빈도가 높지 않기 때문에 낮은 속도가 별 문제가 되지 않는다.

 

I2인터페이스를 사용하는 제품의 수는 무척 많은 반면 슬레이브의 주소는 7 비트로 그 길이가 제한되어 있어서 다수의 슬레이브 장치를 사용할 때 슬레이브 주소가 충돌할 가능성이 있다이런 문제에 대한 해결책으로 슬레이브 주소의 하위 2 ~ 3 비트를 사용자가 임의로 설정할 수 있는 제품들이 많기는 하지만 주소가 7 비트로 제한되어 있어서 근본적인 해결책이 될 수는 없다.

 

출처 : http://blog.naver.com/eslectures?Redirect=Log&logNo=80137860924

 

Posted by 너를위한노래

댓글을 달아 주세요

Quadrotor20132013. 3. 13. 18:01

 

원래 네이버 블로그에 있는 글을 모두 옮겨오려고 했지만.. 굳이 그럴 필요 없을거 같아서 이 글에 제목과 링크만 올려두겠습니다.

 

네이버 블로그 주요 포스팅:

쿼드콥터 초기 계획안 

재료, 부품 구매 현황

MPU-6050 3축 자이로 + 3축 가속도 센서 구매 

[스크랩]오일러각 

[스크랩] I2C (Inter-Integrated Circuit) 버스 

[스크랩]칼만 필터(Kalman Filter) - Part 1 : Linear Systems | Robotics 

[스크랩]칼만 필터(Kalman Filter) - Part 2 : Kalman Filter & Algorithm | Robotics 

 

 

현재는 가속도, 자이로 센서 값을 이용해서 칼만필터로 융합한 다음, Q행렬, H행렬을 조정하는 단계입니다.

 

 

노랑, 자주 : 가속도

빨강, 초록 : 가속도 + 자이로 using 칼만필터

 

여러가지 상황에 대해 테스트하고 있는데 쿼드콥터 진동이 장난이 아니더라구요.. ㅠ

 

어느 정도는 칼만필터로 보정할 수 있겠거니~ 했는데 이건 너무 심해서 기구적으로 손을 보고 있습니다.

 

그래서 스펀지로도 방진 해보고 고무줄로 진동을 줄여보고자 노력했지만 별로 효과는 없더라구요..

 

   

 

 RPM은 모두 동일

   

 스펀지 장착

 고무줄 장치 장착

 

위의 테스트에서는 RPM이 낮은데 높게하면 +90도~-90도 화이트노이즈수준으로 심하게 감지되더라구요 ㅠ

모터랑 센서가 싸구려라 그런가... ㅠ

 

아예 모터에서 발생하는 진동을 제거하는 방향으로도 해봐야겠습니다.

 

 

안드로이드 소스파일(accel gyro Kalman Filter, PWM generate):

SimpleAnalogInputActivity.java

GraphView.java

Matrix.java

SnowCube.java

SnowRenderer.java

 

 

 

 

Posted by 너를위한노래

댓글을 달아 주세요

  1. GTS

    고무줄을 이용한 방진장치.. 작은 키캠에 사용하기엔 정말 딱일것 같습니다. 고무줄을 조금 느슨하게 하면 조금이라도 진동을 흡수하지않을려나요?ㅎㅎ

    2013.04.01 22:45 [ ADDR : EDIT/ DEL : REPLY ]
    • 아 네이버 블로그에 있던 그 학생이시군요~ 현재 고무줄도 조금 느슨하게 바꿨고 중간 센서 밑에 납으로된 추도 달아 놨는데.. 자잘한 진동에는 효과있을지 몰라도 큰 진동에는 역시 변화가 없네요.. ㅠ 일단 자세제어부터 하고 다시 손 봐야겠습니다. ㅠ

      2013.04.02 13:17 신고 [ ADDR : EDIT/ DEL ]