본문 바로가기
  • 스스로 행복을 가꾸는 교육을 꿈꾸다
MAKING/우리반 쌤의 똑똑한 메이커 테이블

스테퍼 모터 연구2

by FermeH 2020. 4. 1.

오늘은 드디어 스테퍼 모터를 돌려 보려고 합니다! 

전원 장치와 전용 연결 케이블이 어제 집에 도착했거든요 ㅎㅎ 

그래서 냉큼 사무실로 챙겨 나왔습니다. 

 

 

1차 목표: 스테퍼 모터 작동시키기 

먼저 간단하게 스테퍼 모터 먼저 움직여 보려고 했습니다. 

준비물입니다! (사실은 훨씬 많이 썼다는 건 안비밀입니다 ㅋㅋ)

준비물은 스테퍼 모터 드라이버, 스테퍼 모터, 12v 전원, 아두이노, 빵판 + 많은(11개) 점퍼 케이블, 단선입니다. 

LED 는 혹시 점퍼 케이블이 제대로 작동하지 않는 것이 있을까 보험으로 준비해두었습니다. 

이전 글에서 올린 글을 참고하여 만들었습니다. 구조는 똑같습니다!

https://m.blog.naver.com/PostView.nhn?blogId=roboholic84&logNo=221142584042&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

a4988 스텝 모터 드라이버 알아보기 ( 스테퍼 / 스테핑 / 모터 / 드라이버 / 초퍼 모터드라이버 / 설정 )

안녕하세요? 메카솔루션입니다.이번에는 아두이노 스텝 모터 드라이버인 A4988에 대해 알아보고자 합니다....

blog.naver.com

단, 준비물 사진에서 보이듯이 전원 장치만 준비해서 단선을 잘라 전원 연결 부분을 만들어야 했습니다. 

스트리퍼로 단선의 양 끝을 자른 뒤, 전원 연결 부분에 넣고 상단의 나사를 조여 고정했습니다. 

 


int dirPin = 11;
int stepPin = 12;

void setup(){
  pinMode(dirPin,OUTPUT);
  pinMode(stepPin,OUTPUT);
  digitalWrite(dirPin,HIGH);
}

void loop(){
  for(int i = 0; i <100; i++){  
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(50);
    digitalWrite(stepPin,LOW);
    delay(1);
  }

digitalWrite(stepPin, LOW);
digitalWrite(stepPin, LOW);

delay(100);

}

 

금방 잘 돌아갔습니다. 신났습니다-!ㅎㅎ

 

그래서 다음 목표로 넘어갔습니다.

다음 목표는 원하는 거리만큼만 스테퍼 모터를 움직이는 것이었습니다. 

그래서 다시 문제를 세분화해서 접근했습니다. 

1. 거리 측정 방법 찾기 
2. 원하는 수치의 입력 방법 찾기
3. 일정한 수치 만큼만 (시간이든 거리든) 스테퍼 모터가 작동하도록 하기 
4. 입력한 수치 만큼만 스테퍼 모터가 작동하도록 하기 

1. 거리 측정 방법 찾기 

일단은 거리보다는 간단하게 시간으로 생각해보기로 했습니다. 

위에 작성한 코드를 보면 시간으로 (delay 함수) 작동을 제어할 수 있겠더라구요. 

그렇지만 나중에 이 부분을 더 연구해야 할 것 같습니다. 

 

2. 원하는 수치의 입력 방법 찾기 

카드를 일정한 크기로 자르려면 원하는 수치를 입력해야 했습니다. 

일단 마음대로 카드의 크기를 정할 수 있게 하기는 어렵기 때문에, 3가지 크기를 선택할 수 있도록 하려고 생각하고 있었습니다. ( 2x2 (대) / 3x3 (중) / 4x4 (소))

그래서 1번, 2번, 3번을 선택하게 할 방법이 필요했습니다. 

 

+, - 버튼을 푸시버튼으로 만들면 그 번호를 선택하게 할 수 있겠다는 생각이 들었습니다. 

+버튼을 한 번 누르면 1, 두 번 누르면 2, 거기서 -버튼을 한 번 누르면 1이 됩니다. 

그리고 작동 버튼을 누르면 모터가 그만큼만 작동하는 거죠! 

 

그래서 

 1) 작동 버튼을 토글 스위치로 만들었습니다. 

 

토글 스위치를 만들 때에는 이 자료를 참고했습니다. 

 

[아두이노 강좌] 아두이노 토글 스위치로 LED와 서보모터 동작해보기

안녕하세요 에듀이노 입니다. !! 요즘 바쁘다는 핑계로 오랜만에 글을 올리네요 ㅎㅎ 앞으로는 조금 더 부...

blog.naver.com

 

int ONOFF;

void setup() {
  // put your setup code here, to run once:
  pinMode(6, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:

  ONOFF = digitalRead(A0);
  if(ONOFF == HIGH){
    digitalWrite(6, HIGH);
    delay(100);
    }else{
    digitalWrite(6, LOW);
    delay(100);
      
      }
}

토글 스위치를 돌리니 전기가 통하며 작동했습니다. 

 

스위치 먼저 확인해봅니다.

 

스테퍼 모터가 돌아가는지는 마스킹 테이프를 붙입시다!

 

그런데 이 모델에는 치명적인 문제가 있습니다. 

스위치를 끈 상태에서 회로 전체에 전기가 통하지 않는다는 것입니다 ㅋㅋㅋ 

요 부분을 내일 생각해야 할 것 같아요. 

이제 정지 함수를 만들어서 특정 시간 이후에 멈추도록 하면 될 것 같습니다. 

 

어쨌든, 

  2) 수치를 조정할 수 있는 +, - 버튼을 푸시버튼으로 만들었습니다.

생각해보니 버튼으로 자신이 어떤 숫자를 선택했는지 눈으로 확인하는 것이 좋겠더라구요. 

그래서 세그먼트 캐소드를 사용하기로 했습니다. 이왕이면 안 해본 것 도전해 봐야죠^^

나중에는 실제 크기를 나타낼 것을 생각해 4자리로 연습해보았습니다. 

참고한 자료들입니다. 

https://steemit.com/kr-arduino/@codingman/4-digit-7-segment-display

 

4-Digit 7-Segment Display 제어(아두이노) — Steemit

4-Digit 7-Segment Display 제어(아두이노) 온라인 가상시뮬레이터 : 참고 : 7 Segment LED 제어(아두이노) 시간 millis()함수로 시간… by codingman

steemit.com

https://m.blog.naver.com/PostView.nhn?blogId=eduino&logNo=221066151223&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

[아두이노 강좌] 7세그먼트를 사용하여 숫자 카운트 해보기

안녕하세요 에듀이노 입니다. 이번에는 7 세그먼트를 사용해서 택트스위치를 누르면 0부터 9까지 값이 올라...

blog.naver.com

처음에는 첫 번째 링크에 있는 그대로 따라했습니다. 잘 작동했죠!

그리고 4자리였기 때문에 두 번째 자료를 참고해서 버튼으로 숫자를 올리고 내리는 코드를 만들어보았습니다. 

byte segValue[10][7] = {
   {1,1,1,1,1,1,0}, //0
   {0,1,1,0,0,0,0}, //1
   {1,1,0,1,1,0,1}, //2
   {1,1,1,1,0,0,1}, //3
   {0,1,1,0,0,1,1}, //4
   {1,0,1,1,0,1,1}, //5
   {1,0,1,1,1,1,1}, //6
   {1,1,1,0,0,0,0}, //7
   {1,1,1,1,1,1,1}, //8
   {1,1,1,1,0,1,1}  //9  
};

byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀

int num=0; //현재 LED에 표시되고 있는 숫자 
int button = 12;
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리

void setup() {
  for(int i=0;i<10;i++){
    pinMode(segPin[i], OUTPUT);
  }
  for(int j=0;j<4;j++){
    pinMode(digitPin[j], OUTPUT);   
    digitalWrite(digitPin[j], HIGH); 
  }
  pinMode(button, INPUT_PULLUP);
}

void loop() {   


  if(digitalRead(button) == LOW){
    if(num==9999) num = 0;
    else num++;
    d1 = num%10; //1의 자리
    d2 = (num/10)%10; //10의 자리
    d3 = (num/100)%10; //100의 자리
    d4 = (num/1000)%10; //1000의 자리  
    
    }

  segOutput(3,d1,0); //1의 자리
  if(num>=10) segOutput(2,d2,0); //10의 자리  
  if(num>=100) segOutput(1,d3,0); //10의 자리  
  if(num>=1000) segOutput(0,d4,0); //10의 자리  

  delay(150);
}

//LED 초기화
void segClear(){ 
  for(int i=0;i<8;i++){
    digitalWrite(segPin[i], LOW);        
  }
}

//LED 출력
void segOutput(int d, int Number, int dp){ 
  segClear();
  digitalWrite(digitPin[d], LOW); 
  for(int i=0;i<7;i++){
     digitalWrite(segPin[i], segValue[Number][i]);        
  }
  digitalWrite(segPin[7], dp);
  delayMicroseconds(1000);
  digitalWrite(digitPin[d], HIGH); 
}

보시다시피 문제가 하나 생겼습니다. 

저 깜박거림은 분명 delay 가 잘못된 위치에 있기 때문이었습니다. 

그래서 delay를 다음의 위치로 옮기자, 잘 작동했습니다! 

 

 


byte segValue[10][7] = {
   {1,1,1,1,1,1,0}, //0
   {0,1,1,0,0,0,0}, //1
   {1,1,0,1,1,0,1}, //2
   {1,1,1,1,0,0,1}, //3
   {0,1,1,0,0,1,1}, //4
   {1,0,1,1,0,1,1}, //5
   {1,0,1,1,1,1,1}, //6
   {1,1,1,0,0,0,0}, //7
   {1,1,1,1,1,1,1}, //8
   {1,1,1,1,0,1,1}  //9  
};

byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀

int num=0; //현재 LED에 표시되고 있는 숫자 
int button = 12;
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리

void setup() {
  for(int i=0;i<10;i++){
    pinMode(segPin[i], OUTPUT);
  }
  for(int j=0;j<4;j++){
    pinMode(digitPin[j], OUTPUT);   
    digitalWrite(digitPin[j], HIGH); 
  }
  pinMode(button, INPUT_PULLUP);
}

void loop() {   


  if(digitalRead(button) == LOW){
    if(num==9999) num = 0;
    else num++;
    d1 = num%10; //1의 자리
    d2 = (num/10)%10; //10의 자리
    d3 = (num/100)%10; //100의 자리
    d4 = (num/1000)%10; //1000의 자리  
    delay(150);
    }

  segOutput(3,d1,0); //1의 자리
  if(num>=10) segOutput(2,d2,0); //10의 자리  
  if(num>=100) segOutput(1,d3,0); //10의 자리  
  if(num>=1000) segOutput(0,d4,0); //10의 자리  

  
}

//LED 초기화
void segClear(){ 
  for(int i=0;i<8;i++){
    digitalWrite(segPin[i], LOW);        
  }
}

//LED 출력
void segOutput(int d, int Number, int dp){ 
  segClear();
  digitalWrite(digitPin[d], LOW); 
  for(int i=0;i<7;i++){
     digitalWrite(segPin[i], segValue[Number][i]);        
  }
  digitalWrite(segPin[7], dp);
  delayMicroseconds(1000);
  digitalWrite(digitPin[d], HIGH); 
}

 

오늘은 여기까지 하고, 다음에는 모터와 연결해보는 작업을 해보려고 합니다. 

그래도 스테퍼 모터를 움직였네요! (신남)

 

'MAKING > 우리반 쌤의 똑똑한 메이커 테이블' 카테고리의 다른 글

사이즈 표시 기능 보완  (0) 2020.05.10
스테퍼 모터 연구4  (0) 2020.05.09
스테퍼 모터 연구3  (0) 2020.05.09
스테퍼 모터 연구1  (0) 2020.03.27
(사실은 이미..) 시작!  (0) 2020.03.27

댓글