이전 글에서 'Stepper.h'는 '.step()'이 동작하는 동안 다른 동작을 할 수 없다는 것을 이야기하였습니다.

(참고 : [Arduino] 'Stepper.h'는 두개의 모터를 제어할 수 없다.)

 

그래서 'Stepper.h'를 약간 개조하여 한번에 여러 개의 동작(스탭모터라던가 led같은 것들)을 할 수 있도록 수정하겠습니다.

 

 

 

1. 기존 라이브러리 분석하기

저번 글에서도 잠깐 이야기했습니다만 기존 라이브러리의 문제는 'while()'문이 끝나야 '.step()'가 끝난다는 것입니다.

 

그러니 기존 '.step()'에서 'while()'문 안의 내용을 따로 메소드로 빼서 호출해야 합니다.

 

 

2. 개조하기

이제 기존에 있는 라이브러리의 코드를 그대로 복사하여 이름을 'StepperMulti'로 바꿔 준다음 내용을 수정합니다.

2-2. 'StepperMulti.h' 수정하기

(1) '.step()'의 역할이 좀 달라졌으므로 'setStep()'로 이름을 바꾸고 'void moveStep();'를 추가합니다.

(2) '.step()'의 안에 지역변수가 있는데 이것을 꺼내서 클래스 지역변수로 만듭니다.

 

/*
  StepperMulti.h
  ( http://blog.danggun.net/2092 )

  이 라이브러리는 아두이노의 'Stepper.h'를 개조한 라이브러리입니다.
  (Stepper.h : http://arduino.cc/en/reference/stepper )
  모든 내용은 'Stepper.h'와 거의 동일합니다.
  (0.4버전 기준)
  
*/

// ensure this library description is only included once
#ifndef StepperMulti_h
#define StepperMulti_h

// library interface description
class StepperMulti 
{
  public:
    // constructors:
    StepperMulti(int number_of_steps, int motor_pin_1, int motor_pin_2);
    StepperMulti(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4);

    // speed setter method:
    void setSpeed(long whatSpeed);

    // mover method:
    void setStep(int number_of_steps);

	//'loop()'안에서 이 메소드를 호출해야 한다.
	void moveStep();

  private:
    void stepMotor(int this_step);
    
    int direction;        // Direction of rotation
    int speed;          // Speed in RPMs
    unsigned long step_delay;    // delay between steps, in ms, based on speed
    int number_of_steps;      // total number of steps this motor can take
    int pin_count;        // whether you're driving the motor with 2 or 4 pins
    int step_number;        // which step the motor is on
    
    // motor pin numbers:
    int motor_pin_1;
    int motor_pin_2;
    int motor_pin_3;
    int motor_pin_4;
    
    long last_step_time;      // time stamp in ms of when the last step was taken

	//스텝 저장
	int steps_left;
};

#endif

 

 

 

 

 

2-2. 'StepperMulti.cpp' 수정 하기

'StepperMulti.h'에서 수정한 'setStep()'과 'void moveStep();'을 만들어야 합니다.

 

(1) 기존에 있던 'step()'의 이름을 'setStep()'로 바꿉니다.

(2) 'void moveStep()'을 만듭니다.

(2) 'setStep()'의 내용 중 'while()'문의 내용을 'void moveStep()'으로 옮깁니다.

 

#include "Arduino.h"
#include "StepperMulti.h"

/*
 * two-wire constructor.
 * Sets which wires should control the motor.
 */
StepperMulti::StepperMulti(int number_of_steps, int motor_pin_1, int motor_pin_2)
{
  this->steps_left = 0;	//스탭초기화

  this->step_number = 0;      // which step the motor is on
  this->speed = 0;        // the motor speed, in revolutions per minute
  this->direction = 0;      // motor direction
  this->last_step_time = 0;    // time stamp in ms of the last step taken
  this->number_of_steps = number_of_steps;    // total number of steps for this motor
  
  // Arduino pins for the motor control connection:
  this->motor_pin_1 = motor_pin_1;
  this->motor_pin_2 = motor_pin_2;

  // setup the pins on the microcontroller:
  pinMode(this->motor_pin_1, OUTPUT);
  pinMode(this->motor_pin_2, OUTPUT);
  
  // When there are only 2 pins, set the other two to 0:
  this->motor_pin_3 = 0;
  this->motor_pin_4 = 0;
  
  // pin_count is used by the stepMotor() method:
  this->pin_count = 2;
}


/*
 *   constructor for four-pin version
 *   Sets which wires should control the motor.
 */

StepperMulti::StepperMulti(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4)
{
  this->steps_left = 0;	//스탭초기화

  this->step_number = 0;      // which step the motor is on
  this->speed = 0;        // the motor speed, in revolutions per minute
  this->direction = 0;      // motor direction
  this->last_step_time = 0;    // time stamp in ms of the last step taken
  this->number_of_steps = number_of_steps;    // total number of steps for this motor
  
  // Arduino pins for the motor control connection:
  this->motor_pin_1 = motor_pin_1;
  this->motor_pin_2 = motor_pin_2;
  this->motor_pin_3 = motor_pin_3;
  this->motor_pin_4 = motor_pin_4;

  // setup the pins on the microcontroller:
  pinMode(this->motor_pin_1, OUTPUT);
  pinMode(this->motor_pin_2, OUTPUT);
  pinMode(this->motor_pin_3, OUTPUT);
  pinMode(this->motor_pin_4, OUTPUT);

  // pin_count is used by the stepMotor() method:  
  this->pin_count = 4;  
}

/*
  Sets the speed in revs per minute

*/
void StepperMulti::setSpeed(long whatSpeed)
{
  this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
}

/*
  Moves the motor steps_to_move steps.  If the number is negative, 
   the motor moves in the reverse direction.
 */
void StepperMulti::setStep(int steps_to_move)
{  
  this->steps_left = abs(steps_to_move);  // how many steps to take
  
  // determine direction based on whether steps_to_mode is + or -:
  if (steps_to_move > 0) {this->direction = 1;}
  if (steps_to_move < 0) {this->direction = 0;}
  
  //스탭을 진행 한다.
  moveStep();
}

void StepperMulti::moveStep()
{
	//남은 스텝이 있는지?
	if(this->steps_left > 0)
	{
		// move only if the appropriate delay has passed:
		if (millis() - this->last_step_time >= this->step_delay) 
		{
			// get the timeStamp of when you stepped:
			this->last_step_time = millis();
			// increment or decrement the step number,
			// depending on direction:
			if (this->direction == 1) 
			{
				this->step_number++;
				if (this->step_number == this->number_of_steps) 
				{
					this->step_number = 0;
				}
			} 
			else 
			{ 
				if (this->step_number == 0) 
				{
					this->step_number = this->number_of_steps;
				}
				this->step_number--;
			}
			// decrement the steps left:
			this->steps_left--;
			// step the motor to step number 0, 1, 2, or 3:
			stepMotor(this->step_number % 4);
		}
	}
}


/*
 * Moves the motor forward or backwards.
 */
void StepperMulti::stepMotor(int thisStep)
{
  if (this->pin_count == 2) {
    switch (thisStep) {
      case 0: /* 01 */
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      break;
      case 1: /* 11 */
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, HIGH);
      break;
      case 2: /* 10 */
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      break;
      case 3: /* 00 */
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      break;
    } 
  }
  if (this->pin_count == 4) {
    switch (thisStep) {
      case 0:    // 1010
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      break;
      case 1:    // 0110
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      break;
      case 2:    //0101
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      break;
      case 3:    //1001
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      break;
    } 
  }
}

 

 

 

 

3. 테스트하기

설마 여기까지 왔는데 라이브러리에 추가하는 것을 모르시는 건 아니겠죠?

모르시면 이전 글을 참고하시면 됩니다.

(참고 : [Arduino] 라이브러리 작성하기)

 

테스트용 프로그램을 만듭니다.

여기서 중요한 것은 'loop()'안에서 '.moveStep()'를 호출해야 합니다.

 

그 외에는 기존 'Stepper.h'와 비슷합니다.

 

#include <StepperMulti.h>

StepperMulti stepper(200, 8, 9, 10, 11);
StepperMulti stepper2(200, 4, 5, 6, 7);
 
 
void setup()
{
  Serial.begin(9600);
  stepper.setSpeed(30);
  stepper2.setSpeed(60);
}
 
void loop()
{
  if (Serial.available())
  {
    Serial.read();
    stepper.setStep(200);
    stepper2.setStep(200);
  }
  
  stepper.moveStep();
  stepper2.moveStep();
}

 

 

 

이제 시리얼 모니터를 열고 데이터를 날려 봅시다.

 

 

잘 보시면 각각 모터가 속도가 다른걸 알 수 있습니다.

기존의 'Stepper.h'를 이용했다면 모터 한 개가 동작을 끝내야 다음 모터가 동작할 수 있죠.

하지만 우리가 개조한 'StepperMulti.h'는 그렇지 않습니다.

 

이전 글에서처럼 led를 연결해도 마치 안켜진 것 처럼 켜졌다 꺼집니다.

 

 

마무리

이렇게 만든 라이브러리를 다운 받으세요 ㅎㅎㅎ

 

StepperMulti.zip

 

아두이노 폴더 밑에 'libraries'에 압축 푸시거나 '라이브러리 추가(Add Library...)'로 추가하시면 됩니다.

 

 

여전히 왜 이런 자료를 못 찾은 것인지는 의문이지만 원하는 데로 작동하니 기분은 좋네요.

저번에도 말했다싶이 이렇게 수정한 코드는 'loop()'의 딜레이에 의해 잘못된 동작을 할 여지가 있습니다.

그건 각자 알아서 처리하셔야 합니다 ㅎㅎㅎ

 

  1. 이전 댓글 더보기
  2. YGREEN 2016.11.03 17:41 신고  Address  Edit/Delete  Reply

    질문드리고 싶은게 있습니다.
    2상 바이폴라 스텝각 1.8도인 스텝모터를 구동하고싶습니다.
    구동은 확인되나, 고속회전을 하고싶어 rpm을 올렸을때 진동만하고 회전을 안합니다.
    어떤 문제인가요..?
    모터드라이버는 L298N을 사용중에 있습니다.
    전원은 외부전원을 안쓰고 아두이노에서 뽑아썼습니다.

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2016.11.04 11:57 신고  Address  Edit/Delete

      모터는 속도가 올라갈 수록 전류를 많이 먹습니다.
      아두이노에서 직접 연결하는걸 권장하지 않는 이유는 전류가 부족해서 입니다.

      저도 이걸 계산할줄 몰라서 공부를 좀 해야 하는데....
      데이터시트를 보면 전기에 관한 스팩이 나와 있습니다.(V, A, mH 등등)
      스탭모터는 1스탭에 사용하는 전류가 일정합니다.
      1스탭 = 1펄스 = 1스탭당 각도(여기서는 1.8도를 기준으로 말하겠습니다.)
      입니다.
      1스탭에 0.1mA를 사용하는 모터가 한바퀴를 돌았으면
      200 * 0.1mA =20mA
      를 소모한겁니다.

      이런 내용을 기반해서 사용 전류를 계산해보고 그에 맞게 넉넉하게 공급해야 합니다.

  3. 2016.11.07 21:34  Address  Edit/Delete  Reply

    비밀댓글입니다

  4. 이상혁 2016.11.11 13:32 신고  Address  Edit/Delete  Reply

    안녕하세요 유튜브 검색중 스텝모터관련 자료를 찾아보다가 이렇게 좋은자료를 만나게되어
    송구스럽지만 질문좀 드리겠습니다!!

    다름이 아니라 스텝모터 24개를 각각 제어를 하고 싶은데요.
    아두이노로는 무리일거 같고..
    atmega128로는 가능할까요??
    아니면 다른방도가 있을까요??

    스텝모터 24개가 각각 제어가 가능해야합니다.
    아직 많이 모르고 부족해서 어디서부터 손을대야할지 모르겠네요..

    미리 감사드립니다!

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2016.11.13 01:45 신고  Address  Edit/Delete

      가능은 합니다.
      확장보드를 이용해 256개인가 까지 포트 확장이 가능합니다.
      근데 꼭 아두이노를 사용할 필요는 없으니 좀더 알아보시고 공부하시면 됩니다 ㅎㅎㅎ

  5. 이서호 2016.12.03 00:43 신고  Address  Edit/Delete  Reply

    안녕하세요~!
    제가 스탭모터 돌리려고 하는데 ic를 l297 이랑 sla7024 를 이용해서 돌리는데
    이코드를 넣으면 돌릴수 있을까요?
    회로를 잘몰라서요 ㅠㅠ 가능할지 궁급합니다

  6. 이서호 2016.12.04 21:04 신고  Address  Edit/Delete  Reply

    회로도에 따라 다르다는게 무슨말인지 알수있을까요?

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2016.12.05 11:20 신고  Address  Edit/Delete

      회로도는 부품에 따라서 다를 수 있지만 아두이노 코드는 동일합니다.
      이 블로그에 하드웨어 카테고리에서 사용한 부품이 아닌 다른 부품을 사용한다면 부품구성에 따라서 회로도가 다를 수 있다는 것이죠.

  7. 이서호 2016.12.05 22:40 신고  Address  Edit/Delete  Reply

    아하 감사합니다
    근데 sla7024 만 으로 돌리는 사람도 있더라고요
    근데 저는 l297 sla7024 둘다 같이 해서 회로를 꾸미는데 잘돌아가겠죠? ㅠㅠ

  8. 한스 2017.03.06 22:21 신고  Address  Edit/Delete  Reply

    #include <StepperMulti.h>

    StepperMulti stepper(200, 8, 9, 10, 11);
    StepperMulti stepper2(200, 4, 5, 6, 7);
    int startButton = 13;
    unsigned long step_delay;

    void setup()
    {
    Serial.begin(9600);
    stepper.setSpeed(500);
    stepper2.setSpeed(1000);
    pinMode(startButton, INPUT_PULLUP);
    }

    void loop()
    {
    if (digitalRead(startButton) == HIGH)
    {
    stepper.setStep(5000);
    stepper2.setStep(20000);
    delay(2000);
    stepper.setStep(-5000);
    stepper2.setStep(-20000);
    }
    stepper.moveStep();
    stepper2.moveStep();
    }

    반대방향 회전이 안 되네요.
    코드가 어떻게 잘못 된 건가요?

  9. 이준 2017.03.27 12:32 신고  Address  Edit/Delete  Reply

    스텝모터 사용해서 평면 내에 원하는 위치나 좌표로 제어하고 싶은데 생각보다 어렵네요ㅠㅠ

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2017.03.28 20:05 신고  Address  Edit/Delete

      그러면서 배우는 거죠 ㅎㅎㅎㅎ
      3d 프린터 만들때 스탭모터 두개로 좌표찍는거 많이 하니까 그런 자료 보면 쉽게 하실 수 있을듯 합니다.

  10. 박상진 2017.04.04 18:24 신고  Address  Edit/Delete  Reply

    안녕하세요 ! 글 잘보고있습니다. 재가 초음파센싱을 통한 스텝모터 제어를 하는도중 초음파센서가 스텝모터의 클럭을 잡아먹는 현상때문에 글을 찾는데 이글이 보이네요! 그런데 여전히 초음파센서의 pulsein함수가 스텝모터의 클럭을 잡아먹내요.. 본 문에서 함수를 타이머쪽으로 돌려두 그런데 라이브러리쪽에서 수정을 어떻게하면될지 조금이나마 조언을 구하고 싶습니다! 모터 드라이버는 am-ms2입니다!

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2017.04.05 04:31 신고  Address  Edit/Delete

      초음파센서의 값을 읽는 기본코드는 반복문을 별도로 돌리지 않는데 코드자체가 문제인듯 하네요.
      for문이나 딜레이가 있는지 확인해 보세요.

  11. 박상훈 2017.05.09 17:17 신고  Address  Edit/Delete  Reply

    게시하신 게시물 정말 도움이 많이 되었습니다. 그런데 아두이노 코딩에서는 오류가 나타나지 않는데 정작 두 스텝모터가 작동하지 않습니다. 회로상의 문제가 없음은 다른 코딩으로 확인하였습니다. 현재 12V어답터와 아두이노 자체의 전력공급을 동시에 하고있습니다. 그 외에 혹시 다른 미작동의 문제가 있는지 알려주실 수 있으신가요. 왜 구동이 안되는지 모르겠어서 답답합니다...

  12. 박상훈 2017.05.10 13:51 신고  Address  Edit/Delete  Reply

    기존 소스가 무엇인지 잘 모르겠습니다만 예제파일로 아무거나 실행해봤을때는 잘 돌아갔구요 당근님이 포스팅하신 코딩으로 했을때는 미세한 진동조차 없어서요. 보통 안되더라도 코딩에서 오류가 뜨거나 진동은 느껴졌었는데 말입니다.

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2017.05.10 14:17 신고  Address  Edit/Delete

      기존 라이브럴리에서 동작한다면 '3. 테스트하기' 의 코드만 넣고도(핀번호만 맞추고) 동작해야 정상입니다.
      먼저 '3번' 예제를 모터 1개만 붙여서 테스트 해보세요.

      이 코드가 예전 버전 기준이라 현제 버전과 맞지 않을 수 있습니다.
      본문내용대로 최신버전을 수정해보시길 바랍니다.

  13. 아두이노초보 2017.07.24 09:05 신고  Address  Edit/Delete  Reply

    저기 라이브러리 다운받고 알집으로 추가했는데 테스트 구동이 안되네요ㅠㅠ 모터 종류가 달라서 그럴까요?? 현재 사용하고있는 모터는 ULN2003 스테핑 모터를 사용하고 있습니다.

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2017.07.24 09:26 신고  Address  Edit/Delete

      알집으로 풀었다는게 압축을 풀었다는 의미인가요? 아니면 그냥 압축파일을 복사해서 넣었다는 건가요?

    • 아두이노초보 2017.07.24 10:06 신고  Address  Edit/Delete

      위에 올려주신 라이브러리 알집을 스케치 -라이브러리 포함하기- zip 라이브러리추가 했었습니다.

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2017.07.25 23:00 신고  Address  Edit/Delete

      아두이노의 기능으로 불러오는 경우 라이브러리 자체가 잘 불러와지지 않는 현상이 있습니다.

      http://danggun.tistory.com/2055
      이글의 2-1을 참고하셔서 수동으로 넣어보시길 바랍니다.

    • 아두이노초보 2017.07.26 16:33 신고  Address  Edit/Delete

      답변 감사드립니다. 저기 위에 테스트용
      코드 적어놓으신거에 stepper(200, 8, 9, 10, 11); 200 이랑 setstep(200) 이 의미하는게 뭔지 알려주실 수 있나요? 초보라 이해가안되네요ㅠ

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2017.07.28 03:38 신고  Address  Edit/Delete

      흠...
      이건 기본 스탭모터 라이브러리와 동일합니다.
      사용할 핀번호와 1바퀴 스탭수를 설정하는 것입니다.

  14. Favicon of http://naver.com BlogIcon 민경훈 2017.07.24 19:24 신고  Address  Edit/Delete  Reply

    <StepperMulti.h> 이 라이브러리를 사용하면 여러개의 스텝모터를 동시에 제어가능하고 따로 제어가 가능하나요?

    <StepperMulti.h> 이 라이브러리를 사용하면서 스텝모터를 따로 제어가 가능하다면 어떻게 하면 될까요?

    <StepperMulti.h> 이 라이브러리를 사용하면서 스텝모터를 따로 제어가 불가능할 시
    <StepperMulti.h> <Stepper.h> 을 한번에 사용하면 동시제어와 따로 제어가 가능하나요?



  15. Favicon of http://naver.com BlogIcon gg 2017.07.31 09:50 신고  Address  Edit/Delete  Reply

    https://www.youtube.com/watch?v=ntlI-pDUxPE
    <참고로 이 로봇을 만들고 있습니다>

    스텝모터 2개를 동시에 작동시키고 나서 바로 다른 스텝모터 2개를 작동시키려 면 코드를 어떻게 짜야 하는지 궁금합니다.

    여러개의 스텝모터를 동시에 작동시키고 나서 1개의 모터를 따로 작동시킬 때,
    stepper.step();라고 하면되나요?

    이 모든 동작을 <StepperMulti.h> 이것만으로 다 할 수 있죠?

    많은 질문이라 죄송합니다. ㅠ

  16. 아두이노배우자 2017.08.28 17:55 신고  Address  Edit/Delete  Reply

    stepper multi 라이브러리를 사용하면 처음에 라이브러리 불러올떄 #include <StepperMulti.h> 여기서 stepperMulti.h가 색깔이 변해야지 인식이 된건가요?

  17. 이거 정말 좋네요! 2017.09.23 08:11 신고  Address  Edit/Delete  Reply

    와 이건 정말 좋네요 최신버전에서 잘됩니다. (1.8.4 기준)
    stepperMulti.h은 변하지 않습니다.

    서보모터3개로 해봤는데 3개로 동시에 제어되는게 정말 마음에드네요.

    그런데 제가 너무 초보라 3개를 제어를 동시제어하면서 정,역 회전하고 싶은데 생각보다 어렵네요 ㅠㅠ

    공부가 답인 것 같습니다.

    이 정보 공유해 주셔서 정말 감사합니다. 많이 배우고 갑니다!!

  18. 도움이 필요해요 ㅠㅠ 2018.04.03 11:44 신고  Address  Edit/Delete  Reply

    좋은글 감사합니다.
    제가 아두이노 초보라 한가지 궁금한점이 있습니다.

    동작을 올려주신대로 작동을 하였을 때, 모터가 0.몇초정도 떠는느낌만 나는데 이게 제가 스테핑모터를 잘못 연결해서 그렇다고 판단하였습니다. 그래서 질문을 드립니다.

    보통 제가 스태핑모터의 IN1,2,3,4 를 우노의 8,9,10,11에 연결하였을 때,
    Stepper myStepper(stepsPerRevolution, 11,9,10,8); 라고 적었습니다.

    하지만 이 글에서는
    StepperMulti stepper(200, 8, 9, 10, 11);
    로 적어주셨습니다.

    그래서 스테핑모터를 우노에 연결할 때, IN1,2,3,4를 8,9,10,11에 연결하고, 위처럼 StepperMulti stepper(200, 11, 9, 10, 8);로 적어서 실행도 해 보았으나 정상적으로 진행이 되지 않습니다.

    저는 이 문제가 모터연결과 관련있다고 생각하였는데, 작성자님께선 어떻게 생각하시는가요 ㅠㅠ

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2018.04.09 01:54 신고  Address  Edit/Delete

      데이터 시트를 확인하시면 역순으로 연결할지 정방향으로 연결할지 알 수 있습니다.
      대부분의 모터가 정방향으로 알고 있습니다.
      그리고 200이라고 되어 있는 부분도 모터에 따라 다른 값을 넣어야 합니다.

  19. 홍세영 2018.05.26 06:57 신고  Address  Edit/Delete  Reply

    안녕하세요 학교과제로 모터 돌리기를 하고있는데여 ㅠ
    글은 정말 잘봤습니다 근데 궁금한게 있어서요
    이게 소스인데- 모터가 서로 도는 속도가 조금은 다르더라구요
    위에 딜레이로 조절하라고 하셨는데
    제가 답을 모르곘어서.. 그냥 노가다로 모터마다 속도를 맞추면 되는건가요?

    #include <StepperMulti.h>

    StepperMulti stepper(200, 8, 9, 10, 11);
    StepperMulti stepper2(200, 4, 5, 6, 7);
    int startButton = 13;


    void setup()
    {
    Serial.begin(9600);
    stepper.setSpeed(50);
    stepper2.setSpeed(50);
    pinMode(startButton, INPUT_PULLUP);
    }

    void loop()
    {
    if (digitalRead(startButton) == HIGH)
    {
    Serial.println(startButton);
    stepper.setStep(500);
    stepper2.setStep(500);
    }

    stepper.moveStep();
    stepper2.moveStep();
    }

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2018.05.30 01:55 신고  Address  Edit/Delete

      같은 스팩의 모터일때 파워가 충분하다면 두 모터의 속도가 거의 같아야 정상입니다.
      제가 본문에서 말한 딜래이는 5개이상의 많은 수를 컨트롤 할때 발생할 수 있다는 의미입니다.

      눈에 띄게 차이가 일정하게 난다면 노가다로 해결하면 되긴 되는데.....
      한번 여러개 붙여서 테스트해봐야 할것 같네요.

    • 홍세영 2018.06.11 06:26 신고  Address  Edit/Delete

      감사해요 ㅠㅠ 많이 배웠어요
      저 그런데 혹시 얘가 역회전을 안하는데
      뭐가 잘못된건지 말씀해주실수 있나요? 참고로 시리얼속도를 9600으로 하니까 엄청 천천히 끊기면서 돌길래 지금 속도가 74880 입니다
      모터는 28byj-48 이에요



      if ((tn>=0) && Y==0 && X==301) // X값이 301이고, 터치가 유지되면 [[ 모터 돌림 ]]
      {
      {
      Serial.println("모터 돌리는중");
      stepper2.setStep(256);
      stepper1.setStep(-256);
      }
      stepper1.moveStep();
      stepper2.moveStep();
      }

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2018.06.14 02:36 신고  Address  Edit/Delete

      Serial.begin은 속도를 설정하는 것입니다.
      이건 연결된쪽과 같은 속도로 설정하지 않으면 문제 생깁니다.

      역회전은 왜 안되는지 모르겠네요.
      제가 아두이노를 세팅할수 있는 상황이 아니라서 확인이 힘들듯 합니다.

  20. SGW 2018.08.29 16:41 신고  Address  Edit/Delete  Reply

    #include <StepperMulti.h>


    StepperMulti stepper(200, 5, 6, 7, 8) ; // A,A바,B,B바
    StepperMulti stepper2(200, 9, 10, 11, 12);
    int Button1 = 3;
    int Button2 = 4;

    void setup()
    {
    Serial.begin(9600);
    pinMode(Button1,INPUT);
    pinMode(Button2, INPUT);
    }

    void loop()
    {
    if(digitalRead(Button1) ==HIGH)
    {
    stepper.setSpeed(30);
    stepper2.setSpeed(30);
    stepper.setStep(100);
    stepper2.setStep(100);
    }
    stepper.moveStep();
    stepper2.moveStep();
    stepper.setStep(0);
    stepper2.setStep(0);

    if(digitalRead(Button2) ==HIGH)
    {
    stepper.setSpeed(30);
    stepper2.setSpeed(30);
    stepper.setStep(-100);
    stepper2.setStep(-100);
    }
    stepper.moveStep();
    stepper2.moveStep();
    stepper.setStep(0);
    stepper2.setStep(0);
    }
    제가 지금 버튼 1을 눌렀을 때는 180도 정회전 하고 그대로 놔두고 버튼 2를 눌렀을 때
    180도 역회전하는 코드를 작성하려는데 초보이다 보니깐 문법 신경안쓰고 코드르 작성했는데요
    이 코드대로 하면 동작이 될지 모르겠습니다.
    코드에 대해 도움 주시면 감사하겠습니다.

  21. SGW 2018.09.13 19:18 신고  Address  Edit/Delete  Reply

    #include <StepperMulti.h>


    StepperMulti stepper(200, 5, 6, 7, 8) ; // A,A바,B,B바
    StepperMulti stepper2(200, 9, 10, 11, 12);
    int Button1 = 3;
    int Button2 = 4;

    void setup()
    {
    Serial.begin(9600);
    pinMode(Button1,INPUT);
    pinMode(Button2, INPUT);
    }

    void loop()
    {
    if(digitalRead(Button1) ==HIGH)
    {
    stepper.setSpeed(60);
    stepper2.setSpeed(60);
    stepper.setStep(100);
    stepper2.setStep(100);

    }


    if(digitalRead(Button2) ==HIGH)
    {
    stepper.setSpeed(60);
    stepper2.setSpeed(60);
    stepper.setStep(-100);
    stepper2.setStep(-100);

    }
    }
    정회전은 잘 되는데 역회전 버튼은 눌러도 꿈쩍도 안하는데 원인을 알 수 있을까요??

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2018.09.21 02:10 신고  Address  Edit/Delete

      다른분도 역회전이 안된다고 문의주셨는데 제가 아두이노를 세팅할수 있는 상황이 아니라서 확인이 힘들듯 합니다.

댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바