죄송한데 이 코드가 맞는지 확인해 주세요.
/*
제목 : 서보모터 움직이기
내용 : 스위치를 누를때마다 서보모터가 지정된 각도 만큼 회전하도록 해봅시다.
*/
// 서보모터의 쉽게 제어하기 위하여 라이브러리를 추가합니다.
#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;
}
}
한번은 왔다갔다 하는데 두번재 부턴안되요.
부탁합니다 .
|