리니어 이송레일 엑추에이터 구동실험

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

 

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

 

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

 

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

라이브러리

소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다.

// 가변저항을 이용한 리니어 이송레일 정역제어

/* 라이브러리 include */
#include <HCMotor.h>

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

/* 가변저항 연결핀 */
#define POT_PIN A0

/* 스텝모터 구동 중간지점(데드존 영역) */
#define DEADZONE 20 

/* 아날로그 입력값 0~1024 값으로 정역영역지정 */
#define POT_REV_MIN 0
#define POT_REV_MAX (512 - DEADZONE)
#define POT_FWD_MIN (512 + DEADZONE)
#define POT_FWD_MAX 1024

/* HCMotor 라이브러리 인스턴스 생성 */
HCMotor HCMotor;

void setup() 
{

  /* 라이브러리 초기화 */
  HCMotor.Init();

  /* 모터0을 스텝모터로 설정하고 연결된 핀을 지정 */
  HCMotor.attach(0, STEPPER, CLK_PIN, DIR_PIN);

  /* 모터를 연속동작모드로 설정*/
  HCMotor.Steps(0,CONTINUOUS);
}


void loop() 
{
  int Speed, Pot;

  /* 가변저항으로 부터 아날로그 값을 입력받음 */ 
  Pot = analogRead(POT_PIN);

  /* 역방향? */
  if (Pot >= POT_REV_MIN && Pot <= POT_REV_MAX)
  {
    HCMotor.Direction(0, REVERSE);
    Speed = map(Pot, POT_REV_MIN, POT_REV_MAX, 10, 1024);

  /* 정방향? */
  }else if (Pot >= POT_FWD_MIN && Pot <= POT_FWD_MAX)
  {
    HCMotor.Direction(0, FORWARD);
    Speed = map(Pot, POT_FWD_MIN, POT_FWD_MAX, 1024, 10);

  /* 데드존(중간지점)? */
  }else
  {
    Speed = 0;
  }

  /* 속도설정 */
  HCMotor.DutyCycle(0, Speed);

}

 

2. 리미트스위치를 이용한 왕복구동 실험

 

 

 

 

 

소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다.

// 리미트스위치를 사용한 왕복구동 실험

/* 라이브러리 include */
#include <HCMotor.h>


/* 모터드라이버 연결핀 */
#define DIR_PIN 8 //스텝모터드라이버 DIR 연결핀
#define CLK_PIN 9 //스텝모터드라이버 CLK 연결핀
/* 리미트스위치 연결핀 */
#define LLIMIT_PIN 3
#define RLIMIT_PIN 2

/* HCMotor 라이브러리 인스턴스 생성 */
HCMotor HCMotor;

int Speed = 10;

void setup() 
{
  /* 라이브러리 초기화 */
  HCMotor.Init();

  /* 모터0을 스텝모터로 설정하고 연결된 핀을 지정 */
  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);
  
}