?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

IMU센서로 인해 발생하는 노이즈는 어떻게 줄여야되나요?

페이지 정보

작성자 김달영 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일15-08-13 13:09 조회3,765회 댓글3건

본문

지금 IMU(mpu6050)센서와 Flex센서를 이용해서 로봇팔을 블루투스로 원격으로 제어를 하고있습니다.
그런데 아무런 신호를 주지않아도 지금 블루투스의 마스터보드를 키키만 하면 서보모터의 노이즈가 발생한는데 제생각으로는 소스를 수정해야할거같은데 어떻게 해야할까요??
아래에 소스를 첨부헸습니다.

마스터보드 소스

const int MPU=0x68; //MPU 6050 의 I2C 기본 주소
const int pinFlex = A0;
int SW=5;

int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

void get6050();

byte xpos;
byte ypos;
byte zpos;
byte button;

void setup()
{
bts.begin(9600);

Wire.begin(); // Wire 라이브러리 초기화
Wire.beginTransmission(MPU); // MPU로 데이터 전송 시작
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // MPU-6050 시작 모드로
Wire.endTransmission(true);
pinMode(SW,INPUT);

Serial.begin(9600);

}

void loop(){
get6050(); //
button=digitalRead(SW);
xpos=map(AcY,-16383,16383,50,90); // pin10 // 60:90 degree 80:120 degree 100~:180 degree
bts.write(xpos);

ypos=map(AcY,-16383,16383,60 ,180); // pin 11
bts.write(ypos);

zpos=map(AcX,-16383,16383,0,180);
bts.write(zpos);

int flexValue;
byte flex_in;
flexValue = analogRead(pinFlex);
flex_in = map(flexValue, 350, 650, 10, 80 );
bts.write(flex_in);
bts.write(button);

Serial.print("xpos = "); Serial.println(xpos);
Serial.print("ypos = "); Serial.println(ypos);
Serial.print("zpos = "); Serial.println(zpos);
Serial.print("flex_in = "); Serial.println(flex_in);
Serial.print("button = "); Serial.println(button);

delay(200);
}

void get6050() {
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU,14,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
Tmp=Wire.read()<<8|Wire.read();
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
GyZ=Wire.read()<<8|Wire.read();
}

슬레이브소스
#include
#include
#include
SoftwareSerial bts(2,3);
Servo servox; //세번째모터
Servo servoy; //두번째모터
Servo servoz; //첫번째모터(맨아래)
Servo myServo;
byte xpos;
byte motor_data[5];
void setup()
{
bts.begin(9600);
Serial.begin(9600);
servox.attach(10); //위아래
servoy.attach(11); //위아래
servoz.attach(9); //좌우
myServo.attach(6);
servoy.writeMicroseconds(70);
servox.writeMicroseconds(70);
servoz.writeMicroseconds(70);
}
void loop(){
if(bts.available())
{
xpos = bts.readBytes(motor_data,5);
}
Serial.print("xpos : "); Serial.print(motor_data[0]);
Serial.print(" ypos : "); Serial.print(motor_data[1]);
Serial.print(" zpos : "); Serial.println(motor_data[2]);
Serial.print(" flex : "); Serial.println(motor_data[3]);
if(motor_data[4]==1){
servoz.write(motor_data[2]);
}
else if (motor_data[4]==0){
servox.write(motor_data[0]);
servoy.write(motor_data[1]);
myServo.write(motor_data[3]);
}

delay(200);
}

댓글목록

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

저도 가끔 서보모터 쓸 때 노이즈가 발생하곤 하는데 아래 하드웨어적인 부분들을 살펴보는 것이 우선일 것 같습니다.
1. 서보모터에 충분한 전류가 공급되는지 => 마이크로 서보모터의 경우는 2개 이상일 때, 이보다 용량이 큰 서보모터는 충분한 전원이 공급되어야 함
2. USB 케이블 문제 => 저가 USB 케이블은 전류를 감당하지 못하는 경우도 있는듯 합니다. 마이크로 서보모터 달랑 하나 붙여 쓰는데도 노이즈가 발생하길래 이리저리 확인해보니 아두이노에 붙인 USB 케이블 문제였습니다. USB 케이블을 교체하거나 아두이노용 어댑터 등을 통해 외부 전원을 사용하면 해결됩니다.
3. 기타 점퍼선, 납땜 등 연결상태 확인

이런것들 먼저 확인하시고 소스는 간단한 서보모터 테스트 소스를 올려 확인해보세요.

김달영님의 댓글

김달영 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

지금 서보모터를 4개사용하고있는데 각 서보모터당 AA건전지를 직렬로 4개씩 연결시킨 독립전원을 각각 사용하고 있고  지금 IMU센서와FLEX센서 블루투스가 있는쪽에도 AA건전지 4개를 직렬로 연결시키고 있습니다. 납땜이랑 점퍼선은 다 확인하였습니다.
전원에 문제는 아닌것같습니다.

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

SW적인 문제로 판단되신다면 아래 내용을 참고해보세요.
http://electronics.stackexchange.com/questions/77502/is-there-a-way-to-stop-servos-from-shaking
PWM 여러개를 사용하고 SoftwareSerial을 사용하므로 깨끗한 PWM 신호를 위해 인터럽트를 끄고 서보를 돌리는 방법을 얘기하고 있습니다. 통신 데이터 수신에 영향이 있을 수도 있을것 같긴 합니다만...
아니면 별도의 서보모터 제어용 PWM 모듈을 이용하는 것도 좋지 않을까 싶습니다.

아래와 같이 커패시터를 연결해주는 방법도 있다고하니 참고하세요.
http://letsmakerobots.com/content/how-reduce-servo-noise

정확히 뭐가 문제인지는 잘 모르겠습니다;;;