#include <Stepper.h>
// 스텝모터 설정
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
// 센서 핀
const int sensorLeft = 2;
const int sensorRight = 3;
// 이전 상태 저장
int prevLeft = LOW;
int prevRight = LOW;
// 상태 플래그
bool reversing = false;
unsigned long reverseStartTime = 0;
void setup()
{
pinMode(sensorLeft, INPUT);
pinMode(sensorRight, INPUT);
Serial.begin(9600);
Serial.println("[SETUP] Serial started, initializing stepper and sensors");
myStepper.setSpeed(7); // 속도 설정
Serial.print("[SETUP] Stepper speed set to ");
Serial.println(7);
Serial.print("[SETUP] Sensor pins: Left=");
Serial.print(sensorLeft);
Serial.print(", Right=");
Serial.println(sensorRight);
Serial.println("[SETUP] Initial state: prevLeft=LOW, prevRight=LOW, reversing=false");
}
// 가상 센서 신호 생성 함수
int getVirtualSensorLeft()
{
unsigned long t = millis() / 5000;
return (t % 2 == 0) ? LOW : HIGH;
}
int getVirtualSensorRight()
{
// Left와 항상 같은 값 반환
return getVirtualSensorLeft();
}
void loop()
{
// 실제 센서 대신 가상 신호 사용
int left = getVirtualSensorLeft();
int right = getVirtualSensorRight();
Serial.print("[LOOP] Virtual Sensor: LEFT=");
Serial.print(left);
Serial.print(" | RIGHT=");
Serial.println(right);
// 1. 둘 다 LOW -> HIGH로 바뀌는 순간 감지 -> 정회전
if (prevLeft == LOW && prevRight == LOW && left == HIGH && right == HIGH)
{
Serial.println("[EVENT] 양발 감지: 정회전 시작");
Serial.print("[ACTION] Stepper forward: steps=");
Serial.println(stepsPerRevolution);
myStepper.step(stepsPerRevolution); // 정회전 1바퀴
Serial.println("[ACTION] Stepper forward complete");
Serial.println("[ACTION] Delay 5초 (5000ms) 시작");
delay(5000); // 잠깐 멈춤
Serial.println("[ACTION] Delay 5초 (5000ms) 종료");
}
// 2. 둘 다 HIGH -> LOW로 바뀌는 순간 감지 -> 역회전
if (prevLeft == HIGH && prevRight == HIGH && left == LOW && right == LOW)
{
Serial.println("[EVENT] 양발 해제: 역회전 시작");
Serial.print("[ACTION] Stepper reverse: steps=-");
Serial.println(stepsPerRevolution);
myStepper.step(-stepsPerRevolution); // 역회전 1바퀴
Serial.println("[ACTION] Stepper reverse complete");
Serial.println("[ACTION] Delay 5초 (5000ms) 시작");
delay(5000); // 잠깐 멈춤
Serial.println("[ACTION] Delay 5초 (5000ms) 종료");
}
// 현재 상태를 이전 상태로 업데이트 (항상 loop 마지막에 위치)
prevLeft = left;
prevRight = right;
Serial.print("[STATE] prevLeft=");
Serial.print(prevLeft);
Serial.print(", prevRight=");
Serial.println(prevRight);
Serial.println("[ACTION] Delay 1초 (1000ms) 시작");
delay(1000); // polling 속도
Serial.println("[ACTION] Delay 1초 (1000ms) 종료");
}
// [출처] 적외선 센서&스텝모터 코드 관련.. 미치겠습니다 (아두이노 스토리) | 작성자 13579123