티스토리 뷰
- 모터 구분 : 소형(28BYJ-48 등), 중대형(NEMA-17 등)
- IC 구분 : 단순(ULN2003 등), 다기능(DRV8825 등)
- 소형 모터는 단순 기능의 ULN2003을 주로 이용하고
- 중대형 모터는 다기능의 DRV8825를 주로 이용함.
- 방향 및 단순속도 제어를 위해서는 Stepper.h를 사용하는 것이 편리하고
- 가감속도 및 정밀 위치제어를 위해서는 AccelStepper.h를 사용하는 것이 효과적임.
[코드 실행 흐름 방식 비교]
블로킹(Blocking) | 논블로킹(Non-blocking) | 비고 |
어떤 작업이 완료될 때까지 프로그램 실행이 멈추는 방식 | 어떤 작업이 실행된 이후 다음 작업으로 계속 진행 | |
Stepper.h | AccelStepper.h |
변칙적인 예로써,
ULN2003과 AccelStepper를 이용한 28BYJ-48 제어 코드를 소개함.
[AccelStepper.h를 이용한 ULN2003 제어]
#include <AccelStepper.h>
// ULN2003 제어 핀 (IN1 ~ IN4)
#define IN1 2
#define IN2 3
#define IN3 4
#define IN4 5
// AccelStepper 객체 생성 (4-wire 모드)
AccelStepper stepper(AccelStepper::FULL4WIRE, IN1, IN3, IN2, IN4);
void setup() {
// 속도 및 가속도 설정
stepper.setMaxSpeed(500); // 최대 속도 (스텝/초)
stepper.setAcceleration(200); // 가속도 (스텝/초^2)
}
void loop() {
// 1바퀴 이동 (28BYJ-48: 2048 스텝 ≈ 360도)
stepper.moveTo(2048);
while (stepper.distanceToGo() != 0) {
stepper.run(); // 논블로킹 실행
}
delay(1000); // 1초 정지
// 반대 방향으로 1바퀴 회전
stepper.moveTo(0);
while (stepper.distanceToGo() != 0) {
stepper.run();
}
delay(1000); // 1초 정지
}
[회전 개시 초기 가속, 일정 기간 정속, 회전 종료 시 감속]
#include <AccelStepper.h>
// 핀 정의
#define STEP_PIN 2
#define DIR_PIN 3
// AccelStepper 객체 (DRV8825는 DRIVER 모드 사용)
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// 1바퀴당 스텝 수 (마이크로스텝 비율에 따라 조정)
const int stepsPerRevolution = 3200; // 1/16 마이크로스텝 기준
const int targetRevolutions = 100;
const long totalSteps = stepsPerRevolution * targetRevolutions;
void setup() {
// 최대 속도, 가속도 설정
stepper.setMaxSpeed(2000); // 최대 회전 속도 (스텝/초)
stepper.setAcceleration(800); // 가속도 (스텝/초²)
// 회전 방향 설정 (HIGH/LOW 바꾸면 반대 방향)
stepper.setCurrentPosition(0); // 현재 위치를 0으로 초기화
stepper.moveTo(totalSteps); // 목표 위치 설정
}
void loop() {
if (stepper.distanceToGo() != 0) {
stepper.run(); // 자동 가속/감속 포함 회전
} else {
// 도착 후 정지
// 아무 작업 없음
}
}
[지속 회전 예제 코드]
#include <AccelStepper.h>
#define STEP_PIN 2
#define DIR_PIN 3
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
void setup() {
stepper.setMaxSpeed(800); // 회전 속도 설정 (스텝/초)
stepper.setSpeed(800); // 방향 + 속도 설정 (음수면 반대방향)
}
void loop() {
stepper.runSpeed(); // 설정된 속도로 계속 회전 (가속/감속 없음)
}
[최대 가속도 예시]
모터 종류 | 권장 가속도 범위 | 비고 |
28BYJ-48 (감속기 포함) | 100 ~ 300 | |
NEMA 17 + DRV8825 | 200 ~ 1500 | |
NEMA 23 (고전류 타입) | 1000 ~ 5000 | 충분한 전압/전류 필요 |
고속 CNC 모터 | 5000 이상 | FastAccelStepper.h 권장 |
[28BYJ-48과 NEMA-17 비교]
항목 | 28BYJ-48 | NEMA 17 |
동작 방식 | 유니폴라 (일부는 바이폴라) | 바이폴라 |
기어 구조 | 감속 기어 내장 (약 64:1) | 없음 (직결) |
제어 드라이버 | ULN2003 (간단한 릴레이형) | A4988, DRV8825 등 정밀 제어 드라이버 |
토크 | 작음 (40~50g·cm) | 큼 (2000g·cm 이상 가능) |
속도 | 느림 | 빠름 |
정밀도 | 매우 높음 (감속기 덕분에 4096스텝/바퀴 이상) | 낮음 (200~1600스텝/바퀴 일반) |
소비 전류 | 매우 적음 (~240mA) | 상대적으로 높음 (최대 1.5A~2A) |
가격 | 매우 저렴 ($1~2) | 비쌈 ($10~30 이상) |
용도 | 간단한 자동화, 교육용, 시계 등 | 3D프린터, CNC, 로봇 팔 등 정밀 제어 분야 |
반응형
'HWDesk > HardwareControl' 카테고리의 다른 글
스텝 모터 제어 질의 - ChatGPT (0) | 2025.05.04 |
---|---|
DRV88245, ULN2003, MPU60506, AM2302 연결 방법 (0) | 2025.04.27 |
AM2302 온습도 센서 제어 코드 (2) | 2025.04.19 |
스텝 모터 제어 시 모드 비교(모드 1 ~ 모드 4) (0) | 2025.04.13 |
스텝 모터(NEMA 17) 제어 예제 (0) | 2025.04.12 |
반응형
250x250
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Innovations
- 절연형
- bilient
- 빌리언트
- Hurdles
- 전압전류모니터링
- 심심풀이
- 허들
- 치매
- DYOV
- badp
- 혁신
- BSC
- 아두이노
- 배프
- 티스토리챌린지
- 둎
- 심심풀이치매방지기
- Innovation&Hurdles
- 오블완
- Video
- 혁신과허들
- Innovations&Hurdles
- 치매방지
- 전류
- arduino
- Decorator
- image
- ServantClock
- 전압
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함