안녕하세요. 현재 아두이노를 이용하여 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());
}
}
|