정보나눔

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

블루투스로 서보모터 제어한 후 블루투스 연결 끊김
플라네테스 | 2018-01-22

블루투스로 2륜 자동차를 조정하는 코드를 짜고 있는데 스마트폰 앱으로 연결후 데이터를 날리면 서보모터가 동작한 후에 블루투스 연결이 끊켜버립니다. 뭐가 문제인지 도저히 알수가 없네요..

 

#include <SoftwareSerial.h>
#include <Stepper.h>
#include <String.h>
#include "Servo.h"

Servo myservo;
Servo myservo1;

SoftwareSerial hm10(10, 11); //RX, TX 연결
#define trig 8
#define echo 7

bool flag = true;
float duration, distance;
int sonar_sum;

int dis = 2000;


char data[10] = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' };
int motorspeed = 140;
byte leng;

void setup()
{
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  myservo.attach(5);  //왼
  myservo1.attach(3);  //오
  Serial.begin(9600);
  hm10.begin(9600);
}


void loop()
{
  // sonar();
  char temp[100];
  char mode[100];
  //int val[100];

  if (hm10.available())
  {
    leng = hm10.readBytes(temp, 20);
    Serial.print("Input data Lenght : ");
    Serial.println(leng);
    delay(5);
    for (int i = 0; i < leng; i++)
    {
      Serial.print(temp[i]);
      Serial.println("tmp");
      mode[i] = temp[i];
      delay(5);
    }
    delay(5);

    for (int i = 0; i < leng - 1; i += 2)
    {
      delay(5);
      char chr = mode[i + 1];
      int val;
      val = chr - '0';

      Serial.print(mode[i]);
      Serial.print("명령어");
      Serial.print("\t");
      Serial.print(val);
      Serial.println("값");
      delay(5);


      switch (mode[i])
      {
      case '7': mv_foward(val); break;
      case '8': mv_left(val);  break;
      case '9': mv_right(val); break;
      default:;
        delay(5);
      }


    }
    delay(5);
  }
}

void sonar()
{
  for (int i = 0; i < 10; i++) {


    digitalWrite(trig, HIGH);
    delay(10);
    digitalWrite(trig, LOW);

    // echoPin 이 HIGH를 유지한 시간을 저장 한다.
    duration = pulseIn(echo, HIGH);
    // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
    distance = ((float)(340 * duration) / 10000) / 2;   // 딜레이 (작동중지 시간)


    Serial.print(distance);
    Serial.println("cm");
    // 수정한 값을 출력
    delay(100);

    sonar_sum = +distance;
  }

}

void mv_foward(int val)
{
  sonar();
  Serial.println(sonar_sum);

  int sum = sonar_sum / 10;

  if (sum > 10) {
    Serial.println("move");
    Serial.println("foward");
    for (int i = 0; i < 10; i++) {
      Serial.println("for");
      if (val > i) {
        Serial.println("if");
        myservo.write(0);
        myservo1.write(180);
        delay(dis);
        mv_stop();
        delay(500);
      }
      else {
        break;
      }
    }
  }
  else {
    //소나걸림
        Serial.println("소나스톱");

  }
}


void mv_left(int val)
{
  myservo.write(180);
  myservo1.write(180);
  delay(dis);
  mv_stop();
}

void mv_right(int val)
{
  myservo.write(0);
  myservo1.write(0);
  delay(dis);
  mv_stop();

}
void mv_stop()
{
  myservo.write(95);
  myservo1.write(90);

}

 

 

프로필사진

수박쨈 2018-01-22 14:32:56

일단 아두이노 코드에서 블루투스의 연결을 끊는 코드는 없습니다.

그렇기 때문에 연결이 끊기는 문제는 코드의 문제로 보기 어렵습니다.

 

그렇다면 전기적 신호의 문제로 볼 수 있는데 

현재 코드를 보면 초음파센서, 서보모터 2개, 블루투스 모듈이 연결된 것을 알 수 있습니다.

(스테퍼모터는 연결되있는데 안쓰는건지, 연결도 안되있고 안쓰는건지는 모르겠네요,,)

 

저정도의 액츄에이터와 모듈이라면 순간적으로 서보모터가 움직이는 순간 전원 불안정으로 블루투스 모듈의 연결이 끊길 수 있습니다.

 

전원을 usb케이블로 사용한다면 어댑터를 사용해보시거나, 서보모터가 큰 제품이라면 서보모터의 직접 외부전원을 인가해도 좋습니다.

usb케이블을 사용할 경우 최대 전류는 500mA이고 어댑터를 사용할 경우 1A까지 사용가능합니다.

 

결론은 전원부의 문제로 보입니다.

프로필사진

플라네테스 2018-01-23 16:26:14

스텝모터 는 현재 사용하지 않고요

혹시나 해서 아두이노의 전원을 9v 건전지로 바꾸어도 같은 문제가 발생하네요

아두이노에 usb 로 전력공급을.. 블루투스에 6v (aa 건전지 4개)를 물리니까 정상적으로 작동됩니다.

 

전원문제인건 확실한거 같은데 전원을 두개나 쓰려니까 복잡해지네요.. 혹시 하나의 전원으로 쓸수 있는 방법이 없을까요?

 

 

이전글   |    컴파일오류 2018-01-21
다음글   |    조이스틱 센서쉴드 문의 2018-01-24