15. STEP 모터 제어 - 스마트 폰으로 제어하는 아두이노 -
강의 개요 스테핑 모터는 정확한 각도제어에 유리하여 각종 OA, FA 장비에 널리 사용 일반적으로 기계적인 이동량을 정밀하게 제어하는 곳에 스테핑 모터가 많이 사용 펄스에 의해 디지털적으로 제어하는 것이 가능하므로 마이크로컨트롤러에서 사용하기에 적합한 모터
15.1 STEP 모터 DC 모터나 AC 모터와 차이점 스텝 모터의 구조 샤프트(축)의 위치를 검출하기 위한 별도의 피드백 신호 없이 정해진 각도를 회전하고, 상당히 높은 정확도로 정지 가능 다른 종류의 모터에 비하여 정지할 때에 매우 큰 유지 토크가 있기 때문에 전자 브레이크 등의 위치 유지 기구를 필요로 하지 않음 회전 속도도 펄스 속도에 비례하므로 간편하게 제어 가능 스텝 모터의 구조
스텝 모터 구동 방법 스테핑 모터의 제어 회로 펄스를 인가하여 각상의 여자 신호를 발생시키는 여자 신호 발생부와 그 신호를 받아서 권선에 여자 전류를 흘려주기 위한 구동 회로부로 구성 마이크로컨트롤러에서는 방향 신호와 펄스열 발생 여자 신호를 소프트웨어로 만들면 여자 신호 발생부가 생략 가능 마이크로컨트롤러 입장에서 보면 스테핑 모터를 펄스를 줄 때마다 한 스텝씩 주어진 방향에 따라 회전하므로 완전히 디지털적으로 이해
15.2 STEP 모터 모듈 HBE-MCU-Multi의 STEP Motor 모듈 아두이노 Mega 보드의 디지털입출력 핀 중 4개를 STEP Motor 모듈의 제어 신호 포트에 연결 인터럽트 핀 한 개를 CNT 신호 포트에 연결
스텝모터 모듈의 회로
스텝모터 모듈 모터회전 감지부 회로
제어 원리 아두이노 Mega 보드의 디지털입출력 핀과 스텝모터의 제어신호(D0~D3)을 연결되면, 이 신호들은 구동회로를 거쳐 OUT_A, OUT_B, OUT_AN, OUT_BN 신호로 만들어 스텝 모터에 입력 스텝모터 모듈에는 스탭 모터의 회전을 감지하기 위해 자기 센서를 사용 회전 감지 신호로 "CNT"을 출력 모터에 장착된 회전판에 영구 자석을 부착하고 회전판 옆면에 자기 센서를 부착하여 모터가 회전하면서 영구자석이 자기센서에 근접하게 되면 신호를 발생하여 스탭 모터의 회전을 감지하는 방식을 사용
15.3 스텝모터 함수 아두이노는 스텝모터 제어를 위하여 스텝모터 라이브러리 함수 제공 스텝모터의 속도, 방향 등을 제어하기 위한 함수 스텝모터 라이브러리 함수들을 사용하려면 스케치에 #include "Stepper.h" 입력 #include "Stepper.h" Stepper(number_of_steps, motor_pin_1, motor_pin_2, motor_pin_3, motor_pin_4); setSpeed(long whatSpeed) step(steps_to_move)
15.4 STEP 모터 제어 아두이노 Mega 보드의 디지털입출력 핀과 인터럽트 핀, STEP Motor 모듈 사용 아두이노 보드 디지털입출력 핀 D23 D25 D27 D29 D2 STEP MOTOR 모듈 D0 D1 D3 CNT
예제 15.1 스텝 모터 구동 스테핑 모터가 1바퀴 돌때마다 신호를 보내주는 인코더를 이용하여, 모터가 2바퀴 돌 때마다, 방향 전환
예제 15.1의 주요개념 스테핑 모터가 1바퀴 돌때마다 신호를 보내주는 인코더를 이용하여, 모터가 2바퀴 돌 때마다 방향을 전환하도록 구현하기 위해, 타이머와 인터럽트 기능 이용 2상 여자 방식을 사용한다고 가정하면, 다음과 같은 신호들을 한주기로 스텝모터에 입력 필요 역회전하려면 순서를 역순으로 바꾸어 입력 신호 1 2 3 4 5 6 7 8 9 D0(A) D1(B) D2(/A) D3(/B) D(3:0) 0x3 0x6 0xC 0x9
자기 센서에 의해 스텝모터의 회전수를 체크 필요 모터가 1바퀴를 돌 때마다 자기센서로부터 펄스 신호가 발생 그 펄스 신호를 세어서 2가 되면 모터의 방향 전환 이를 위해 펄스 신호가 들어올 때마다 인터럽트를 발생시켜서 카운트 자기센서의 특성상 펄스 신호에 채터링 잡음이 발생 가능 이를 방지하기 위해서는 타이머를 사용하여 자기장센서가 반응하는 범위를 벗어날 때까지는 회전수 카운트 하지 않음 인터럽트 0(DIGITAL 2핀) 사용 하강 에지에서 인터럽트가 발생하도록 설정 스텝모터 라이브러리 함수 이용 스텝모터의 속도, 방향 등 제어 #include "Stepper.h" 구문 입력 필요 Stepper stepper(STEPS, 23,27,25,29); 사용할 스텝모터의 핀 정의와 함수명을 선언 첫번째 인자는 모터회전에 사용할 총 스탭수 2~5번째 인자는 A, B, /A, /B 에 해당하는 핀
예제 15.1의 스케치1 #include <Stepper.h> #include <MsTimer2.h> #define STEPS 100 스텝모터 라이브러리 "Stepper.h" 포함 타이머2 라이브러리 "MsTimer2.h" 포함 Stepper stepper(STEPS, 23,27,25,29); 스텝모터의 핀 정의와 함수명을 선언하는 명령 volatile int mystep = 1; #define DIR_CHANHE_CNT 2 방향전환 카운트 volatile byte ecd_cnt = 0; volatile boolean flag=false; 챕터링 방지 volatile byte flag_cnt=0; void setup() { stepper.setSpeed(30); 스텝모터의 속도를 설정(RPM 단위) attachInterrupt(0, blink, FALLING); MsTimer2::set(20, flash); MsTimer2::start(); }
예제 15.1의 스케치2 void loop() { stepper.step(mystep); } 모터를 원하는 스텝만큼 회전 void blink() { flag = true; 자기장센서 채터링 방지 if (ecd_cnt == DIR_CHANHE_CNT) { mystep*=-1; ecd_cnt = 0; void flash() { if(flag == true) flag_cnt++; if(flag_cnt == 10){ flag = false; 자기장센서 챕터링 방지가 설정되면 카운트시작 ,적어도 자기장센서가 반응하는 범위를 벗어날 때까지 카운트 flag_cnt = 0; 범위를 벗어나면 플래그 해제 ecd_cnt++;
예제 15.1의 실행1 Include 부분 "#define STEPS 48" 선언 스텝모터 라이브러리 헤더 파일과 타이머/카운터 2 관련 헤더 파일 포함 "#define STEPS 48" 선언 스텝모터 회전에 사용될 총 스텝수를 설정 값 선언 실습에서 사용되는 스텝모터의 1회전에 사용되는 총 스텝수는 46스텝 총스텝 선언 후 Stepper stepper(STEPS, 23,27,25,29); 명령으로 스텝모터의 제어핀 초기화 mystep 변수 선언 스텝모터의 회전방향과 진행할 스텝수 설정 변수 1스텝씩 진행되며, 방향을 전환하므로 그 값은 "1" 또는 "-1" 값 스텝모터의 회전수를 카운팅하는데 사용되는 변수 선언 홀센서와 연결된 DIGITAL 2번핀(INT0)으로 입력된 신호를 감지하여 그값을 카운팅하고 저장하는데 사용 Setup함수의 stepper.setSpeed(30); 스텝모터의 분당 회전수(rmp)를 30으로 설정 attachInterrupt(0, blink, FALLING); 스텝모터의 회전수를 카운팅하기 위해 외부 인터럽트0를 설정
예제 15.1의 실행2 홀센서의 신호를 읽어오기 위해 인터럽트를 하강에지에서 읽어오도록 설정 외부 인터럽트 설정 후 타이머/카운터 2 사용 설정 MsTimer2::set(20, flash); 20ms 마다 타이머 오버플로우 인터럽트 2 가 발생하도록 하여 "flash" 함수를 호출하도록 설정 MsTimer2::start(); 타이머/카운터 2가 동작을 시작 타이머 오버플로우 인터럽트는 홀센서 입력의 채터링을 방지하기 위해 사용 loop()의 stepper.step(mystep); 스텝모터의 스텝 진행 mystep 값은 초기값이 "1"이며 이는 정회전하면서 1 스텝씩 진행한다는 의미 "mystep" 값 홀센서값을 읽어들여 2회전후 "-1"로 바뀌게 되어 역회전 2회전후에는 "1"로 바뀌어 정회전 Int0 인터럽트 서비스 루틴인 blink() 함수 인터럽트 발생시 flag = true; 명령으로 flag값을 true if(ecd_cnt == DIR_CHANHE_CNT) 구문으로 ecd_cnt 즉 현재 회전수와 미리 설정된 회전수(DIR_CHANHE_CNT, 여기서는 2회전)와 비교 2회전이 되면 mystep*=-1; 명령으로 방향을 전환
예제 15.1의 실행3 flash() 함수 flag가 true인 경우 flag_cnt를 증가시키며, flag_cnt 가 10이 되면 비로소 ecd_cnt를 증가 자기센서가 발생시킬 수 있는 채터링 잡음을 잡기 위해 적어도 자기장센서가 반응하는 범위를 벗어날 때까지 카운트해야 하기 때문 외부 인터럽트 0를 통해 홀센서의 입력을 감시 홀센서의 감지후 타이머 오버플로우 2 인터럽트를 통해 홀센서의 채터링 잡음을 방지해 모터의 회전수 판별
함수정리 Stepper(number_of_steps, motor_pin_1, motor_pin_2, motor_pin_3, motor_pin_4) : 스텝모터 를 제어하기 위한 핀들을 설정하는 함수 - number_of_steps : 스텝모터의 모터 회전에 사용할 총 스텝수를 설정하는 값 - motor_pin_1~4 : 스텝모터를 제어하는 제어신호를 설정하는 값 motor_pin_1 : A상 제어신호, motor_pin_2 : B상 제어신호, motor_pin_3 /A상 제어신호, motor_pin_4 : /B상 제어신호
함수정리 setSpeed(long whatSpeed) 스텝모터의 분당 회전수를 설정하는 함수 step(steps_to_move) 스텝모터의 실제 스텝을 진행하는 함수 - steps_to_move : 회전 스텝 steps_to_move 값 양수 : 정회전, 음수 : 역회전