Arduino/서보 모터(Servo motor)

버튼과 눌림에 따라 서보 모터의 각도 조절하기(추가로 LED까지)

DesignatedRoom 2020. 10. 28. 19:05

서보 모터의 연결은 아래를 보도록 하자.

designatedroom87.tistory.com/247

 

서보 모터의 기본적인 연결 및 동작

서보 모터는 3개의 선으로 구성되어 있는데, 아래의 세 선이 서보 모터에 연결된 선이다. 이 선 색을 중심으로 보면 서보 모터의 가운데는 VCC에, 갈색은 GND에, 주황색 선은 출력선이다. 이 출력선

designatedroom87.tistory.com

버튼은 풀업 저항으로 연결을 한다.

두 선만 있으면 된다. 파란선은 GND에 연결되고, 초록색 선은 아두이노의 13번핀에 연결된다.

 

 

 

아래의 예제는 버튼이 한 번씩 누를 때마다 서보 모터의 각도가 0도 혹은 180도로 설정하는 예제이다.

소스 코드

#include <Servo.h>

Servo servo;

void setup() {
  // put your setup code here, to run once:
  pinMode(13,INPUT_PULLUP); //  버튼을 13번핀으로 연결
  Serial.begin(9600);
  servo.attach(6);          //  6번핀을 서보 모터와 연결
  servo.write(0);           //  서보 모터 초기화
}

bool buttonPressed = false; //  버튼이 눌려진 상태
bool servoState = false;    //  서보 모터의 상태에 따라 각도를 0도 혹은 180도로 설정

void loop() {

  Serial.println("버튼이 동작하지 않은 상태");
  
  //  버튼이 눌러졌으면
  if (!digitalRead(13))
  {
    buttonPressed = true; //  true 상태로 변경
    
    while (buttonPressed)
    {
      Serial.println("버튼이 동작하는 상태");
      
      //  버튼이 눌려진 상태에서 떼어지면 while 루프를 빠져나옴.
      if (digitalRead(13))  {buttonPressed = false;}
     }
     // 실행할 코드를 삽입
     if (servoState)  
     {
      servo.write(0);
      servoState = false;
     }
     else
     {
      servo.write(180);
      servoState = true;
     }
  }
  delay(100);
}

 

 

아래는 추가로 LED를 연결하자.

서보 모터가 0도 혹은 180도가 될 때 LED를 켜거나 끄도록 만들자.

LED는 4번핀과 연결하고, 저항은 220옴을 쓴다.

소스 코드

#include <Servo.h>

Servo servo;

void setup() {
  // put your setup code here, to run once:
  pinMode(13,INPUT_PULLUP); //  버튼을 13번핀으로 연결
  Serial.begin(9600);
  servo.attach(6);
  servo.write(0);
  pinMode(4,OUTPUT);    //  LED를 4번핀으로 연결
  digitalWrite(4,LOW);  //  LED 초기화
}

bool buttonPressed = false; //  버튼이 눌려진 상태
bool servoState = false;

void loop() {

  Serial.println("버튼이 동작하지 않은 상태");
  
  //  버튼이 눌러졌으면
  if (!digitalRead(13))
  {
    buttonPressed = true; //  true 상태로 변경
    
    while (buttonPressed)
    {
      Serial.println("버튼이 동작하는 상태");
      
      //  버튼이 눌려진 상태에서 떼지면 
      if (digitalRead(13))  {buttonPressed = false;}
     }
     // 실행할 코드를 삽입
     if (servoState)  
     {
      servo.write(0);
      servoState = false;
      digitalWrite(4,LOW);  //  LED Off
     }
     else
     {
      servo.write(180);
      servoState = true;
      digitalWrite(4,HIGH); //  LED On
     }
  }
  delay(100);
}