모터작동 이전까지는 값을 잘 출력하다가 모터를 켤 때마다 통신이 끊깁니다.
이렇게 한번 끊기고 나서는 통신을 재개하여도 보낸 데이터를 계속 보내는 현상또한 발생합니다. 좀 기다리면 새로운 데이터를 보내는데 이러면 또 몇초동안 같은 데이터를 반복하고 몇초 뒤 다른 데이터를 몇초동안 보내고 무한반복힙니다.
vertical horizontal 두 방향으로 모터에 센서 장착했고요 모터는 200W AC모터 사용합니다.
코드 첨부합니다.
#include <Wire.h> //horizontal
#define I2C_Address 0x53
//ADXL345 register address
#define POWER_CTL 0x2D
#define DATA_FORMAT 0x31
#define X_axis 0x32
#define Y_axis 0x34
#define Z_axis 0x36
#define Range_2g 0
#define Range_4g 1
#define Range_8g 2
#define Range_16g 3
void setup() {
Wire.begin(); // 센서 작동 시작
Serial.begin(9600); // 통신속도 9600으로 설정
Init_ADXL345(Range_4g);
Serial.println("CLEARDATA");
Serial.println("X,Y,Z");
}
void loop() {
//3축 출력
Serial.print("DATA,");
Serial.print(Read_Axis(X_axis));
Serial.print(", ");
Serial.print(Read_Axis(Y_axis));
Serial.print(", ");
Serial.print(Read_Axis(Z_axis));
Serial.println();
delay(20);
}
//I2C인터페이스를 통해 축을 읽음
int Read_Axis(byte a) {
int data;
Wire.beginTransmission(I2C_Address);
Wire.write(a);
Wire.endTransmission();
Wire.beginTransmission(I2C_Address);
Wire.requestFrom(I2C_Address, 2);
if (Wire.available()) {
data = (int)Wire.read();
data = data | (Wire.read() << 8);
}
else {
data = 0;
}
Wire.endTransmission();
return data;
}
//ADXL345 초기화
void Init_ADXL345(byte r) {
Wire.beginTransmission(I2C_Address);
//감도설정
Wire.write(DATA_FORMAT);
Wire.write(r);
Wire.endTransmission();
//측정모드로 전환
Wire.beginTransmission(I2C_Address);
Wire.write(POWER_CTL);
Wire.write(0x08);
Wire.endTransmission();
}
모터 노이즈의 의한 물리적인 노이즈 간섭이 아니고
단순히 제어 코드 문제라면요
제어 코드에서 모터를 읽는 구문이 동기인지 비동기인지, 탈출 조건이 있는지도 점검해 보세요
제어권을 마스터가 오롯이 가지는 등