Gyro sensor

[드론] 자이로 센서는 가속도를 측정하는 가속도 센서와 달리 각속도를 측정한다 . 자이로스코프( Gyroscope )가 각속도를 측정하는 기구인데  MEMS  기술을 적용한 칩 형태의 자이로센서도 각속도를 측정한다. 각속도는 시간당 회전하는 각도 를 의미한다. 자이로 센서의 측정원리는 다음과 같다. 예를 들어, 수평한 상태(정지 상태)에서 각속도도 0도/ sec 이다. 물체가 10초 동안 움직이는 동안 50도만큼 기울어졌다면, 10초 동안의 평균 각속도는 5도/ sec 다. 정지 상태에서 기울어진 각도 50도를 유지하였다면 각속도가 0도/ sec 가 된다. 이러한 과정을 거치면서 각속도는 0 → 5 → 0으로 바뀌었고, 각도는 0도에서 증가해서 50도가 되었다. 각속도에서 각도를 구하려면 전체 시간에 대해 적분을 해야 한다. 자이로 센서는 이와 같이 각속도를 측정하므로 전체 시간동안 이 각속도를 적분하면 기울어진 각도를 계산할 수 있다. 그런데 자이로 센서는 온도의 영향으로 오차가 발생하며, 오차가 적분 과정에서 누적되어 최종 값이 드리프트( drift )되는 현상이 생긴다. 따라서 자이로는 온도센서도 함께 사용해서 오차를 보상해야 한다. 정지상태의 긴 시간의 관점에서 보면 가속도 센서에 의해 계산된 기울어진 각도는 올바른 값을 보여주지만 자이로 센서에서는 시간이 지날수록 틀린 값을 보인다. 반대로, 움직이는 짧은 시간의 관점에서 자이로 센서는 올바른 값을 보여지만 가속도 센서는 기울어진 각도와는 다른 계산 값이 나올 수 있다. 따라서 가속도센서와 자이로센서를 모두 사용해서 각각의 단점을 보상할 수 있는 알고리즘을 적용해서 롤 또는 피치 값을 계산한다. 많이 적용하는 보상 방법 및 필터링으로는 칼만 필터가 있다. [네이버 지식백과]   Gyro Sensor  - 자이로 센서 (지형 공간정보체계 용어사전, 2016. 1. 3., 구미서관)

EBIMU-9axis

ASCII 출력   ASCII ( American   Standard   Code   for   Information   Interchange ) 각 문자를 7비트로 표현하므로 총 128(=2^7)개의 문자를 표현할 수 있다. ASCII  문자 코드는 [표 2-6]과 같다. 표를 보는 방법은 해당 문자의 왼쪽에 있는 2진 코드가  ASCII  코드가 되는 것인데, 예로 문자 ‘A’의 왼쪽에 있는 1000001이 ‘A’의  ASCII  코드가 된다. 네이버 지식백과 http://terms.naver.com/entry.nhn?docId=2270339&cid=51173&categoryId=51173 UART 범용 비동기화 송수신기(Universal asynchronous receiver/transmitter) 병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송하는 컴퓨터 하드웨의의 일종이다. UART는 일반적으로 EIA RS-232, RS-422, RS-485와 같은 통신 표준과 함께 사용한다. UART의 U는 범용을 가리키는데 이는 자료 형태나 전송 속도를 직접 구성할 수 있고 실제 전기 신호 수준과 방식이 일반적으로 UART 바깥의 특정한 드라이버 회로를 통해 관리를 받는다는 뜻이다. 통신 데이터는 메모리 또는 레지스터에 들어 있어 이것을 차례대로 읽어 직렬화 하여 통신한다. 최대 8비트가 기본 단위이다. UART는 일반적으로 컴퓨터나 주변 기기의 일종으로 병렬 데이터를 직렬화 하여 통신하는 개별 직접 회로이다. 비동기통신이므로 동기 신호가 전달되지 않는다. 따라서 수신 쪽에서 동기통신을 찾아내어 데이터의 시작과 끝을 시간적으로 알아서 처리할 수 있도록 약속되어 있다. 디지털 회로는 자체의 클럭 신호를 사용하여 정해진 속도로 수신 데이터로 부터 비트구간을 구분하고 그 비트의 논리 상태를 결정하여 데이터 통신을 한다...

인터럽트

인터럽트 -loop()문이 반복적으로 동작 되고 있는 도중, 일시 중단하고 다른일을 처리하는 기능 -아두이노에서 사용가능한 인터럽트 타이머 인터럽ㅌ, 욉 인터럽트, 시리얼통신 인터럽트 등 혹은 라이브러리 추가시 스케치->라이브러리 포함하기->라이브러리 관리 에서 다운로드 MsTimer2 library 인터럽트 설정 MsTimer2::set(unsigned long ms, void(*f)()) ms: 인터럽트 시간, 밀리초 void(*f)() : 인터럽트 분기 함수명 인터럽트 시작 MsTimer2::start() 인터럽트 정지 MsTimer2::stop() 예제 #include<MsTimer2.h>   /*외부 라이브러리를 불러온다*/ int swState = LOW; int ledState = LOW; int ledFlag = HIGH; void setup(){   pinMode(7,INPUT_PULLUP);   pinMode(12,OUTPUT);   MsTimer2::set(500,flash);   /*500msec 주기로 flash 함수로 갔다온다*/   MsTimer2::start(); } void flash(){   /*인터럽트 분기함수*/   if(ledState ==HIGH){     digitalWrite(12,ledFlag);     ledFlag = !ledFlag;   }else if(ledState ==LOW){     digitalWrite(12,LOW);   } } void loop(){   if(digitalRead(7) == LOW && swState == LOW){ ...

전자 카운터 만들기

int count = 0; void setup(){   pinMode(7, INPUT_PULLUP);   pinMode(12, OUTPUT);   Serial.begin(9600); } void loop(){   int swState = digitalRead(7);   if(swState == LOW){     digitalWrite(12, HIGH);     count++;   }else{     digitalWrite(12, LOW);   }   Serial.println(count); } count를 0으로 설정하고 위와 같이 7,12 를 설정한다 이때 serial 통신을 위하여 void setup에 선언을 해주고 loop문에서 swState 값을 7번 핀에서 읽어 온다. 만약 swState가 LOW라면 불이 들어오고 count에 +1씩 숫자를 더해라 그렇지 않으면 그냥 불을 꺼라 라고 명령을 주고 통신을 보게 되면 1ms 마다 숫자가 올라가는 것을 볼 수 있다. 이러한 현상을 Bouncing 현상이라고 한다. 해결방법은 디 바운싱을 걸어주면 되는데, int swState = LOW; int lastSwState = LOW; int ledState = LOW; int count = 0;/*기본 선언*/ void setup(){   pinMode(7,INPUT_PULLUP);   pinMode(12,OUTPUT);   digitalWrite(12,ledState);/*핀모드 설정과 12번을 ledState로 설정*/   Serial.begin(9600); } void loop(){   swState = digitalRead(7);/*스위치의 상태는...

led응용

int swState = LOW; int ledState = LOW; void setup(){   pinMode(7, INPUT_PULLUP);   pinMode(12,OUTPUT); } void loop(){   if(digitalRead(7) == LOW && swState == LOW){     swState = HIGH;   }else if(digitalRead(7) == HIGH && swState == HIGH){     swState = LOW;     ledState = !ledState;      }   if(ledState == HIGH){     digitalWrite(12,HIGH);   }else if(ledState == LOW){     digitalWrite(12,LOW);   } } 스위치와 led의 상태를 LOW로 정의한다. 이후 pinMode를 셋업한다. loop문에서 7번핀의 상태와 스위치의 상태를 본다면, 7번의 상태는 LOW이고 스위치의 상태도 LOW이다. 그래서 처음의 조건을 만족시키는데 이때는 swState를 HIGH로 만들어 주는 것이다. 그다음 if문을 보게 된다면 ledState를 확인할 수 있는데 만약 ledSteate가 HIGH라면 12번 핀 즉 led에 들어가는 전원을 HIGH값으로 보내는 것 이다.(그래야 불이 들어온다) 그렇게 되면 led의 불은 계속 들어와 있는 상태가 되는데, 이때 한번 더 누르게 되면, 첫번째 if문에서 첫번째 줄의 조건을 만족할 수 없다. 그래서 else if 문으로 들어가게 되는데 이때의 7번핀의 값과 swState는 불이 들어와 있는 상태이기 때문에 HIGH값이다. 그다음 i...

PULLDOWN 예제

int ledPin = 12; int switchPin = 7; void setup(){   pinMode(ledPin, OUTPUT);   pinMode(switchPin, INPUT_PULLUP);  }  void loop(){ int swState = digitalRead(switchPin); if(swState == HIGH){   digitalWrite(ledPin, LOW); }else{   digitalWrite(ledPin, HIGH); }  } 12번 핀과 7번 핀을 int (integer : 자연수)로 지정해준다 이후 void setup을 통해 각각의 핀모드를 설정해준다. loop문에서 swState를 switchPin에서 읽어오는 값 즉, PULLUP으로 설정된 7번핀에서 읽어오는 값 이므로 회로가 오픈된 상태가 HIGH상태(1)이고 이때 값을 swState라 한다. if문을 이용하여 HIGH값에는 led출력을 LOW로 두고 LOW값에는 led의 출력을 HIGH로 두어 버튼을 누를때 마다 불이 들어오게 하는 것 이다.

시리얼 통신, if, int, Floating, Pull-Down, Pull-Up

void setup () {   pinMode(7, INPUT);   pinMode(9, OUTPUT); } void loop(){   int swState = digitalRead(7);   if(swState == HIGH){     digitalWrite(9, HIGH);    }else{     digitalWrite(9, LOW);    } } Serial 통신이란 아두이노와 대화 하는것 시리얼 모니터를 통해서 상태를 확인 가능하고 loop문 안에 print를 해주면 되는데 뒤에 ln은 라인을 바꾸는 명령이다. if 조건문은 소괄호() 안에 조건을 넣어준다. 그 뒤 만약 소괄호 안에 조건을 만족하면 중괄호 안의 동작을 취하라는 명령이며 그 다음 else는 만약 소괄호 안에 있는 조건이 아니라면 다음과 같은 동작을 취하라는 뜻이다. 스케치를 재확인 해봐도 잘못된게 없다면, 플로팅(Floating) 상태일 가능성이 크다 Floating(플로팅) 상태 = 아무것도 연결하지 않은 상태 해결방법 풀다운(Pull-Down) or 풀업(Pull-Up) 1. 풀다운 저항 풀다운이란 스위치를 On으로 했을때 디지털 회로의 값이 1 이라면 스위치를 Off로 했을때 회로값이 0이 되게 하는 저항이다. 2, 풀업 저항 풀업이란 스위치를 Off로 했을때 디지털 회로의 값이 0이라면 스위치를 On으로  했을때 회로값이 1이 되게 하는 저항이다.