정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

GY-521 MPU 6050 모듈 사용하기 글 관련 질문드립니다.
남현준 | 2015-07-08

GY-521 MPU 6050 모듈 사용하기 (http://kocoafab.cc/tutorial/view/239) 글 관련 질문 드립니다.
안녕하세요!
첫번째 예제는 잘됬습니다. 감사합니다.
두번째 예제에서 앞의 코드를 아두이노를 통해서 업로드 시키고 난 다음에 그대로 꼽아놓고,
프로세싱이라는 프로그램을 다운받아서 위쪽에 적혀있던 프로세싱 코드를 거기에 복사하고 실행해봤더니 하얀색 화면만 나오다가 응답없음이 출력됩니다.
그리고 다시 프로세싱의 하단을 보니
java.lang.ArrayIndexOutOfBoundsException: 1
라는 에러가 발생했다고 출력됩니다.
어떻게 해결하나요?

프로필사진

SaBo 2015-07-08 16:52:10

프로세싱에 관련해서는 7월 10일에 답변 드릴 수 있을 것 같습니다...(프로세싱 다루시는 담당자분이 연수를가시는바람에..)

프로필사진

수박쨈 2015-07-10 11:45:30

프로세싱에서 생기는 이 에러는 java.lang.ArrayIndexOutOfBoundsException:

존재하지 않는 배열을 참조할 때 생기는 에러입니다.

 

프로세싱 코드를 보면 상단부 쪽에 이런 코드가 있는데 포트번호 배열 중에서 인덱스가 1인 배열에 있는 포트번호와 연결한다는 코드 입니다.

하지만 아두이노 상에서 배열 인덱스는 0부터 시작합니다. 즉 인덱스가 1이라면 두 번째 포트 번호와 통신한다는 소리인데

 

근데 시리얼 포트로 연결된 번호가 1개 있다면 (아두이노와 연결된 포트 1개)

아래 소스에 있는 1을 0으로 바꿔주시면 에러는 뜨지 않습니다.

 

String portName = Serial.list()[1];

프로필사진

김달영 2015-09-10 11:26:19

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

아래에 소스를 첨부헸습니다.

마스터보드 소스

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);
}

이전글   |    코딩문의 드려요~~ 2015-07-06
다음글   |    DHT11 에러 체크해주세요 2015-07-08