정보나눔

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

서보모터에 회전에 대하여
하늘 | 2017-05-11

죄송한데 이 코드가 맞는지 확인해 주세요.

 

 

 

/*
 제목  : 서보모터 움직이기
 내용  : 스위치를 누를때마다 서보모터가 지정된 각도 만큼 회전하도록 해봅시다.
 */

// 서보모터의 쉽게 제어하기 위하여 라이브러리를 추가합니다.
#include <Servo.h>

// 서보모터를 제어하기 위한 Servo 객체를 생성한다.
Servo myservo;
// 스위치를 5번 핀으로 설정합니다.
int sw = A0;
// 서보모터의 회전 각도입니다.
int angle = 0;

// 기계적인 스위치를 누르게 되면 전극판이 완전히 밀착되기 전까지,
// 매우 짧은 시간 동안 불안정한 신호를 발생시키며, 여러번 누른 것과 같은 현상이 나타납니다.
// 이를 바운스 현상아라하며, 이를 방지하기 위하여 일정시간동안은 이러한 불안정한 신호를 고려하지 않습니다.
// 이러한 방법을 디바운스라 합니다.
// 바운스 시작 시간을 초기화합니다.
long bounceStartTime = 0;
// 본 예제에서는 스위치를 눌렀을때 50ms 안의 신호는 바운스 현상으로 간주하고, 디바운스 합니다.
long debounce = 50;
// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
  // 서보모터를 A3핀으로 설정합니다.
  myservo.attach(12);
  // 스위치가 연결된 핀의 모드를 INPUT_PULLUP 상태(초기 로직레벨을 HIGH로 설정)로 설정합니다.
  // 설정된 디지털 핀은 아래와 같은 값을 반환합니다.
  // 스위치가 열려있다면 (누르지 않은 상태) HIGH
  // 스위치를 닫혀있다면 (누른 상태), LOW
  pinMode(sw, INPUT_PULLUP);
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() {
  // 스위치가 연결된 핀의 로직레벨이 LOW라면,
  // 스위치가 닫혀있는 상태(누른 상태) 이므로, 아래의 블록을 실행합니다.
  if (digitalRead(sw) == LOW) {
    // 시작 시간이 0으로 초기화 되어있다면, 현재 시간을 시작 시간으로 설정합니다.
    if (bounceStartTime == 0) {
      bounceStartTime = millis();
    }
    // 현재 시간 - 시작 시간이 디바운스 시간보다 크다면, 아래의 블록을 실행합니다.
    if (millis() - bounceStartTime > debounce) {
      // 현재 각도에서 90도를 증가시킵니다.
      angle += 90;
      if (angle > 90) {
        angle = 0;
      }
     }
      // 최종 각도가 90도를 넘는다면, 0도로 초기화 시킵니다.
      // 서버모터로 지정된 각도로 회전하도록 설정합니다.
      myservo.write(angle);
      // 회전 후, 바운스 시작 시간을 0으로 초기화 합니다.
      bounceStartTime == 0;
  }
}

 

 

 

한번은 왔다갔다 하는데 두번재 부턴안되요.

부탁합니다 .

이전글   |    아두이노에서 블루투스를 통한 와이파이 연결 관련 문의... 2017-05-11
다음글   |    기상청 RSS 를 이용한 날씨 정보에 대해 질문...... 2017-05-11