정보나눔

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

미키님 조언에 따라 실행했으나 잘 안되네요.. 회로 및 코드 올려서 질문 남기겠습니다..ㅠㅠ
임혜성 | 2016-11-02

아래 있는 회로에서 서보모터 GND 와 VCC를 모터 구동시키는 전압과 연결해도 속도조절이 되지 않습니다..

어떤 문제 때문에 그러는지 답변 부탁드립니다..ㅠㅠ

코드와 회로 첨부하여 올립니다. 감사합니다.

 

 

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

Servo myservo;

int pos=50; //서보모터의 초기값

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

SoftwareSerial mySerial(blueTx, blueRx); //블루투스 통신을 위한 객체선언
String myString=""; //스마트폰에서 오는 문자를 위한 변수지정
String mySpeed="";  //Speed값 출력을 위한 변수지정
String DistanceString=""; //초음파센서 거리값 받기 위한 변수지정
String IluminationString=""; //조도값을 받기 위한 변수지정

int DC_EN =10; //속도제어
int DC_IN1=6; //IN1과 IN2를 이용해 방향제어
int DC_IN2=8;
int DC_Speed=150; //EN핀에서 제어할 속도 설정 0~255
boolean check_first;  //Speed 값 초기화를 위한 boolean변수

int trig = 11; //초음파 센서를 통한 제어
int echo = 12;
int redLED = 4;  //초음파 센서를 통한 LED 제어
int greenLED = 13; //조도 센서를 통한 LED 제어
int analogPIN = A0; //조도 센서 입출력

void setup()
{
  Serial.begin(9600); //시리얼 모니터 통신을 위한 개방
  mySerial.begin(9600); //블루투스 통신을 위한 개방
  
  pinMode(DC_IN2, OUTPUT);
  pinMode(DC_IN1, OUTPUT);    
  pinMode(DC_EN, OUTPUT);
  myservo.attach(9); //몇번 핀에서 제어신호가 오는지 알기위함(서보모터)
  myservo.write(pos); //중앙 위치 시작을 위한 출력

  pinMode(trig, OUTPUT); //초음파 센서의 핀을 OUTPUT으로 설정함
  pinMode(echo, INPUT); //초음파 센서의 핀을 INPUT으로 설정함

  pinMode(redLED, OUTPUT);  //초음파 센서 LED 
  pinMode(greenLED, OUTPUT);

}
void loop() 
{
  //loop 처음 들어올시 Speed값을 0으로 초기화 시키기 위함.
  if(!check_first)
  {
    check_first=true;
    mySpeed="0";
  }

  //초음파 센서 제어
  digitalWrite(trig, LOW);  //센서 처음값 꺼놓음
  delayMicroseconds(2);     //바꾸기 위한 딜레이값
  digitalWrite(trig, HIGH); //센서초기화시키기 위한 켜놓음
  delayMicroseconds(10);
  digitalWrite(trig, LOW); //다시 꺼놓음
  long distance = pulseIn(echo, HIGH)/58.2;  //초음파 센서 거리 계산
  DistanceString = distance;  //센서거리값 출력을 위한 값전달
  delay(200);

  //초음파 센서에 의한 LED ON/OFF
  if(distance >= 0 && distance < 13)
    digitalWrite(redLED, HIGH);
  else
    digitalWrite(redLED, LOW);

  //조도 센서에 의한 LED ON/OFF
  int illuminationValue = 0;
  illuminationValue = analogRead(analogPIN);
  IluminationString = illuminationValue;    //조도값 출력을 위한 값전달

  //스마트폰 및 시리얼 모니터에 초음파센서와 조도센서값, 속도값 출력
  mySerial.println(DistanceString+","+IluminationString+","+mySpeed); //스마트폰
  Serial.println(DistanceString+","+IluminationString+","+mySpeed); //시리얼 모니터
  
  //스마트폰에서 들어오는 값을 읽음
  while(mySerial.available())
  {
    char myChar = (char)mySerial.read();  //값을 받아 Char형식으로 변환
    myString += myChar;
    delay(5);
  }
  
  //들어오는 값에 따라 알맞은 값 출력
  if(!myString.equals(""))
  {
    Serial.println("input value: "+myString); //시리얼 모니터에 출력
    if(myString=="1")
      digitalWrite(greenLED, HIGH);
     else if(myString=="2")
      digitalWrite(greenLED, LOW);
      
    //전진
    else if(myString=="3")
    {
       DC_Speed += 10;  //10의 속도씩 증가
       analogWrite(DC_EN,DC_Speed); //모터에 전달
       digitalWrite(DC_IN1,HIGH);
       digitalWrite(DC_IN2,LOW);
       mySpeed = DC_Speed;  //Speed값 출력을 위한 값 전달
    }

    //정지
    else if(myString=="4")
    {
      DC_Speed=245;
      analogWrite(DC_EN,LOW);
      digitalWrite(DC_IN1,LOW);
      digitalWrite(DC_IN2,LOW);
      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;
        DC_Speed = 150;
    }

    //정지
    else if(myString=="6")
    {
      DC_Speed=245;
      analogWrite(DC_EN,DC_Speed); //모터에 전달
      digitalWrite(DC_IN1,LOW);
      digitalWrite(DC_IN2,LOW);
      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-04 13:47:52

안녕하세요! 임혜성님.

미키님의 조언은 현재 9V 건전지는 브레드보드의 상단 전원 버스를 경유해 모터드라이버 쪽에 전원을 공급해주고 있는데요. 

여기서 모터드라이버 쪽 뿐만아나리 아두이노의 Vin과 GND에 건전지의 +, -를 연결해 아두이노쪽에도 전원을 공급해주라는 말씀이였던 것 같습니다. 

 

추가적으로 제가 만들어 본 경험을 바탕으로 말씀드리면, 저가의 망간 건전지보다는 알카라인 건전지를 사용하시는 것이 좋습니다! ;)

이전글   |    악보보고 사운드 만들기 2016-11-02
다음글   |    음성인식 서랍장 모터연동 가변저항에 대해 질문합니다ㅠㅠ... 2016-11-02