기계적 한계 확인용 테스트 작성. servo.writeMicroseconds 써서 1000~2000 베이스 레인지로 제어 (많은 서보가 600~2400까지 지원). 여러 값 시험해 버징(윙윙거림) 발생 지점 = 한계 찾음. 그 한계 안에서만 제어. servo.attach(pin, min, max)로 한계 설정 가능. 실제 동작 범위 찾아 코드가 엔드스톱 넘게 밀지 않게 constrain() 함수 활용.
5단계: 코딩
아두이노 라이브러리 환경으로 스케치 기능 확장 가능. 라이브러리는 하드웨어 제어, 데이터 조작 등 추가 기능 제공. 스케치에서 라이브러리 사용하려면:
#include
#include
#include
#include
#include
코드
X Y Z 스테퍼 코드 (Arduino)
#include "AccelStepper.h"
// AccelStepper 설정
AccelStepper stepperX(1, 2, 3); // 1 = Easy Driver 인터페이스
// 우노 핀 2 → Easy Driver STEP 핀
// 우노 핀 3 → Easy Driver DIR 핀
AccelStepper stepperZ(1, 5, 6); // 1 = Easy Driver 인터페이스
// 우노 핀 5 → Easy Driver STEP 핀
// 우노 핀 6 → Easy Driver DIR 핀
AccelStepper stepperY(7, 8, 9); // 1 = Easy Driver 인터페이스
// 우노 핀 5 → Easy Driver STEP 핀 (주석 오타: 실제 7,8,9 핀)
// 우노 핀 6 → Easy Driver DIR 핀
// 스테퍼 이동 변수
long TravelX; // 시리얼 모니터 입력 X값 저장
long TravelZ; // 시리얼 모니터 입력 Z값 저장
long TravelY; // 시리얼 모니터 입력 Y값 저장
int move_finished = 1; // 이동 완료 체크용
void setup() {
Serial.begin(9600);
// 시작 시 시리얼 모니터 안내 출력
Serial.println("Enter Travel distance seperated by a comma: X,Z ");
Serial.print("Enter Move Values Now: ");
// 각 스테퍼 최대 속도/가속도 설정
stepperX.setMaxSpeed(500.0); // X축 최대 속도
stepperX.setAcceleration(500.0); // X축 가속도
stepperZ.setMaxSpeed(250.0); // Z축 최대 속도 (회전용이라 느리게)
stepperZ.setAcceleration(250.0); // Z축 가속도
stepperY.setMaxSpeed(250.0); // Y축 최대 속도 (회전용이라 느리게)
stepperY.setAcceleration(250.0); // Y축 가속도
}
void loop() {
while (Serial.available() > 0) { // 시리얼 버퍼에 값 있으면
move_finished = 0; // 이동 체크 변수 리셋
TravelX = Serial.parseInt(); // 버퍼 첫 숫자 → TravelX
Serial.print(TravelX);
Serial.print(" X Travel , ");
TravelZ = Serial.parseInt(); // 두 번째 숫자 → TravelZ
Serial.print(TravelZ);
Serial.print(" Z Travel , ");
TravelY = Serial.parseInt(); // 세 번째 숫자 → TravelY
Serial.print(TravelY);
Serial.println(" Y Travel ");
stepperX.moveTo(TravelX); // X 스테퍼 목표 위치 설정
stepperZ.moveTo(TravelZ); // Z 스테퍼 목표 위치 설정
stepperY.moveTo(TravelY); // Y 스테퍼 목표 위치 설정
delay(1000); // 1초 대기 후 이동 시작
Serial.print("Moving Steppers into position...");
}
// 스테퍼들이 목표 위치 도달했는지 체크
if ((stepperX.distanceToGo() != 0) || (stepperZ.distanceToGo() != 0) || (stepperY.distanceToGo() != 0)) {
stepperX.run(); // X 스테퍼 이동
stepperZ.run(); // Z 스테퍼 이동
stepperY.run(); // Y 스테퍼 이동
}
// 이동 완료 시 시리얼 모니터에 메시지 출력
if ((move_finished == 0) && (stepperX.distanceToGo() == 0) && (stepperZ.distanceToGo() == 0) && (stepperY.distanceToGo() == 0)) {
Serial.println("COMPLETED!");
Serial.println("");
Serial.println("Enter Next Move Values (0,0,0 for reset): ");
move_finished = 1; // 이동 변수 리셋
}
}