[아두이노] 로봇 팔 관절 제어

IOT/아두이노|2019. 9. 4. 09:00

[아두이노] 로봇 팔 관절 제어



오늘은 마지막 시간으로 인터넷 로봇팔 키트로 판매하는 제품들의 일반적 특징들을 기반으로 해서 가상시뮬레이터에서 간단히 실험 해보는 시간을 갖도록 하겠습니다.

1. 로봇 팔


시중에 판매되는 로봇 팔 키트의 구조가 아래와 같은 형태로 디자인 되어 있더군요. 편의 상 원은 Servo Motor이고 회전되는 부위라고 가정한 디자인 입니다. 실제로는 좀 다르겠지요.


  • A 지점 : Servo Motor가 수평방향으로 회전하여 로봇팔의 몸통을 회전시키게 됩니다.
  • B, C지점 : Servo Motor가 수직방향으로 회전하여 로봇팔의 움직임을 만들어 냅니다.
  • D 지점 : Servo Motor가 집게를 제어합니다.

총 4개의 Servo Motor로 로봇팔 모양을 간단히 로봇팔 모형을 만들어 키트로 판매하더군요. 이걸 한번 가상시뮬레이터에서 실험해 보면 재밌을 것 같아서 실험을 하였습니다.

만약, 로봇 손이였다면 손가락 관절을 전부 다 제어해야 하기 때문에 너무 노가다 디자인을 해야 하기 때문에 간단한 집게 로봇팔을 실험 대상으로 했네요.

2. 로봇 팔


  • 준비물 : 가변 저항 4개, Servo Motor 4개, 아두이노우노, 외부전원
  • 내용 : 디지털Pin 4개를 Servo Motor 핀에 연결하고 가변저항도 A0~A3에 연결하시오


위 그림을 보면 지난시간에 6족 보행로봇 다리를 제어하는 실험을 가상시뮬레이터에서 했던 회로도와 같습니다. 관절 제어이기 때문에 회전만 제어하는 실험이라서 회로도는 같습니다. 같은 회로도이지만 어떻게 디자인 하느냐에 따라서 달라질 뿐이죠.

참고로 가변저항은 로봇팔을 제어하는 조종기가 됩니다. 몸통 회전 A와 로봇팔 움직임 B, C와 집게 D 제어로 총 4개의 제어값을 만들어야 합니다. 그래서 4개의 가변저항을 통해 조정하게 됩니다.

만약, 조이스틱으로 한다면 조이스틱은 X,Y 값을 만들어 내는데 4개의 제어값이 필요하니깐 조이스틱을 2개 연결하면 조정이 가능 합니다. 그리고 Bluetooth를 연결한다면 무선으로 스마트폰에서 조정이 가능합니다.

가상시뮬레이터에서는 가변 저항으로 조정했지만 실제로 제작해서 한다면 조이스틱이나 스마트폰으로 무선 조정을 하면 재미있겠죠.

3. 코딩


지난 시간의 6족 보행 로봇을 제어 하려면 보행 로봇의 움직임 패턴을 만들어야 하지만 로봇 팔은 그럴 필요가 없습니다. 집게 로봇 팔은 가변저항으로 간단히 제어가 가능하기 때문에 가변저항을 읽는 부분만 코딩하시면 됩니다.

가변저항 읽기 : analogRead()함수로 간단히 가변저항 값을 읽을 수 있습니다.

Servo Motor는 0~180도 회전을 할 수 있기 때문에 아날로그 읽기 0~1023값을 map()함수로 0~180으로 변환 시키야 합니다. 아래와 같이 가변저항값을 읽으면 됩니다.

int angle1 = map(analogRead(A0),0,1023,0,180);

A 모통 회전 : Servo Motor를 가변저항 값으로 회전 시키면 됩니다.

servo[0].write(angle1);

끝! 엄청 간단하죠.

종합해보면,

#include <Servo.h>

Servo servo[4];
const byte servoPin[4] = {2,3,4,5};

void setup()
{ 
  for(int i=0;i<4;i++){
    servo[i].attach(servoPin[i]);  
    servo[i].write(90);
    
  }
  delay(1000);
}

void loop()
{
  int angle1 = map(analogRead(A0),0,1023,0,180);
  int angle2 = map(analogRead(A1),0,1023,0,180);
  int angle3 = map(analogRead(A2),0,1023,0,180);
  int angle4 = map(analogRead(A3),0,1023,0,180);
  
  servo[0].write(angle1);
  servo[1].write(angle2);
  servo[2].write(angle3);
  servo[3].write(angle4);
  delay(100);  
}

위 코딩에서 중복되는 4번의 코딩 라인을 for문으로 처리하면 코딩 라인을 최소화 할 수 있습니다. 그 부분은 여러분들이 직접 수정해 보세요.

4. 결과


사실 집게 로봇팔에 대한 가상시뮬레이터 결과를 이해하기 위해서는 실제 모형을 보고 이해해야 하는데 단순히 Servo Motor회전으로 연상이 안될 수 있습니다. 아두이노 부품 판매 사이트에 가셔서 로봇팔 제품을 보시고 그래도 이해가 안되신다면 그 제품에 대한 영상물을 Youtube로 찾아 보시면 아마 있을꺼에요. 보고 움직임을 이해하시고 머리속에서 집게 로봇팔을 좌표계에 배치하고 움직이는 이미지와 가상시뮬레이터의 Servo Motor 회전을 같이 연결하여 상상하면서 보시기 바랍니다.


마무리


오늘 post 내용은 예전에 Servo Motor 제어편에서 간단히 가변저항을 이용하여 회전 시킨 회로도 입니다. 복습 post이지만 관절에서 빠질 수 없는 내용이기에 글을 쓰게 되었네요. 한개의 Servo Motor를 4개로 늘어 났을 뿐이고 코딩도 동일합니다. 재밌는 것은 Servo Motor를 가변저항으로 조정했던 원리가 오늘 로봇팔 제어가 되었다는 것이죠.

간단한 원리도 생각하는 관점에 따라 이렇게 재밌는 표현을 할 수 있습니다. 평소 사소한 원리일지라도 잘 정리 해놓으면 이렇게 상상력을 더해 재밌는 실험을 할 수 있습니다.

댓글()

[아두이노] 관절과 좌표계

IOT/아두이노|2019. 9. 3. 09:00

[아두이노] 관절과 좌표계



로봇팔이나 6족 보행로봇 같은 관절형 로봇은 Servo Motor나 Stepper Motor의 회전 각을 통해 관절의 움직임을 만들어 내게 됩니다. 처음 공부하시는 분들은 로봇팔이 Servo Motor의 회전각을 통해 어떻게 관절의 움직임을 만들어내는지 잘 연상이 안될 수 있습니다. 공감지각능력이 뛰어난 분들이나 관철력이 뛰어난 분들이라면 쉽게 이해할 수 있지만 약간 관절의 움직임에 대해 모르더라도 어려워 하지 마세요.

관절의 움직임을 이해하는데 좌표계를 머리속에 담아 놓으시면 쉽게 관절의 움직임을 이해 할 수 있습니다. 어떤 사물의 움직임을 표현한다면 그 움직임은 모두 좌표계에 배치되고 그 좌표계를 기준으로 회전한다고 머리속에 그려놓고 이해하시면 쉽게 이해 할 수 있습니다.

1. 관절



위 그림처럼 관절의 역활을 Servo Motor가 역할을 수행합니다. Servo Motor가 회전을 하게 되면 어떻게 될까요. 긴 막대기가 Servo Motor와 위치한 방향에서 그냥 원을 그리면 회전을 하게 됩니다. 이 회전이 관절형 로봇의 움직임을 만들어 낸다는 것이 잘 연상이 안되실거에요.

지난 시간에 6족 보행로봇에 대해 관찰 post를 썼는데 그때 다리 하나의 관절 제어를 다시 복습해 볼까요.


위 그림에서 각 관절 A, B, C를 방금 위에 Servo Motor와 합쳐진 원통막대 하나를 3개로 서로 연결되었을 때 다리 하나의 움직임을 만들어 냈습니다. 그림을 보면 A관절은 변화가 없고 B, C관절이 일정 각도로 위로 회전되었을 때 3관절의 다리가 그림처럼 움직임을 만들어 냈습니다.

다른 그림을 살펴볼까요.


손을 주먹형태로 쥐었을 때 손가락 하나의 움직임을 위 그림과 같은 모향을 만들어 냅니다. 주먹을 쥔 모양이니 위 그림에서 관절이 3개로 나뉘고 90도씩 회전했을 때 주먹이 쥐어지는 모습이 만들어 냅니다.

위 두 그림에서 관찰이 뛰어나신 분이라면 움직임을 이해 하셨을 꺼에요. Servo Motor의 회전과 위 그림에서의 원통막대기가 그 회전각만큼 움직였을 때 만들어내는 움직임을 머리속에서 그려 낼 수 있으면 관절 동작을 이해 할 수 있습니다.

혹시 이해가 안되신다면 이글을 보시는 여러분들이 직접 자신의 손을 주먹형태로 쥐어 보시고 관절이 Servo Motor라고 생각하시고 회전각도를 살펴보시기 바랍니다. 이해가 안될때는 실제 현실에서 그 움직임을 만들어 관찰하시면 됩니다.

그런데 복잡한 움직임을 만들기 위해 각 관절을 회전시킨다면 각 관절의 회전각을 쉽게 머리속에서 연상하기 어렵습니다. 즉, 손을 웨이브를 타는 동작으로 움직여 보세요. 아니면 직접 춤을 제자리에서 춰보세요. 그 때 손, 팔, 몸통, 다리 등 등의 각 관절에 기하학적인 움직임으로 춤을 출 때 각 춤의 동작에서 관절의 회전각을 머리속에 그리려고 할 때 쉽게 연상이 되 않습니다. 어떻게 하면 관절의 움직을 머리속에서 그려낼 수 있을까요. 바로 관절을 좌표계를 기준으로 관절의 움직임을 이해하시면 좀 더 쉽게 머리속에서 연상하실 수 있습니다. 그 방법에 대해 설명하겠습니다.

2. 좌표계


제가 처음 좌표계를 접했을 때가 컴퓨터그래픽스 과목을 배울 때였습니다. 그 때 OpenGl로 교수님이 컴퓨터라는 가상공간에 점을 찍고 선을 그리고 면을 만들고 3D 도형을 좌표계를 기준으로 그리는 방법을 배웠는데 이때부터 좌표계를 머리속에 담아두게 되었습니다. 의자를 컴퓨터 그래픽스로 표현할 때 현실에서의 의자를 좌표계를 기준으로 머리속에 현실 의자를 배치 할 수 있게 되니깐 의자의 모양을 좌표계 기준으로 그릴 수 있게 되었고 그 좌표계 기준으로 그려지 모양을 이동/회전을 통해 움직임을 만들어 낼 수 있게 되었습니다. 그 때 로봇손을 컴퓨터그래픽스로 그리게 되었고 호기심으로 로봇 손가락을 각 마디를 좌표계를 기준으로 그리게 되었는데 그 좌표계를 회전 시키니 그 좌표계을 기준으로 그려진 손가락 마디가 회전되는 것을 우연히 알게 되었습니다. 첨에는 잘 몰랐는데 그게 관절 제어를 한 것이였죠. 사실 교수님께서 가르쳐준것은 그냥 좌표계이 물체를 그리는 작업과 물체를 이동시키는 방법에 대해서만 설명을 했는데 로봇손을 OpenGl로 표현하고 손가락의 각 마디를 회전시킴으로 주먹을 쥐었다 펴는 동작을 만들게 되었는데 그 걸 보시고 교수님이 칭찬을 해 주신 기억이 나네요. 대단한 것은 아니였지만 각 마디 마다 개별 좌표계로 손가닥 마디마다 회전을 시켰는데 그게 나중에 관절 제어였다는 것을 알게 되었습니다.

관절제어는 좌표계를 머리속에 그릴 수 있으면 쉽게 제어를 할 수 있습니다. 그 방법을 설명하기 전에 우선 좌표계에 물체를 그려 낼 수 있어야 합니다.


좌표계는 x,y,z 3축으로 구성되어 있습니다. 모든 사물을 이 좌표계에 올려놓을 수 있습니다. 사각형을 올려 놓아 볼까요.


위 그림의 Box를 좌표계에 그려 보세요. 머리속에서 길이가 1인 Box를 좌표계에 그릴 수 있게 된다면 좌표계가 여러분의 머리속에 들어 있게 됩니다.

Box를 그릴 수 있게 된다면 의자를 그려보세요.


단, 그릴 때 각 부위 별로 개별 좌표계로 그려보세요.


위 좌표계로 다리와 앉는 부위를 좌표게로 그리게 됩니다. 그리고 다리 부위는 OpenGl에서 복사해서 4개의 다리를 만드는데 각 다리는 개별 좌표계가 기준이 됩니다.

이 때 전체 좌표계를 기준으로 방금 만든 다리와 앉는 부위를 배치하면 아래와 같이 완성이 됩니다.


여기서 각 다리는 개별 좌표계(0,0,0)을 기준을 4개의 다리와 앉는 부위가 그려지고 전체 좌표계에서 방금 그림 부위를 배치하면 위와 같은 의자가 완성이 됩니다.

물체를 좌표계 기준으로 그리고 그 물체를 또 다른 좌표계를 기준으로 배치하여 의자와 같은 특정 물체를 만드는 방법을 좌표계를 기준으로 머리속에서 그려 보세요. 이게 어느정도 머리속에서 완성이 되면 관절 제어에 대해 알아 봅시다.

관절 제어를 좌표계 기준으로 회전


위 그림처럼 원통 막대가 하나가 있다고 가정하고 좌표계 기준으로 그려 봅시다. 이걸 x축을 기준으로 회전 시키면 어떻게 될까요.


이처럼 좌표계에서 x축 기준으로 회전을 하게 됩니다. 다른 축으로 회전을 시킨다면 현실에서 여러분 주변있는 펜같은 것을 가지고 각 축별 회전을 시켜 보세요. 좌표계를 기준으로 물체의 회전을 이해 하실 수 있습니다.

다음으로 넘어가겠습니다.

좌표계의 부모-자식 관계 회전


A관절 좌표계는 부모 좌표계이고 B관절 좌표계는 A의 자식 관계입니다. A좌표계를 기준으로 회전하면 B 관절은 같이 따라서 회전하게 됩니다. 다음 B관절 좌표계를 기준으로 보면 C관절은 B관절의 자식 관계입니다 B관절을 회전하게 되면 C관절은 따라서 같이 회전을 하게 됩니다. C관절 회전에 경우는 A, B관절을 회전하지 않습니다. 즉, 부모 좌표계가 회전하면 자식좌표계는 따라서 같이 회전을 하고 자식 좌표계가 회전하면 부모 좌표계는 회전하지 않습니다. 이 개념을 머리속에 담아 주세요.

이제 3개의 원통을 하나의 좌표계를 기준으로 배치해서 좌표계로 살펴 봅시다.


위 그림처럼 개별적인 3개의 좌표계를 가지고 있습니다. 하지만 각 좌표계는 부모-자식 관계로 좌표계의 영역에 묶여 있는데 각 좌표계의 회전을 할 때 다른 좌표계도 영향은 부모-자식 관계로 영향을 받습니다.

정리하면,

  • 왼쪽 A좌표계를 회전하면 B,C좌표계가 같이 회전한다.
  • 가운데 B좌표계가 회전하면 A좌표계는 현재 상태를 그냥 유지하고 C좌표계가 회전합니다.
  • 오른쪽 C좌표계가 회전하면 A, B좌표계는 현재 상태를 그냥 유지한다.

각 물체를 좌표계에 올려놓고 각 좌표계는 부모-자식관계로 정의해놓고 좌표계를 회전하면 각 물체의 움직임을 만들어 낼 수 있게 됩니다.

좌표계로 물체를 배치할 수도 회전시킬 수도 있습니다.

이런 좌표계를 머리속에 담아 놓으셔야 합니다. 현재 여러분이 이 글을 보고 있는 전자기기가 스마트폰이면 스마트폰을 좌표계에 올려놓고 회전시켜보세요. 좌표계 기준으로 움직이는 각도가 몇도인지 계산해 보세요. 이 각도값을 좌표계 기준으로 몇도인지 알게 된다면 아두이노 관절 로봇의 관절 제어 코딩이 쉬워집니다.

좌표계의 회전각을 코딩화

A관절을 x축으로 45도 회전시킨다면.

Servo.write(45);

여기서 B, C관절은 현재 각도에서 A관절이 45도 회전된 각도의 위치로 움직이게 됩니다. 이게 머리속 좌표계에서 그려져야 합니다.

그래야 관절제어를 쉽게 할 수 있습니다.

정리하면,

  • 좌표계 기준으로 마디를 배치하고 각 마디는 개별 좌표계를 갖는다.
  • 좌표계 기준으로 각 마디의 부모-자식관계 구조로 되어 있다.
  • 좌표계 기준으로 마디의 회전각도를 계산한다.
  • 좌표계는 관절이고 그 회전각은 실제 Servo Motor의 회전 값이 된다.

마무리


관절제어는 좌표계를 기준으로 회전 하고 각 관절은 개별적 좌표계를 가지고 각 좌표계는 부모-자식 관계의 구조로 좌표계가 묶여 있습니다. 좌표계를 관절로 생각해서 물체를 회전 시키면 물체의 움직임을 만들어 낼 수 있습니다. 그리고 좌표계를 기준으로 바라보면 쉽게 그 움직임을 수치화 할 수 있습니다. 좌표계를 기준으로 특정 축을 기준으로 회전 된 각도는 Servo Motor의 회전각이 되어 관절의 움직임을 만들어 내게 됩니다.

그래서 관절제어를 할 때 좌표계를 머리속에 담아놓고 관절 제어를 하면 여러가지의 움직임을 어렵지 않게 만들어 낼 수 있습니다. 지난 시간에 가상시뮬레이터에서 Servo Motor 세개를 나란히 배치하고 이게 6족 보행로봇의 다리이고 전진/후진 동작이라고 했는데 사실 잘 연상이 안되셨을 꺼에요. 만약 그 Servo Motor가 여러분의 머리 속 좌표계에 배치되어 진다면 가상시뮬레이터에서 단순히 일렬로 3개의 Servo Motor가 회전 되었지만 머리 속 좌표계에서 이 회전이 실제 6족 보행 로봇의 다리 움직임으로 그려지게 될 것입니다.

댓글()

[아두이노] 아두이노 관련 자료 관찰 후 원리 실험

IOT/아두이노|2019. 9. 2. 09:00

[아두이노] 아두이노 관련 자료 관찰 후 원리 실험



핀터레스트에서 6족 보행로봇에 관련 이미지들을 한번 검색 중 가장 맘에 드는 ICStation 팀의 Hexapod4 Spider Robot 작품 post안에 Youtube 영상만 보고 움직임을 관찰하고 제 나름대로 한번 재해석 하는 시간을 지난 시간에 가졌었습니다. 마지막에 원리에 대한 실험에 대해 간단히 언급만 하고 끝냈는데 뭔가 좀 아쉬워서 가상시뮬레이터에서 동작 회전 원리에 대해 간단히 테스트 해볼 수 있는 방법에 대해 설명을 할까 합니다. 아주 간단한 한 동작만 실험해 봤네요.


위 그림처럼 6족 보행로봇에서 다리 하나만 간단히 회전을 시켜 동작 원리를 이해하는 시간을 갖도록 하겠습니다.

1. 검색 후 찾은 6족 보행로봇의 다리 한부분




위 그림에서 관절을 어떻게 회전 시켜야지 전진과 후진을 만들 수 있을까요. 위 출처에 가셔서 Youtube 동영상을 보고 오세요. 이걸 제작한 팀이 만든 영상물이 있는데 보행 움직임을 관찰하기 좋은 예제입니다.

ICStation 팀의 Hexapod4 Spider Robot 작품의 동영상을 보고 동작 코딩을 상항하시면 됩니다.

1) 전진



지난시간의 이미지 입니다.


여기서, 각 관절을 어떻게 회전해야지 위 그림처럼 전진 동작을 할 수 있을까요.


  • 1단계 : 초기다리 상태
  • 2단계 : 다리 전진하기 전 B, C관절 45도 위로 회전(다리 들어올리는 동작)
  • 3단계 : A관절을 수평 45도 앞으로 회전(다리의 진행방향)
  • 4단계 : 다리가 전진 상태가 되었을 때 B, C 관절을 45도 아래로 회전(다리를 내리는 동작)
  • 5단계 : A관절을 수평 45도 뒤로 회전(다리가 지탱하기 때문에 몸체가 앞으로 전진하게 됨)

Youtube 속 6족 보행로봇의 다리 움직임을 보면 대충 전진 동작 패턴이 위의 과정으로 진행되는 것 같더군요.

2) 전진 코딩


사실 전진 패턴을 만들면 패턴 변수를 만들어서 담아 놓으면 그 패턴변수값으로 컨트롤 하면 됩니다. 하지만 여러 관절의 패턴 동작을 일일히 만드는 과정은 시간이 좀 걸리고 오늘은 동작 회전에 대한 부분만 간단히 설명하기 때문에 패턴변수를 만들지 않겠습니다. 사실 패턴변수를 만들면 각 동작에 대한 Servo모터의 회전 딜레이 값을 따로 패턴변수로 만들어야 하는데 이 딜레이값은 실제로 Servo모터를 회전시키면서 보정해야 하는 작업이라서 가상으로는 짐작 코딩뿐이 할 수 없기 때문에 복잡한 패턴변수를 만드는 작업은 생략하고 단순하게 전진 동작 패턴에 대해 각 단계 별 동작 명령을 단순하게 코딩으로 전개 할 예정입니다.

원리 코딩이니깐 감안하고 머리속에서 상상하시면서 보시기 바랍니다. 실제는 다르게 동작할 수 있고 이 post는 의미 전달 post입니다.


위 그림의 좌표계를 이해하셔야 합니다. 각 관절의 좌표계를 기준으로 회전값을 줄 예정입니다.

[초기화] 1단계 상태입니다.

  for(int i=0;i<3;i++){
    servo[i].attach(servoPin[i]);  
    servo[i].write(90);
    
  }
  delay(1000);

Servo모터가 전부 90도로 회전 되었을 때 1단계 다리 모양이 만들어 진다고 가정하겠습니다.

[전진]

  servo[1].write(135);  //B관절 다리 올리기
  servo[2].write(135);  //C관절 다리 올리기   
  delay(500);
  servo[0].write(45);  //A관절 전진
  delay(500);
  servo[1].write(90);  //B관절 다리 내리기    
  servo[2].write(90);  //C관절 다리 내리기
  delay(500);
    
  //마지막 몸체이동
  servo[0].write(90);  //A관절 몸체 이동
  delay(1000);

패턴변수로 만들어서 했다면 위 코딩이 좀 복잡하게 설명 되었을 꺼에요. 대충 동작 회전 의미는 이해하셨죠. 실제 이 코딩으로 6족 보행로봇을 정상적으로 움직일 수 없습니다. 다리 하나의 관절에 대한 원리의 의미 동작을 코딩화 실험한 것일 뿐입니다.

실제로 전진하기 위해서는


위 그림에서 1, 4번 다리가 동시에 앞으로 전진 한 후 다음 2,5번 전진하고 마지막으로 3,6번이 전진 한 후에 마지막 몸체이동을 시키면 6족 보행로봇이 전진 시켜야 됩니다.. 사실 위 코딩은 원리를 이해하기 위한 코딩일 뿐 실제로는 다른 결과를 얻을 수 있기 때문에 더이상 깊게 코딩하지 않겠습니다.

위 코딩이 전진이 된다면 후진은 어떻게 해야 할까요. 반대로 코딩하면 됩니다.

[후진]

  servo[1].write(135);     
  servo[2].write(135);     
  delay(500);
  servo[0].write(135);  
  delay(500);
  servo[1].write(90);     
  servo[2].write(90);  
  delay(500);
    
  //마지막 몸체이동
  servo[0].write(90);  
  delay(1000);

원리는 간단하죠.

그러면 좌/후 회전은 어떻게 할까요. 앞명 다리와 후면 다리를 기준으로 다리의 각도를 만들어서 움직여야 하는데 약간 전진/후진과는 좀 더 다리의 회전 컨트롤이 복잡하지만 한번 상상력을 동원해서 동작 회전을 만들어 보셨으면 합니다.

2. 가상시뮬레이터 동작 실험


1) 회로도


  • 준비물 : Servo모터 3개, 아두이노우노, 외부전원
  • 내용 : 2,3,4번 핀을 Servo모터에 연결한다.


2) 코딩


#include <Servo.h>

Servo servo[3];
const byte servoPin[3] = {2,3,4}; //Servo Motor Pin

void setup()
{ 
  for(int i=0;i<3;i++){
    servo[i].attach(servoPin[i]);  
    servo[i].write(90);    
  }
  delay(1000);
}

void loop()
{
  //전진
  servo[1].write(135);     
  servo[2].write(135);     
  delay(500);
  servo[0].write(45);  
  delay(500);
  servo[1].write(90);     
  servo[2].write(90);  
  delay(500);
  servo[0].write(90);  
  delay(1000);
  
  //후진
  servo[1].write(135);     
  servo[2].write(135);     
  delay(500);
  servo[0].write(135);  
  delay(500);
  servo[1].write(90);     
  servo[2].write(90);  
  delay(500);
  servo[0].write(90);  
  delay(1000);  
}

3) 결과


아래 움짤을 보면 2번핀에 연결된 Servo모터는 A관절로 오른쪽으로 이동하면 전진이고 왼쪽으로 이동하면 후진이라고 상상을 해주세요. 그리고 3,4번 핀은 B, C 관절은 다리를 올리는 회전과 내리는 회전을 한다고 상상을 해주세요. 그러면 A관절로 전진/후진 하기전에 B, C 관절이 다리를 올리는 회전을 하고 A관절이 전진/후진 회전을 한 후 B, C 관절이 다리를 내리는 회전을 한다고 머리속에서 그려가면서 상상하시면 되겠습니다.


혹시 제작을 해보시겠다면 다음과 같은 준비물이 필요합니다.

  • Servo Motor - 16개
  • 16채널12비트 PWM/서보모터쉴드(I2C interface)
  • 아두이노우노
  • 외부전원장치

마무리


오늘은 특정 이미지나 영상을 보고 관찰했을 때 그 관찰을 토대로 가상시뮬레이터로 동작 원리를 실험하는 코딩을 해보았습니다. 하지만 위 코딩은 상상속에서 간단히 테스트 할거라 실제로 위 코딩이 정상적으로 보행을 만들어 낼지는 미지수입니다. 단지 동작 원리를 이해하기 위한 가상시뮬레이터에서 유사 실험으로 간단히 테스트를 한 것 뿐입니다. 가상시뮬에터에서 특정 대상을 관찰하고 얻는 원리를 이렇게 실험 할 수 있다는 것을 보여드리는게 오늘 목적이였네요.

마지막으로, 하나의 움직을 회전으로 가상시뮬레이터에서 실험 했는데 현실에서는 정상적으로 보행이 만들어지지 않을 것 같은 찜찜함이 남는 post네요.

댓글()