2013. 12. 26. 15:00

스텝모터와 스텝모터 제어용칩을 여러가지 테스트하다보니 불편해서 컴퓨터없이 전원만 넣고 테스트할 필요성을 느꼈습니다.

 

1. 기획

테스트를 위한 기능은 2가지입니다.

속도 조절과 앞과 뒤로 움직이는 동작 입니다.

 

스텝모터는 스텝을 조절할 수 있지만 7세그먼트나 LCD없이 스텝을 조절하는 동작을 넣는건 사용상 데이터를 보여주기 힘들기 때문에 1회전을 기준으로 합니다.

 

속도조절의 경우 증가/감소 각각 스위치를 넣는 것도 좋지만 정밀하게 속도 조절을 할것이 아니기 때문에 누를때마다 속도가 증가하다가 최대치가 되면 다시 0이 되도록 하는 것이 인터페이스상 더 좋을것 같습니다.

 

정리하면

속도조절 : 스위치 1개를 이용하여 속도 증가. 속도를 표시하기위해 LED의 발기를 조절 한다.

앞/뒤 회전 : 속도조절값을 기준으로 1바퀴 회전합니다.

 

2. 보드 구성

일단 테스트를 위해 빵판(브래드보드, breadboard)에 먼저 만들어 보고 만능기판으로 옮기겠습니다.

 

2-1. 브래드 보드

눈 돌아갈 준비 되셨습니까? ㅎㅎㅎㅎ

 

 

 

 

2-2. 만능기판

 

만능기판을 생각하지 않고 빵판을 만들었더니 만능기판에 같은 모양으로 붙이려고 하니까 모양이 이상해서 다시 구성했습니다.

 

 

모터의 전원은 따로 공급하고 있는데 제가 쓰는 모터가 4볼트 짜리라 그렇습니다.

그리고 상황에 따라서 모터에 따로 전원을 공급하려고 이렇게 구성하였습니다.

 

3. 펌웨어 작성

이 코드에서 주의해서 보아야 할 것은 스위치의 반복 작동을 막기위해 따로 변수를 관리하고 있다는 것입니다.

이런식의 반복문을 통한 스위치처리시에 조심해야 할것은 스위치가 누르는 순간 여러번 스위치가 반복될수 있다는 것입니다.

그렇기 때문에 버튼을 다시 땔때까지 더이상 스위치가 작동하지 않도록 해야 하죠.

 

#include <Stepper.h>

#define LED 3
#define BTN 7

#define BTN_L 6
#define BTN_R 5

Stepper stepper(200, 8, 9, 10, 11);

int m_nBtn = 0;

int m_nBtnL = 0;
int m_nBtnR = 0;

int m_nCount = 4;
boolean m_bButton = false;
boolean m_bSM = false;

int m_nLed = 0;

void setup()
{
  Serial.begin(9600);

  pinMode( LED, OUTPUT);
  
  pinMode( BTN, INPUT);
  
  pinMode( BTN_R, INPUT);
  pinMode( BTN_L, INPUT);
 
  //stepper.setSpeed(100); 
}

void loop()
{
  m_nBtn = digitalRead(BTN);
  m_nBtnL = digitalRead(BTN_L);
  m_nBtnR = digitalRead(BTN_R);

  //Serial.println( (String)m_nBtn);
  Serial.println( (String)m_nBtnL + " " + (String)m_nBtnR + " " + (String)m_nCount);
  if( HIGH == m_nBtnL)
  {
    Step(-1);
  }
  else if( HIGH == m_nBtnR)
  {
    Step(1);
  }
  else if( HIGH == m_nBtn )
  {
    DataCount(true);
  }
  else
  {
    DataCount(false);
  }
  
  m_nLed = (m_nCount * 63);
  analogWrite(LED, m_nLed );
//  Serial.println( (String)m_nCount + " " + (String)m_nLed);
}

void Step(int nN)
{
  if(( 0 == m_nCount)
    || ( true == m_bSM))
  {
    return;
  }
  
  m_bSM = true;
  stepper.setSpeed(m_nCount * 25);
  stepper.step(200 * nN);
  //Serial.println( (String)(m_nCount * 50) + " " + (String)(200 * nN));
  BtnLow();
  m_bSM = false;
}

void DataCount(boolean bPB)
{
  if((true == bPB)
      && (false == m_bButton))
  {
    
    m_bButton = true;
    DataAdd();
  }
  else if((false == bPB)
          && (true == m_bButton))
  {
    m_bButton = false;
  }
}

void DataAdd()
{
  ++m_nCount;
  if( 5 <= m_nCount)
  {
    m_nCount = 0;
  }
}

void BtnLow()
{
  m_nBtn = LOW;
  m_nBtnL = LOW;
  m_nBtnR = LOW;
}

 

 

코드에서 'DataCount()'함수에 스위치의 반복을 막아주는 코드가 들어 있습니다.

false == m_bButton

이 코드를 빼면 스위치가 반복을 판단할 수 없어 LED가 깜박거리는 것을 볼수 있습니다.

 

4. 테스트

이제 USB를 빼고 전원만 넣고 테스트를 해봅시다.

 

 

원하는데로 잘돌아 가네요.

어차피 동작 테스트 용이긴 하지만 말이죠.