정보나눔

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

아두이노 서보모터 관련 질문 올립니다.
임혜성 | 2016-11-01

안녕하세요. 현재 아두이노를 이용하여 RC카를 구동하고자 하는 학생입니다.

다름이 아니라 DC모터와 서보모터를 사용하여 속도조절 및 방향전환을 하고자 하는데 이상이 생겨 조심스럽게 질문 올립니다.

문제점은 서보모터의 attach부분이 문제인데요.

myservo.attach(); 이 부분을 추가했을 경우와 아닌 경우에 따라 DC모터의 속도 조절에 차이가 생깁니다.

서보모터 코드 부분을 추가하지 않았을 경우 속도 조절은 잘 되지만,

attach라는 명령어를 사용하면 속도조절이 되지 않고 최고 속도로만 반응합니다.

아래 코드 첨부하였고, 굵고 진한 부분이 attach부분입니다.

정확한 답변 부탁드립니다. 감사합니다.

 

 

#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
#include <Servo.h>

int blueTx=2; //Tx(보내는핀 설정)
int blueRx=3; //Rx(받는핀 설정)

SoftwareSerial mySerial(blueTx, blueRx); //블루투스 통신을 위한 객체선언
String myString=""; //스마트폰에서 오는 문자를 위한 변수지저
String mySpeed="";  //Speed값 출력을 위한 변수지정

int DC_EN =10; //속도제어
int DC_IN1=6; //IN1과 IN2를 이용해 방향제어
int DC_IN2=8;
int DC_Speed=150; //EN핀에서 제어할 속도 설정 0~255

Servo myservo;
int pos=50; //서보모터의 초기값
int servoPin=9 ;
void setup()
{
  Serial.begin(9600); //시리얼 모니터 통신을 위한 개방
  mySerial.begin(9600); //블루투스 통신을 위한 개방
  
  pinMode(DC_IN2, OUTPUT);
  pinMode(DC_IN1, OUTPUT);
  pinMode(DC_EN, OUTPUT);

  myservo.attach(servoPin); //몇번 핀에서 제어신호가 오는지 알기위함(서보모터)
  myservo.write(pos); //중앙 위치 시작을 위한 출력
}
void loop() 
{
  //스마트폰에서 들어오는 값을 읽음
  while(mySerial.available())
  {
    char myChar = (char)mySerial.read();  //값을 받아 Char형식으로 변환
    myString += myChar;
    delay(5);
  }
  
  //들어오는 값에 따라 알맞은 값 출력
  if(!myString.equals(""))
  {
    Serial.println("input value: "+myString); //시리얼 모니터에 출력
    
    //전진
    if(myString=="3")
    {
       DC_Speed +=10;  //10의 속도씩 증가
       analogWrite(DC_EN,DC_Speed); //모터에 전달
       digitalWrite(DC_IN1,HIGH);
       digitalWrite(DC_IN2,LOW);
       mySpeed = DC_Speed;  //Speed값 출력을 위한 값 전달
       Serial.println("speed:" +mySpeed);
    }

    //정지
    else if(myString=="4")
    {
       DC_Speed=245;  //10의 속도씩 증가
       analogWrite(DC_EN,DC_Speed); //모터에 전달
       digitalWrite(DC_IN1,LOW);
       digitalWrite(DC_IN2,LOW);
       Serial.print("speed:" +DC_Speed);
       mySpeed = DC_Speed;  //Speed값 출력을 위한 값 전달
       DC_Speed=150;
    }

    //후진
    else if(myString=="5")
    {
        DC_Speed += 10; //10의 속도씩 후진 가속
        analogWrite(DC_EN,DC_Speed);
        digitalWrite(DC_IN1,LOW); //모터의 역방향
        digitalWrite(DC_IN2,HIGH);
        mySpeed = DC_Speed;
    }

    //정지
    else if(myString=="6")
    {
       DC_Speed=245;  //10의 속도씩 증가
        analogWrite(DC_EN,DC_Speed); //모터에 전달
       digitalWrite(DC_IN1,LOW);
       digitalWrite(DC_IN2,LOW);
       Serial.print("speed:" +DC_Speed);
       mySpeed = DC_Speed;  //Speed값 출력을 위한 값 전달
       DC_Speed=150;
    }
    
    //서보모터 제어
    else if(myString=="7") //방향전환(좌회전)
    {
    if(pos>25)
    {
        pos-=20;
        myservo.write(pos);
      }
    }
    else if(myString=="8")  //방향전환(우회전)
    {
      if(pos<100)
      {
        pos+=20;
        myservo.write(pos);
      }
    }
    
    myString=""; 
  }

  //아두이노에서 출력되는 값을 스마트폰에 출력하기 위해 스마트폰에 버퍼값을 write하는 과정
  if(Serial.available())  //버퍼에 읽지 않은 데이터를 스마트폰에 write함.
  {
    mySerial.write(Serial.read());
  }
}

이전글   |    Klant 님께서 게시한 범죄예방목걸이 한번 따라해보고있는데요...... 2016-11-01
다음글   |    klant님 조언대로 하던 중 문의사항이 있어 다시 한 번 글 올립니다.... 2016-11-01