스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

리니어 모터에 리미트 스위치를 연결해서 왕복운동을 하고있는걸 만들었습니다.

여기서 리미트 스위치에 횟수 제한을 걸어서 일정 횟수를 초과하면 모터가 정지하게끔 만들려고 하는데

여기서 뭐를 더 해야될지 문의드립니다.

#include 



#define DIR_PIN 8 //스텝모터드라이버 DIR 연결핀
#define CLK_PIN 9 //스텝모터드라이버 CLK 연결핀

#define LLIMIT_PIN 3
#define RLIMIT_PIN 2


HCMotor HCMotor;

int Speed = 10;

void setup() 
{
  
  HCMotor.Init();

  
  HCMotor.attach(0, STEPPER, CLK_PIN, DIR_PIN);

  
  HCMotor.Steps(0,CONTINUOUS);
  
  HCMotor.DutyCycle(0, Speed);
  
  pinMode(LLIMIT_PIN, INPUT); 
  pinMode(RLIMIT_PIN, INPUT); 

  
}

void loop() 
{
  
  if (digitalRead(LLIMIT_PIN) == LOW)
    HCMotor.Direction(0, FORWARD);
  else if (digitalRead(RLIMIT_PIN) == LOW)
    HCMotor.Direction(0, REVERSE);
  
}
아두이노, 리니어레일, 리니어슬라이드, 리니어엑추에이터, 스텝모터, TB6560, arduino, linear slider, linear rail, stepper motor, 싸이피아, SCIPIA 0 Comments

아두이노를 사용하여 리니어 이송레일을 구동하는 실험을 합니다. 400mm 리니어 이송 레일 슬라이더이며, T8(8mm) 2mm피치(한바퀴에 2mm이동)의 리드스크류와 NEMA17 4248 스텝모터가 사용되었습니다.
이송속도는 초당 0~20mm이며 오차는 약 0.5mm입니다. 횡축 부하는 최대 15Kg입니다.
스텝모터는 DC12V(3A) 또는 24V(1.5A) 전원으로 TB6560 스텝모터드라이버를 통해 구동합니다.

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

 

1. 가변저항을 사용한 정역구동 실험

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

10K가변저항을 사용하여 정역제어 및 속도제어를 하며 아두이노 보드의 A0핀을 통해 아날로그 값을 입력 받습니다.

아래는 실제 구동모습입니다.

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

- 결선 방법

1. 스텝모터 케이블을 스텝모터드라이브보드에 연결한 후 조여줍니다.

스텝모터는 총 4개의 선을 가지고 있으며 각각 A+ A- B+ B- 상을 나타냅니다.

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

2. DC 전원 케이블을 스텝모터드라이브보드에 연결한 후 조여줍니다. 

모터를 구동하기 위한 전원이 필요하며 여기서는 DC12V 5A 전원아답터를 사용합니다. 아답터와 연결을 위한 DC잭 연결케이블을 모터드라이버에 +/- 극성에 맞에 연결합니다.

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

3. 아두이노 보드와 스텝모터드라이브보드를 결선해줍니다.

아두이노 보드로 스텝모터를 제어할 수 있도록 합니다. 아두이노 보드에서 GND와 디지털IO 8번, 9번을 사용하게 됩니다.

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

4. 가변저항과 아두이노보드를 결선합니다.

가변저항의 VCC와 GND(1번과 3번핀)는 아두이노 보드의 5V와 GND로 연결하고 2번핀은 A0로 연결합니다.

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

스텝모터 리미트 스위치 - seutebmoteo limiteu seuwichi

 

 

 

라이브러리는 아래 링크에서 다운로드하고 아두이노 프로그램 메뉴에서 스케치->라이브러리 포함하기->.ZIP 라이브러리 추가를 누르고, 파일선택창이 나오면 다운받은 라이브러리 파일을 선택하시면 됩니다.


수동으로 정지시키기

리미트스위치가 닫혔을 때 stop() 함수를 이용하면 수동으로 스텝모터의 동작을 정지시킬 수 있습니다. 이 때 리미트스위치의 입력 여부는 getEio() 함수를 이용합니다.

예제

#include 
#include 

byte spcId = 1;

ExpansionStepper step(spcId);

int state;

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

    Phpoc.begin(PF_LOG_SPI | PF_LOG_NET);
    Expansion.begin();

    Serial.println(step.getPID());
    Serial.println(step.getName());

    step.setMode(4);
    step.setVrefStop(2);
    step.setVrefDrive(8);
    step.setSpeed(400);
    step.setAccel(1000);

    step.stepGoto(40000);
}

void loop() {
    state = step.getEio(0);

    if(state == 0)
        step.stop();

    delay(1);
}


// MCU BASIC: https://www.basic4mcu.com

// DateTime : 2018-06-29 오전 1:05:52

int SW_L=2,M_L=4,LED_L=6;

int SW_R=3,M_R=5,LED_R=7;

  pinMode(SW_L,INPUT_PULLUP); pinMode(M_L,OUTPUT); pinMode(LED_L,OUTPUT);

  pinMode(SW_R,INPUT_PULLUP); pinMode(M_R,OUTPUT); pinMode(LED_R,OUTPUT);

  digitalWrite(M_L,0); digitalWrite(M_R,1); // motor right

  digitalWrite(M_L,0); digitalWrite(M_R,0); // motor stop

  digitalWrite(M_L,1); digitalWrite(M_R,0); // motor left

  digitalWrite(M_L,0); digitalWrite(M_R,0); // motor stop

연결하기 전에 충분히 실험하세요

정역구동을 해봤다니 이 실험을 할 필요가 없을 수도 있지만

중간에 놓고서 1초씩만 좌우로 구동 해봅니다.

방향이 반대로 움직이면 모터선을 바꿔주세요

이번에는 스위치를 체크 해보죠

// MCU BASIC: https://www.basic4mcu.com

// DateTime : 2018-06-29 오전 1:08:21

int SW_L=2,M_L=4,LED_L=6;

int SW_R=3,M_R=5,LED_R=7;

  pinMode(SW_L,INPUT_PULLUP); pinMode(M_L,OUTPUT); pinMode(LED_L,OUTPUT);

  pinMode(SW_R,INPUT_PULLUP); pinMode(M_R,OUTPUT); pinMode(LED_R,OUTPUT);

  if(!digitalRead(SW_L))digitalWrite(LED_L,1); else digitalWrite(LED_L,0);

  if(!digitalRead(SW_R))digitalWrite(LED_R,1); else digitalWrite(LED_R,0);

왼쪽 스위치를 누르면 왼쪽 LED가 켜지는지 체크하세요

아두이노핀----스위치----GND

이렇게 연결하면 됩니다.

// MCU BASIC: https://www.basic4mcu.com

// DateTime : 2018-06-29 오전 1:11:12

int SW_L=2,M_L=4,LED_L=6;

int SW_R=3,M_R=5,LED_R=7;

  pinMode(SW_L,INPUT_PULLUP); pinMode(M_L,OUTPUT); pinMode(LED_L,OUTPUT);

  pinMode(SW_R,INPUT_PULLUP); pinMode(M_R,OUTPUT); pinMode(LED_R,OUTPUT);

  digitalWrite(M_L,0); digitalWrite(M_R,1); // motor right

  while(digitalRead(SW_R));                 // R 스위치를 만날 때까지 계속

  digitalWrite(M_L,0); digitalWrite(M_R,0); // motor stop

  digitalWrite(M_L,1); digitalWrite(M_R,0); // motor left

  while(digitalRead(SW_L));                 // L 스위치를 만날 때까지 계속

  digitalWrite(M_L,0); digitalWrite(M_R,0); // motor stop

모터 정지 명령을 내린 후에 반대로 제어해야지 회로 데미지가 덜합니다.

정지시간이 길면 딜레이 시간을 줄이고

정지 시간이 짧으면 딜레이 시간을 늘이세요

정지를 준다고 바로 그자리에 멈추지 않고 조금 더 굴러가다가 멈추게 됩니다.

자동차 브레이크 밀리는 것과 같습니다.(관성)

따라서 리미트 스위치는 밀리는 것을 고려해서 조금 앞쪽에 설치하세요

추가문의는 https://www.basic4mcu.com