정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 스텝모터
1Q2W3E4R | 2019-08-28

1. 프로젝트 사용한 보드 종류

 

아두이노 UNO

  

2. 사용한 센서 모델명

 

스텝모터 35HSH24010A-30

 

드라이버 A4988 Stepper Motor Driver

 

3. 문제점 

실행 컴파일, 업로드가 됬는데 작동을 하지않습니다

코드에 문제가 있는지 알고싶습니다 (커페시터 없이 했습니다

 

그리고 유튜브 영상에 커페시터가  필요하다는데 왜 필요한지 궁금합니다 

https://www.youtube.com/watch?v=Iv3zjJ9VFws

 

4. 연결한 회로 설명 (또는 이미지)

 

 

 

5. 소스코드 (주석 필수)

 

#include

 

//핀 설정

const int EnablePin = 4; //모터 Enable 핀

const int StepPin = 3; //모터 PWM 핀

const int DirectionPin = 2; // 모터 방향 핀

 

 

//속도

const int FastMove = 200;

const int SlowMove = 1000;

 

 

// 리모콘 관련

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

 

 

uint16_t irCustomeCode; //커스텀 ID (2바이트)

uint8_t irValue; // 실제 버튼 값

uint8_t irInvertValue; // 버튼값의 반전된 값

 

 

//사용하는 리모콘의 버튼값

const uint8_t IR_BACK_KEY = 0xE0;

const uint8_t IR_GO_KEY = 0xA0;

const uint8_t IR_REPEAT_KEY = 0xFF;

 

const uint8_t NOTHING_KEY = 0;

const uint8_t BACK_KEY = 1;

const uint8_t GO_KEY = 2;

 

void setup()

{

       // 핀 설정

       pinMode(EnablePin, OUTPUT);

       pinMode(StepPin, OUTPUT);

       pinMode(DirectionPin, OUTPUT); 

 

 

       // 모터 IC ON

      digitalWrite(EnablePin,LOW);

 

      Serial.begin(9600);

 

 

      //리모콘 시작

      irrecv.enableIRIn();

   }

 

//리모콘 키 입력 함수

uint8_t oldIrKey = NOTHING_KEY;

uint8_t getIRKey()

{

    uint8_t key=NOTHING_KEY;  //리모콘 데이터가 있으면

    if (irrecv.decode(&results)) {

        //커스텀 ID와 데이터 분리

        irCustomeCode = (results.value>>16)&0xFFFF;

        irValue = (results.value>>8)&0xFF;

        irInvertValue = results.value&0xFF;

        irrecv.resume();

 

       //리모콘 데이터가 정상인지 체크

       if(~irValue != irInvertValue)
      {
          //키값 모니터에 출력
          Serial.println(irValue,HEX);
          //키가 GO 버튼이라면
          if( irValue == IR_GO_KEY)
        {
           key = GO_KEY;
           oldIrKey = key;
         }
           //키가 BACK 버튼이라면
            else if(irValue == IR_BACK_KEY)
             {
                key = BACK_KEY;
                oldIrKey = key;
             }
              //키가 계속 눌린 상태라면 
              else if(irValue == IR_REPEAT_KEY)
              {
                 //이전 버튼 상태를 전달 함
                 key = oldIrKey;
               }
               else
               {
                //에러
                 oldIrKey = 0;
                }
           }
         else
          {
           //에러
           oldIrKey = 0;
           }
      }
 
    return key;
 }
 
    void loop()
    {
      int i;
     //리모컨 버튼값 얻어오기
     uint8_t irKey = getIRKey();
     //버튼이 GO라면
     if(irKey == GO_KEY)
     {
       //High 상태는 시계방향 이동
       digitalWrite(DirectionPin,HIGH);
       for(i = 0; i < 50; i++)
       {
        //ON 1.8의 1/4 움직임
        digitalWrite(StepPin,HIGH);
        //1ms(1000us) 대기
        delayMicroseconds(SlowMove);
        //OFF 1.8의 1/4 움직임
        digitalWrite(StepPin,LOW);
        //1ms(1000us) 대기
        delayMicroseconds(SlowMove);
       }
    }
   //버튼이 Back이라면
   else if(irKey == BACK_KEY)
   {
       //Low 상태는 반시계방향 이동
       digitalWrite(DirectionPin,LOW);
       for(i = 0; i < 500; i++)
       {
        digitalWrite(StepPin,HIGH);
        //0.2ms(200us) 대기
        delayMicroseconds(FastMove);
        digitalWrite(StepPin,LOW);
        //0.2ms(200us) 대기
        delayMicroseconds(FastMove);
       }
   }
}
 
이전글   |    피에조부저 연주 2019-08-27
다음글   |    아두이노 팬 2019-08-28