목표
서로 다른 타입의 2대의 스텝 모터를 제어하는 예제입니다. 각각의 모터를 별도로 제어하거나 또는 정확한 타이밍으로 동기화 하여 구동할 수 있습니다. (Synchronized motion) 또한 가속 및 감속을 사용하여 부드럽게 시작하고 정지할 수 있습니다.
- “모터1 시작” 버튼을 누르면 스텝모터 1을 아래와 같은 프로파일로 구동한다.
- “모터2 시작” 버튼을 누르면 스텝모터 2를 아래와 같은 프로파일로 구동한다.
- “동기화 시작”버튼을 누르면 스텝모터1과 스텝모터2를 동기화하여 구동한다.
- “모두 정지” 버튼을 누르면 모든 모터를 정지한다.
- 스텝모터1,2의 현재 위치를 대시보드에 표시한다.
- 모든 버튼은 대시보드의 푸시버튼 위젯을 사용한다.
하드웨어
부품
부품 | 갯수 |
---|---|
28BYJ-48 스텝모터 | 1 |
ULN2003 드라이버 | 1 |
NEMA-17 스텝모터 | 1 |
A4988 드라이버 | 1 |
5V DC 파워 | 1 |
12V 또는 24V DC 파워 | 1 |
연결
아래의 핀을 가로 방향으로 서로 연결해줍니다.
5V 파워 ² |
ULN2003 | 28BYJ-48 모터 | 12V(24V) 파워 ² |
A4988 |
NEMA17 |
GPIO |
---|---|---|---|---|---|---|
IN1 ¹ | 28 | |||||
IN2 ¹ | 8 | |||||
IN3 ¹ | 7 | |||||
IN4 ¹ | 1 | |||||
+ | VCC | | ||||
– | GND | | GND | |||
커넥터 | 커넥터 | |||||
VDD | 3.3V | |||||
GND | GND | |||||
+ | VMOT ³ | |||||
– | GND ³ | |||||
STEP ¹ | 14 | |||||
DIR ¹ | 15 | |||||
RESET SLEEP ⁵ |
||||||
1A,1B,2A,2B | 커넥터 |
² 5V, 12V(24V)파워는 드라이버가 필요한 충분한 전류를 공급할 수 있어야 합니다.
³ 전압 스파이크로부터 A4988 보드를 보호하기 위해 VMOT와 GND 사이에 최소 47µF의 디커플링 커패시터를 사용하는 것을 권장합니다.
⁴ A4988가 공급 가능한 전류는 최대 2A이므로 소모 전류가 2A 이하인 NEMA 17 모터를 선정합니다.
⁵ A4988의 RESET핀과 SLEEP핀을 서로 연결합니다.
I/O장치
2개의 스텝모터를 I/O장치에 추가합니다.
변수
대시보드 푸시버튼과 모터의 현재위치에 사용할 변수를 추가합니다.
- “모터1 시작” (디지털)
- “모터2 시작” (디지털)
- “동기화 시작” (디지털)
- “모두 정지” (디지털)
- “모터1 위치” (숫자)
- “모터2 위치” (숫자)
로직
- 로직을 시작할때 처음 한번만 스텝모터 1과 2의 프로파일을 버퍼에 추가한다.
- “모터1 시작” 버튼을 누르면 프로파일에 따라 모터1을 운전한다.
- “모터2 시작” 버튼을 누르면 프로파일에 따라 모터2를 운전한다.
- “동기화 시작” 버튼을 누르면 프로파일에 따라 모터1, 모터2를 동기화 운전한다.
- “모두 정지” 버튼을 누르면 모든 모터를 정지한다.
- 모터1, 모터2의 현재 위치를 변수에 저장한다.
- 모터는 이미 운전 중일 수도 있으므로 모터를 시작하기 전에 우선 정지한다.
이를 알고리즘 블록으로 나타내면 아래와 같습니다.
[로직]
로직을 추가합니다. 실행주기는 기본값을 사용합니다.
[제어] 모터의 프로파일을 버퍼에 추가한다.
제어를 추가합니다.
[조건] 처음 한번만
처음 한번만 만족하는 조건을 추가합니다.
타입: 1회 유효
[동작] 모터1 프로파일을 버퍼에 추가
모터1의 프로파일을 버퍼에 추가하는 동작을 추가합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: ADD_MOTION
- 속도 (rpm): 10
- 회전단위: 회전수
- 회전수 : 1
- 가속(rpm/s): 10
- 감속(rpm/s): 0
[동작] 모터1 프로파일을 버퍼에 추가
모터1의 프로파일을 버퍼에 추가하는 동작을 추가합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: ADD_MOTION
- 속도 (rpm): 15
- 회전단위: 회전수
- 회전수 : 1
- 가속(rpm/s): 15
- 감속(rpm/s): 15
[동작] 모터2 프로파일을 버퍼에 추가
모터2의 프로파일을 버퍼에 추가하는 동작을 추가합니다.
- 타입: I/O장치
- 장치: 스텝모터2
- 명령: ADD_MOTION
- 속도 (rpm): 30
- 회전단위: 회전수
- 회전수 : 1
- 가속(rpm/s): 30
- 감속(rpm/s): 30
[동작] 모터2 프로파일을 버퍼에 추가
모터2의 프로파일을 버퍼에 추가하는 동작을 추가합니다.
- 타입: I/O장치
- 장치: 스텝모터2
- 명령: ADD_DELAY
- 대기시간 : 1초
[동작] 모터2 프로파일을 버퍼에 추가
모터2의 프로파일을 버퍼에 추가하는 동작을 추가합니다.
- 타입: I/O장치
- 장치: 스텝모터2
- 명령: ADD_MOTION
- 속도 (rpm): 30
- 회전단위: 회전수
- 회전수 : -1
- 가속(rpm/s): 30
- 감속(rpm/s): 30
[제어] “모터1 시작” 버튼을 누르면 모터1을 시작한다.
[조건] “모터1 시작” 버튼을 누르면
대시보드의 푸시버튼을 사용하므로 “모터1 시작”이라는 변수의 값이 false->true 가 되는 순간이 푸시버튼을 누른 순간입니다.
- 타입: 비교
- 변수: “모터1 시작” 선택
- 연산자: = (같다)
- 값: true
- 옵션: 참인 순간
[동작] 모터1 정지
모터1이 이미 운전 중일 수도 있으므로 시작전에 정지합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: STOP
[동작] 모터1 시작
모터1의 운전을 시작합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: RUN
[제어] “모터2 시작” 버튼을 누르면 모터2를 시작한다.
[조건] “모터2 시작” 버튼을 누르면
대시보드의 푸시버튼을 사용하므로 “모터2 시작”이라는 변수의 값이 false->true 가 되는 순간이 푸시버튼을 누른 순간입니다.
- 타입: 비교
- 변수: “모터2 시작” 선택
- 연산자: = (같다)
- 값: true
- 옵션: 참인 순간
[동작] 모터2 정지
모터2가 이미 운전 중일 수도 있으므로 시작전에 정지합니다.
- 타입: I/O장치
- 장치: 스텝모터2
- 명령: STOP
[동작] 모터2 시작
모터2의 운전을 시작합니다.
- 타입: I/O장치
- 장치: 스텝모터2
- 명령: RUN
[제어] “동기화 시작” 버튼을 누르면 모터1, 모터2를 동기화하여 시작한다.
[조건] “동기화 시작” 버튼을 누르면
대시보드의 푸시버튼을 사용하므로 “동기화 시작”이라는 변수의 값이 false->true 가 되는 순간이 푸시버튼을 누른 순간입니다.
- 타입: 비교
- 변수: “동기화 시작” 선택
- 연산자: = (같다)
- 값: true
- 옵션: 참인 순간
[동작] 모터1 정지
모터1이 이미 운전 중일 수도 있으므로 시작전에 정지합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: STOP
[동작] 모터2 정지
모터2가 이미 운전 중일 수도 있으므로 시작전에 정지합니다.
- 타입: I/O장치
- 장치: 스텝모터2
- 명령: STOP
[동작] 모터1, 모터2 동기화 시작
모터1, 모터2를 동기화 운전(Synchronized motion)합니다. 동시에 모터의 운전을 시작하며, 1 마이크로초(백만분의 1초) 단위의 정확한 타이밍으로 동기화합니다. 만약 특정 모터가 운전을 먼저 완료하였다면, 나머지 모터가 완료할때까지 해당 모터는 대기합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: RUN_SYNC
- I/O장치 번호: 1,2
[제어] “모두 정지” 버튼을 누르면 모든 모터를 정지한다.
[조건] “모두 정지” 버튼을 누르면
대시보드의 푸시버튼을 사용하므로 “모두 정지”이라는 변수의 값이 false->true 가 되는 순간이 푸시버튼을 누른 순간입니다.
- 타입: 비교
- 변수: “모두 정지” 선택
- 연산자: = (같다)
- 값: true
- 옵션: 참인 순간
[동작] 모터1, 모터2 정지
모든 모터를 정지합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: STOP_ALL
[제어] 모터1, 모터2의 현재 위치를 읽어서 변수에 저장한다.
[조건] 항상
항상 만족하는 조건을 추가합니다.
타입: 항상 유효
[동작] 모터1의 현재 위치 읽기
모터1의 현재위치를 “모터1 위치” 변수에 저장합니다.
- 타입: I/O장치
- 장치: 스텝모터1
- 명령: GET_POSITION
- 변수: “모터1 위치”
[동작] 모터2의 현재 위치 읽기
모터2의 현재위치를 “모터2 위치” 변수에 저장합니다.
- 타입: I/O장치
- 장치: 스텝모터2
- 명령: GET_POSITION
- 변수: “모터2 위치”
대시보드
대시보드를 추가합니다.
“모터1 시작” 푸시버튼 위젯을 추가합니다.
- 구분: 쓰기
- 변수: “모터1 시작”
- 타입: 푸시버튼
위와 동일하게 “모터2 시작”, “동기화 시작”, “모두 정지” 푸시버튼 위젯을 추가합니다.
“모터1 위치” 읽기 위젯을 추가합니다.
- 구분: 읽기
- 변수: “모터1 위치”
- 타입: 텍스트
- 단위: steps
위와 동일하게 “모터2 위치” 읽기 위젯을 추가합니다.
실행
버튼을 눌러서 RUN모드로 진입합니다.