오디세이로 BLDC모터 및 액추에이터 제어하기

안녕하세요 대짜이찐입니다.

이전에 아두이노로 BLDC모터를 컨트롤 했었습니다.


이번에는 모터를 액추에이터에 연결하여,

아두이노 기능이 내장되어있는 오디세이 보드로 제어해보려합니다.



오디세이는 일반 PC에 아두이노 + 라즈베리파이가 결합된 제품이라고 보시면 됩니다.
따라서 PC처럼 구동시키기 위해 간단하게나마 필요한 제품들이 있습니다.
외부모니터 + HDMI 케이블 그리고 키보드와 마우스 입니다.



오디세이 제품의 I/O핀맵입니다. 위쪽은 아두이노의 핀맵이고,
아래는 라즈베리파이의 핀맵입니다.
사용한 모터 드라이버는 SMP36D200S 제품으로 BLDC모터 드라이버입니다.
이 제품의 통신은 Rs-232타입이기 때문에 이전에 아두이노에 연결했던것과 마찬가지로
Rs-232 to TTL 컨버터를 사용했습니다.


모터 드라이버의 간단한 구성도 입니다.
전원부쪽은 배터리 파워서플라이, SMPS등으로 전원을 공급하고,
BLDC모터로 연결합니다.
가장 잘 호환되는 제품은 같은 브랜드에서 판매되는 모터입니다.

PC 및 임베디드 보드쪽은 Rs-232통신을 통해 데이터를 주고 받습니다.
오디세이에 있는 아두이노 기능으로 통신하기 위해 
Rs-232 to TTL 컨버터를 사용합니다.

실제 산업현장에서 쓰이듯 산업용 스위치와 비상 스위치도 연결하여,

간단하게 구성해봤습니다.


실제 연결 사진이며, 모터드라이버의 전원은 파워서플라이로 인가해줬습니다.



모터드라이버에 연결되는 모터와 액추에이터 사진입니다.

모터의 회전운동을 직선운동으로 변환하여 사용 할 수 있습니다.
예를 들어 3개의 액추에이터를 조합하면 인형뽑기같은 직교로봇을 제작할 수도 있습니다.

int em_sw = 2;

int motion_sw=4;

int right_sw=6;

int left_sw=8;

 

int flag;

 

int common_GND1= 3;

int common_GND2= 5;

int common_GND3= 7;

int common_GND4= 9;

 

 void setup() 

 {

   Serial.begin(19200);

   Serial1.begin(19200);

 

   pinMode(em_sw, INPUT_PULLUP);

   pinMode(motion_sw, INPUT_PULLUP);

   pinMode(right_sw, INPUT_PULLUP);

   pinMode(left_sw, INPUT_PULLUP);

 

   pinMode(common_GND1, OUTPUT);

   pinMode(common_GND2, OUTPUT);

   pinMode(common_GND3, OUTPUT);

   pinMode(common_GND4, OUTPUT);

   

   digitalWrite(common_GND1, LOW); // 평상시 GND

   digitalWrite(common_GND2, LOW);

   digitalWrite(common_GND3, LOW);

   digitalWrite(common_GND4, LOW);

 

   attachInterrupt(2, swInterrupt, LOW);

 

   Serial.println("통신 시작");

 }

 

 void loop() 

 {  

    Serial1.println("control=1"); // enable

    Serial1.println("target_velocity=0"); // velocity=0

    flag=0;

    

    if(digitalRead(right_sw) == 0)

    right_move();

    

    if(digitalRead(left_sw) == 0)

    left_move();

 

    if(digitalRead(right_sw) == 0 && digitalRead(left_sw) == 0

    set_home();

 

    if(digitalRead(motion_sw) == 0)

    motion_move();

 }

 

 

 void swInterrupt() 

 {

   flag=1;

   Serial1.println("control=0"); // disable

   Serial.println("인터럽트");

 }

/*------------------------------------------------------------*/

 void right_move() // setting velocity=150

 {

  Serial1.println("target_velocity=150"); 

  Serial.println("Right");

 }

 /*------------------------------------------------------------*/

  void left_move() // setting velocity=-150

 {

  Serial1.println("target_velocity=-150"); 

  Serial.println("Left");

 }

/*------------------------------------------------------------*/

  void set_home() // current position is home

 {

  Serial1.println("homing_method=0"); 

  Serial.println("홈 설정");

 }

/*------------------------------------------------------------*/

  void motion_move() 

 {

  int repeat=0;

  Serial.println("반복동작 시작");

  while(repeat<10)

  { 

    if(flag == 1)

    {

      break;

    }

    

    Serial1.println("target_position=-0");

    delay(500);

    Serial1.println("target_position=0");

    delay(500);

    Serial.print("반복동작: ");

    Serial.print(repeat+1);

    Serial.println("번");

 

    repeat++;

    

  }

 Serial.println("반복동작 끝");

 

 }

 

Colored by Color Scripter

cs



소스에서 common_GND로 잡은 3,5,7,9핀은 
항상 LOW출력을 함으로써 그라운드 역할을 해주는 핀들입니다.
따로 브레드보드를 사용하지 않고 오디세이 I/O핀으로만 사용해서 
스위치에 내부 풀업저항을 사용하기 위해서 존재합니다.


변수 flag의 경우 모션에서 동작할 때, 인터럽트가 걸리고 인터럽트가 끝나도
모션이 동작하지 않게 하기 위해 인터럽트 플래그 역할을 합니다.


모션 동작 함수에서 target_position=-0, target_position=0 부분은
사용하시는 액추에이터의 최소값 최대값을 넣어주시면 됩니다.
저는 반복동작을 10번만 동작하게 설정했습니다. 


현재 위치를 홈으로 잡고 포지션 0으로 설정하는
오브젝트가 현재 제대로 동작하지 않습니다.
추후에 업데이트로 수정할 예정이라고 합니다.
따라서 set_home()함수는 제대로 동작하지 않습니다. 


비상 스위치(Emergency switch)의 경우 우선 동작해야 하기 때문에,
인터럽트를 사용해서 동작시켰습니다. 이때 주의해야하는 점은
오디세이에서 아두이노는 아두이노 zero를 기반으로 하기 때문에
아두이노 우노와 다르게 인터럽트 번호가 핀번호와 같아야 합니다. 
또한 디지털핀4번은 인터럽트로 사용할 수없습니다.


통신의 경우 오디세이에서 소프트웨어 시리얼 예제를 돌렸을때 
위 이미지처럼 Rx와 Tx가 동작하는 보오드레이트[bps] 속도가 따로 있습니다.
Rx와 Tx가 둘다 정상적으로 동작하는 속도중 제일 빠른것이 
19200보오드레이트[bps]이기 때문에 해당 속도를 사용했습니다.


모션 동작 버튼을 눌렀을 때 좌우로 반복 동작하는 gif입니다.
추후 유튜브 영상 첨부하겠습니다.


본 포스팅에 사용된 제품은 모두 디바이스마트에서 구입하실 수 있습니다.

오디세이(윈도우 포함) - https://www.devicemart.co.kr/goods/view?no=12527976
감사합니다.

댓글 쓰기

0 댓글