Hermit Under the Cliff

[Arduino] 아두이노 코딩봇 만들기 (14) - 서보모터를 이용해 회전하는 머리 달아주기 본문

Personal Projects/아두이노 코딩봇

[Arduino] 아두이노 코딩봇 만들기 (14) - 서보모터를 이용해 회전하는 머리 달아주기

AnonymousDeveloper 2022. 3. 21. 15:44

이제 간단하게 달아줄 수 있는 모듈들은 거의 다 달아준 것 같습니다만

실제 로봇 처럼 머리를 움직여 주면 따님이 더 좋아할 것 같습니다.

로봇의 머리에다가 초음파 센서를 옮겨 달아서 고개를 좌우로 돌리면서

좌우의 거리를 측정할 수 있도록 만들어 줄까 합니다.

 

머리를 움직여 주기 위해서는 모터가 필요합니다.

아두이노 스타터킷에 들어있는 모터 중 SG90이라는 서보모터를 사용해 봅니다.

서보 모터는 0~180도 까지의 지정된 각도로 모터의 움직임을 제어해 줄 수 있습니다.

사용되는 선은 세개로 Vcc, GND와 Signal 선입니다.

각각 5V, GND와 9번 핀에 연결을 해 준 뒤 간단하게 동작확인을 해 줍니다.

 

#include "Servo.h"

Servo microServo;
int servo = 9;

void setup() {
  microServo.attach(servo);
}

void loop(){
  microServo.write(30);
  delay(500);
  microServo.write(50);
  delay(500);
  microServo.write(70);
  delay(500);
  microServo.write(90);
  delay(500);
  microServo.write(110);
  delay(500);
  microServo.write(130);
  delay(500);
  microServo.write(150);
  delay(500);
}

위 간단한 예제와 같이 Servo.h 라이브러리를 추가해 주면

write 함수를 통해 각도를 써 주는 것만으로도 모터의 방향을 설정해 줄 수 있습니다.

위 코드를 올려서 동작을 확인해 보면

전원이 들어오면 90도의 각도로 캘리브레이션이 되는 걸 확인할 수 있고 

로봇의 머리에 알맞는 각도를 체크해 볼 수 있습니다.

 

서보모터와 로봇의 머리를 고정해주기 위해서 여러 방법을 고민해보다가

아래와 같이 글루건을 이용하여 대부분의 작업을 해버렸습니다.

(만들어서 팔 물건이 아니니 대충 대충 합니다.)

 

아래 모터랑 글루건으로 붙여버린 초록색 리벳이 돌아갈때 머리 모듈 전체가 돌아가기 위해 작은 플라스틱으로 지지대를 덧대어 줍니다.
모터가 돌아갈때 몸체가 같이 돌아가는 것을 방지해주기 위해 길죽한 블록으로 모터의 옆면을 고정해 줍니다.
머리에는 초음파센서를 부착해 줍니다.

이렇게 하드웨어 작업이 완료가 되었으면 나머지 코드들을 알맞게 작성해 줍니다.

업로드 모드를 위한 Control Protocol은 아래와 같이

Servo와 Head 두 가지를 추가해 주었습니다.

Servo 명령어는 각도를 받아 회전을 시키는 것이고

Head 명령어는 지정된 각도로 왼쪽,오른쪽,중간 부분을 바라보게 하는 명령입니다.

 

/* Control protocol
@[Target(1)][Length(2)][Data]#
    Servo :
      Angle (Example @S0290# : Set servo angle to 90 dgree)
    Head :
      SR[Angle] : Set right angle to [Angle]
      SL[Angle] : Set left angle to [Angle]
      SC[Angle] : Set center angle to [Angle]
      TR : Turn head to right
      TL : Turn head to left
      TC : Trun head to center
*/

이 동작을 위한 코드는 아래와 같이 작성하였습니다.

int rightAngle = 30;
int leftAngle = 150;
int centerAngle = 90;

switch(target){
  case 'S': // Servo control
    microServo.write(data.toInt());
    break;
  case 'H': // Head control with servo
    if (data.equals("TR"))
    {
      microServo.write(rightAngle);
    }
    else if (data.equals("TL"))
    {
      microServo.write(leftAngle);
    }
    else if (data.equals("TC"))
    {
      microServo.write(centerAngle);
    }
    else
    {
      String setCommand = data.substring(0,2);
      int targetValue = data.substring(2).toInt();

      if(setCommand.equals("SR"))
      {
        rightAngle = targetValue;
      }
      else if(setCommand.equals("SL"))
      {
        leftAngle = targetValue;
      }
      else if(setCommand.equals("SC"))
      {
        centerAngle = targetValue;
      }
    }
    break;
 }

이제 시리얼 명령을 이용해서 머리의 각도를 조절할 수 있게 되었으니

블록들도 아래와 같이 만들어 줍니다.

 

위의 두개의 블록은 H 명령어셋을 사용하여 왼쪽, 오른쪽, 정면을 바라볼 수 있게 하거나

각 방향의 각도를 변경할 수 있도록 하였습니다.

마지막 블록은 S 명령어셋을 사용하여 직접 서보모터의 각도를 설정할 수 있습니다.

 

(args, app, device, block) => {
    // JavaScript code
    var dir;
    if (block.arguments.direction == 'right') {
        dir = "SR";
    }
    else if (block.arguments.direction == 'left') {
        dir = "SL";
    }
    else {
        dir = "SC";
    }
    var length = block.arguments.angle.length + 2;
    var strLength = String(length);
    var command = "@H" + strLength.padStart(2, '0') + dir + block.arguments.angle + "#";

    device.writeText(command);
}

머리의 방향에 따른 각도를 설정하는 라이브 모드의 코드를 예로 보시면

위와 같이 direction argument에 따라서 명령어를 정의하고 (SR,SL,SC)

이를 전달받은 각도와 함께 명령어로 만들어 전달하고 있습니다.

또한 이 블록의 목적이 모터의 영점이 틀어졌을때 조정을 하려고 만든 것이기 때문에

업로드 모드의 코드에서는 code: 부분이 아닌 setup: 부분에 아래의 코드를 추가하였습니다.

/*{{this.direction}}*/Angle = /*{{this.angle}}*/;

 

나머지 블록들도 비슷한 형식으로 작성을 해 주시면 됩니다.

자세한 코드는 깃허브에 올라가 있는 extension 파일을 참고하시면 되겠습니다.

 

이제 처음에 목표했던 모든 기능을 로봇에 장착을 해 주는 것 까지는 하였는데

이상하게도 8x8 dot matrix와 서보모터를 함께 동작을 시켜주면

뭔가 제가 원하는대로 동작을 하지 않습니다.

dot matrix에는 이상한 그림이 나올 때도 있고

서보모터는 계속 마음대로 막 돌아가고 이상합니다.

 

아두이노에 연결해 놓은 모듈들의 전원선을 아두이노 5v 핀에 묶어서 연결을 해놓아서

전류가 부족한게 아닌가 생각이 됩니다.

찾아보니 5v output의 최대전류는 20mA로 권장하고 있네요.

이 문제를 해결하기 위해서 다음 포스트에서는

제가 설계한 하드웨어 구성을 알아보도록 하겠습니다.

 

역시나 모든 코드들은 깃허브에서 확인 가능합니다.

https://github.com/reitn/OlbinBot

 

GitHub - reitn/OlbinBot: Olbin Coding bot based on Arduino and Mblock

Olbin Coding bot based on Arduino and Mblock. Contribute to reitn/OlbinBot development by creating an account on GitHub.

github.com

 

 

Comments