정보나눔

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

자전거 안전장치를 만들고 있습니다. 도움 부탁드립니다.
박근호 | 2016-08-30

저는 초등 5학년이고 자전거 안전 장치를 아두이노로 만들고 있습니다. 몇가지 해결되지 않는 문제들이 있어 도움을 받고 싶습니다.

1. 홀센서와 자석을 이용하여 핸들 회전을 감지하여 알려주는 방향지시등을 만들려고 하는데 정확하게 인지가 되지 않습니다. 만들려고 하는 장치는 대략 이렇습니다.

자전거 고정부에 자석을 부착하고 핸들 회전부에 홀센서4개를 위치를 달리하여 부착합니다. 핸들이 돌아갈때 각 위치에 있는 홀센서가 자석을 인지하고 홀센서 위치별로 좌회전, 우회전, 급좌회전(회전이 많이 되었을 때), 급우회전으로 신호를 주어 led 및 부저로 나타내도록 하려고 합니다. 그런데 가끔씩 홀센서에서 신호를 잘못주는 경우가 발생합니다. (신호를 줘야할때 주지않거나 주지 않아야 할때 준다거나 등) 사용하는 홀센서는 2SS52M이며 사용중인 프로그램 언어는 S4A(Scrach for arduino)입니다. 방과후 아두이노 선생님께서는 스크래치보다는 C(스케치)를 사용하는게 정확도를 높일 수 있다고 하는데 정말 스크래치로는 안되나요?

2. 자전거를 타던 사람이 넘어졌을 시 가속도 센서를 이용하여 감지해서, 보호자에게 자동으로 연락하는 서비스를 추가하고 있습니다. 그런데 가속도 센서가 감지하는 각도 값이 제대로 출력되지 않고, 0에서 점점 줄어들다가 잠시후 -135로 고정되어 출력됩니다. 소스코드는 다음과 같습니다. 인터넷에서 찾은 코드들을 연결해 만들었습니다.


#include

#include

SoftwareSerial BTSerial(2, 3); //Connect HC-06. Use your (TX, RX) settings

const int MPU = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

double angle = 0, deg ; // angle, deg data
double dgy_x ; //double type acc data

char buff[100];

void setup() {

  Serial.begin(9600);
  BTSerial.begin(9600);  // set the data rate for the BT port


  Wire.begin();

  Wire.beginTransmission(MPU);

  Wire.write(0x6B);  // PWR_MGMT_1 register

  Wire.write(0);     // set to zero (wakes up the MPU-6050)

  Wire.endTransmission(true);


}
void loop() {
  // BT –> Data –> Serial
  if (BTSerial.available())
    Serial.write(BTSerial.read());
  // Serial –> Data –> BT
  if (Serial.available())
    BTSerial.write(Serial.read());
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 14, true); // request a total of 14 registers
  AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  deg = atan2(AcX, AcZ) * 180 / PI;     // rad to deg


  dgy_x = GyY / 131. ;                                          //16-bit data to 250 deg/sec
  angle = (0.95 * (angle + (dgy_x * 0.001))) + (0.05 * deg) ;   //complementary filter
  sprintf(buff, "%d", angle);

  BTSerial.println(angle);
  Serial.println(angle);
  delay(50);
}

3.2번 문제의 시스템에서 보호자에게 연락하는 방식은 아두이노에서 블루투스로 자전거를 타고있던 사람의 스마트폰과 통신을 해서, 그 스마트폰에서 보호자에게 메세지를 보내는 방식입니다. 그런데 아두이노에서 스마트폰으로 가속도센서의 각도 값을 보낼 때 아스키 코드로 보내집니다. 이를 변환할 수 있는 방법이 있을까요?

이전글   |    인생에 "한번 더"란 없다 2016-08-30
다음글   |    아날로그 핀을 이용하여 lcd를 나타내고 싶습니다.... 2016-08-30