아두이노 자이로센서
페이지 정보
작성자 dkdk 작성일20-11-30 16:17 조회13,237회 댓글4건본문
안녕하세요!! 네이버에 자이로 많은 지식인 답변보고 이렇게 글을 작성하게 되었습니다.
저는 자이로 센서로 얻은 센서 값을 블루투스로 보내고 싶습니다.
자이로센서 센서값은 #include "Wire.h"
#include "MPU6050.h"
#include "I2Cdev.h"
#define pi 3.141592
#define RADIANS_TO_DEGREES 180/3.14159
#define fs 131.0;
MPU6050 mpu;
int16_t ax,ay,az;
int16_t gx,gy,gz;
int16_t mx,my,mz;
//자이로(각속도)
float gyro_x, gyro_y;
//최종 가속도,자이로 각도
float accel_x, accel_y;
float gyro_angle_x=0, gyro_angle_y=0;
//상보필터 거친 각도
float angle_x=0,angle_y=0,angle_z=0;
//자이로센서 바이어스값
float base_gx=0, base_gy=0, base_gz=0;
unsigned long pre_msec=0;
void calibrate(){
int loop =10;
for (int i=0;i<loop;i++)
{
mpu.getMotion9(&ax,&ay,&az,&gx,&gy,&gz,&mx,&my,&mz);
base_gx += gx;
base_gy += gy;
base_gz += gz;
delay(80);
}
base_gx /=loop;
base_gy /=loop;
base_gz /=loop;
}
void setup() {
Wire.begin();
Serial.begin(9600);
mpu.initialize();
calibrate();
}
void loop() {
//단위시간 변화량
float dt = (millis()-pre_msec)/1000.0;
pre_msec = millis();
mpu.getMotion9(&ax,&ay,&az,&gx,&gy,&gz,&mx,&my,&mz);
//가속도값 아크탄젠트->각도변환
accel_x = atan(ay/sqrt(pow(ax,2) + pow(az,2)))*RADIANS_TO_DEGREES;
accel_y = atan(-1*ax/sqrt(pow(ay,2) + pow(az,2)))*RADIANS_TO_DEGREES;
//자이로 -32766~+32766을 실제 250degree/s로 변환
//앞에서 계산한 오차의 평균값을 빼줌
gyro_x = (gx-base_gx)/fs;
gyro_y = (gy-base_gy)/fs;
//변화량을 적분
gyro_angle_x = angle_x + dt*gyro_x;
gyro_angle_y = angle_y + dt*gyro_y;
//상보필터
angle_x = 0.95*gyro_angle_x + 0.05*accel_x;
angle_y = 0.95*gyro_angle_y + 0.05*accel_y;
Serial.print(gyro_angle_x);
Serial.print(" ");
Serial.print(accel_x);
Serial.print(" ");
Serial.println(angle_x);
}
입니다. 이것은 인터넷으로 본 코드이구요 (출저를 남겨야하면 바로 남기도록 하겠습니다.) 저기서 Serial.print 부분을 블루투스로 전송하고 싶은데 어떤 코드들을 추가해야하는지 모르겠습니다.. 도와주시면 감사하겠습니다ㅠㅠㅠㅠ
댓글 : 4
조회수 : 13,237
master님의 댓글
master 작성일
https://www.google.com/search?ei=saTEX6PZOMPFmAW8z7awAw&q=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8+%EC%9E%90%EC%9D%B4%EB%A1%9C+%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4&oq=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8+%EC%9E%90%EC%9D%B4%EB%A1%9C+%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4&gs_lcp=CgZwc3ktYWIQAzIFCAAQzQIyBQgAEM0CMgUIABDNAjIFCAAQzQI6BAgAEEdQ0pQBWPOiAWCWpQFoAXACeACAAYABiAH2AZIBAzAuMpgBAKABAqABAaoBB2d3cy13aXrIAQjAAQE&sclient=psy-ab&ved=0ahUKEwjj9a_Q5KntAhXDIqYKHbynDTYQ4dUDCA0&uact=5
웹검색으로 원하는 것과 유사한 자료를 찾을 수 있는지 살펴보시고요
우노 경우에는 하드웨어 시리얼포트가 1개 뿐이라서 블루투스는 소프트웨어 시리얼을 사용해야 합니다.
https://www.google.com/search?ei=x6TEX4OIMo_U0gTc176oAw&q=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8+%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4&oq=%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8+%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4&gs_lcp=CgZwc3ktYWIQAzICCAAyAggAMgIIADICCAAyAggAMgIIADICCAAyAggAMgIIADICCAA6BQgAEM0COgYIABAHEB5Q2ZUFWNOXBWDkmgVoAHAAeACAAXWIAbQDkgEDMC40mAEAoAEBqgEHZ3dzLXdpesABAQ&sclient=psy-ab&ved=0ahUKEwjDh-ja5KntAhUPqpQKHdyrDzUQ4dUDCA0&uact=5
이 또한 예제가 많이 있으니 조금만 공부하면 어렵지 않을겁니다.
dkdk님의 댓글
dkdk
저 예제들에서 블루투스 소스 코드를 추가하면 될까요...?ㅜㅜ
master님의 댓글
master
https://devicemart.blogspot.com/2019/04/hc-06.html
이 예제를 기준으로 간단하게 설명해드리죠
회로 연결은 예제를 참고하시고
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 10); // HC-06 TX=11번핀 , RX=10번핀 연결
코드 상단에 헤더파일 추가합니다.
mySerial.begin(9600); // 통신 속도 9600bps로 블루투스 시리얼 통신 시작
셋업 함수에 소프트웨어 시리얼 설정을 합니다.
블루투스에서는 수신없이 송신만 하면 되므로 루프 함수 코드는 간단합니다.
기존 시리얼모니터 출력 내용과 비슷하게 출력하면 됩니다.
Serial.print(gyro_angle_x); Serial.print(" "); Serial.print(accel_x); Serial.print(" "); Serial.println(angle_x); // 시리얼모니터
mySerial.print(gyro_angle_x); mySerial.print(" "); mySerial.print(accel_x); mySerial.print(" "); mySerial.println(angle_x); // 블루투스
dkdk님의 댓글
dkdk
정말 감사합니다...ㅜㅜ 보내주시 링크들과 답변 열심히 공부해서 코드를 완성해 보도록 하겠습니다!!ㅜㅜ