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

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네요.

댓글()

[아두이노] 핀터레스트에서 찾은 자료 관찰

IOT/아두이노|2019. 8. 30. 09:00

[아두이노] 핀터레스트에서 찾은 자료 관찰



핀터레스트에서 6족 보행로봇에 관련 이미지들을 한번 검색을 하였습니다. 그중에서 가장 맘에 드는 ICStation 팀의 Hexapod4 Spider Robot 작품 post를 발견했는데 자세한 내용은 보지 않고 그안에 Youtube 영상만 보고 움직임을 관찰하고 제 나름대로 한번 재해석 하는 시간을 가졌습니다. 해당 post의 글을 읽게 되면 상상력이 이 post를 쓰신 저자의 생각에 묶일 것 같아서 최대한 제 나름대로 해석하고 원리를 이해해 보고자 했네요.


오늘 post의 핵심은 아두이노 관련 자료를 핀터레스트에서 찾고 그 찾은 post를 보면서 관찰을 통해 원리를 이해하고 그걸 자신의 것으로 만드는 과정입니다.

1. 핀터레스트에서 찾은 6족 보행로봇



위 출처에 가시면 ICStation 팀의 Hexapod4 Spider Robot 작품이 나와 있습니다. 메인 사진을 보시면 다음과 같은데 Servo모터의 관절을 관찰해 봅시다.


출처 : ICStation 팀의 Hexapod4 Spider Robot 이미지

이걸 좀 더 보기 편하게 그려봤네요.


사진과 그림을 그리고 나니 대충 동작 제어가 어느정도 가늠이 되더군요. 그렇다면 ICStation 팀의 Hexapod4 Spider Robot 이 과연 어떻게 움직이게 했을지 궁금해지더군요. 다행히 Youtube로 6족 보행로봇의 움직이는 영상이 담겨져 있었네요.

관절의 움직임을 집중적으로 관찰했네요.

2. 6족 보행로봇 관절 동작 관찰


1) A관절 동작



위 그림에서 관절 A지점의 Servo모터가 수평으로 좌/우 움직이는 동작을 수행하더군요. 위 그림은 전진했을 때 각 관절이 앞쪽으로 45도 방향으로 움직인 상태이고 여기서 다시 몸체만 반대 방향으로 회전시키면 다리는 몸체를 지탱하는 중심축이 되고 몸체가 앞으로 전진하게 되고 다시 위 그림처럼 다리를 움직이고 45도 각도가 되면 몸체를 반대방향으로 회전시키면 몸체가 또 앞으로 전진하고 이런식으로 다리가 먼저 45도 앞으로 전진하고 몸체가 뒤 따라오는 식으로 영상을 보시면 A관절 움직임을 알 수 있을거에요. A관절은 수평으로 몸체을 움직이는 핵심이 됩니다.

2) B관절 동작



B관절은 다리를 들어올리는 동작을 담당하네요. 수직으로 위아래로 움직이면 진행 방향으로 다리를 움직이기 전에 다리를 올려서 해당 다리가 몸체를 지탱하는 중심축을 해제시킨다고 생각하시면 됩니다. 그리고 움직이기 편하게 다리가 올라간 상태를 만듭니다. 그리고 A관절의 회전시킨 방향이 진로 방향이 되고 그 방향에서 다시 B관절이 아래로 움직이고 해당 다리가 6족 보행로봇 몸체를 지탱하는 중심축으로 되돌아가게 됩니다. 다시 설명하면은 6개의 다리가 몸체를 지탱하는 중심축이 되는데 여기서 일부 다리는 중심축을 해제시키고 보행 방향으로 움직이고 다시 몸체를 지탱하는 중식축으로 돌아가는 동작 과정을 거치면서 보행하기 위한 움직임을 만들어 냅니다.

3) C관절 동작



B관절과 함꼐 몸체를 지탱하는 실제 중심다리입니다. 위 그림처럼 지면과 배치된다고 상상해보면 지면과의 몸체의 높이가 달라지고 딱딱한 움직임보다 좀 더 자연스럽게 움직이는 곤충과 유사한 움직임을 만들 어 낼 수 있는 다리 인 것 같아 보입니다. C관절이 없이 A, B관절이 움직인다고 상상을 해보세요. 뭔가 딱딱한 움직임이 연상 되실 꺼에요. 좀 더 자연스러운 움직임을 만들어내기 위해 C관절까지 표현한 것 같습니다. 보행 방향으로 움직이기 전 B관절을 들어올릴 때 C관절도 같이 들어올려서 움직임을 부드럽게 만들었네요. 그리고 지면과의 접촉에서도 C관절의 용도는 많아 보입니다. 제가 실제로 만들어 보지 못하고 잠깐 어제 우연히 검색해서 찾은 post라서 6족 보행로못에 대해 정확한 이야기를 할 수 없기 때문에 좀 설명이 애매하네요. 하지만 곤충과 흡사하게 다리의 움직임을 C관절을 통해서 좀 더 부드럽게 움직여진다는 것은 영상을 통해 알 수 있었습니다. 움직임의 패턴이 AxBxC 의 가지수로 많기 때문에 다른 6족 보행로봇보다는 꽤 흥미를 끄는 보행로봇 같아 보였습니다.

3. 전진 동작 관찰


동영상에 여러 동작 중 전진 동작을 한번 관찰해 봅시다.


위 그림에서 이미지 A가 초기 상태이고 위에서 관절 움직임을 정면 방향으로 전진 할 경우 이미지 B의 형태로 다리 관절이 전부 이동하게 됩니다. 그 때 몸체는 이미지 C처럼 관절을 움직이면 몸체는 앞으로 이동하게 됩니다. 이때 다리가 몸체를 지탱을 확실히 해야지 몸체가 앞으로 전진하겠죠. 순서는 A->B->C->B->C ... 이렇게 움직임으로서 앞으로 전진하는 것 같더군요.

4. 보행 동작 실험


가상시뮬레이터에서 실험을 한다면 Servo모터 3개를 이용하여 다리 하나의 관절 제어 코딩을 설계하시면 됩니다. 즉, 6개의 다리를 제어가 아닌 딱 하나의 다리만 제대로 보행동작 패턴 회전을 만들어 원리를 이해 하고 다리 1개를 동작 할 수 있게 된다면 똑같은 원리로 6개의 다리를 제어하면 됩니다.

아무튼 아래와 같이 가상시뮬레이터에서 3개의 Servo모터의 회전 패턴을 만들면 됩니다.


대충 이렇게 3개를 가상시뮬레이터서 준비하고 나머지 관찰한 관절 움직임을 코딩하면 됩니다. 관절 다리의 움직임은 이 세개의 Servo모터 회전을 순차적 회전 패턴을 만들어서 전진 보행을 만들어 내면 됩니다.

마지막으로, 제가 post하는 순서를 잘 읽어주시기 바랍니다. 특정 검색된 post의 이미지에서 어떻게 관찰을 했는지 그 관찰을 제가 어떻게 접근했는지를 보시고 다른 post에 대해 탐구하실 때 써먹으시면 합니다. 오늘 post의 관찰 핵심은 관절 다리 한개의 3개의 Servo모터 제어입니다. 이 3개의 Servo모터를 어떤식으로 패턴 회전을 시키느냐에 따라 6족 보행로봇이 움직이게 됩니다. 여러분들이 3개의 Servo모터를 회전 시킬 수 있으면 충분히 6족 보행로봇을 움직이게 할 수 있을거라 생각됩니다.

마무리


오늘 post는 아두이노와 관련 된 작품 하나를 관찰하는 과정을 간단히 이야기를 했네요. 참고로 실제로 제작을 한다면 다음과 같은 준비물이 필요합니다. 6족 보행 로봇은 총 18의 Servo모터를 필요 합니다. Servo모터를 많이 사용하기 때문에 그냥 아두이노로 제어 할 수 없습니다. Servo Motor Controller Driver가 필요 합니다. 다수의 Servo모터를 제어할 수 있습니다. 그리고 6족 보행로봇 뼈대, 아두이노, 외부전원 공급장치가 있으면 6족 보행로봇을 만들 수 있겠죠.

댓글()

[아두이노] 핀터레스트에서 아두이노 검색

IOT/아두이노|2019. 8. 29. 09:00

[아두이노] 핀터레스트에서 아두이노 검색



우연히 발견한 핀터레스트라는 사이트를 소개 합니다. 꽤 재밌는 사이트이더군요. 관심있는 주제로 검색을 하면 관련 이미지들을 모아 정리해서 보여주는데 자료 수집용으로 괜찮은 사이트 같아 보였습니다. 핀터레스트는 이용자들이 관련 이미지들을 스크랩하고 그 정보를 다른 사람들과 공유하는 소셜 네트워크 서비스를 제공한다고 하네요. 여기서 재밌는 것은 관련 검색어로 찾은 이미지를 클릭하면 해당 이미지의 post로 넘어 가기 전 해당 이미지와 유사한 다른 이미지들이 검색이 됩니다. 그리고 선택한 이미지를 보면 하단에 저정한 이용자 아디가 있는데 그 아디를 클릭하면 해당 블로그로 가고 그 블로그 안에 또다른 이미지 정보들을 확인 할 수 있어 이용자들 간의 수집 된 정보를 공유되고 있네요. 정보 공유 방식이 효율적이여서 원하는 정보를 수집할 때 유용할 것 같아서 소개합니다.

참고로, 아두이노 뿐만 아니라 다양한 주제의 post들을 공유되고 있는데 관련 단어로 검색을 하면 비슷한 개념의 이미지들을 검색이 되기 때문에 아두이노에 관심 있는 분들이나 다른 주제에 관심있는 분들도 사용하기에 괜찮은 사이트 같더군요. 특정 단어에 대한 관련 이미지들이 검색되는데 관련 이미지의 정확도가 높아서 유용한 사이트인 것 같네요.

1) 핀터레스트에서 아두이노 검색


아두이노 관련 이미지들이 수집 되어 아래 사진처럼 보여줍니다. 약간 포괄적인 검색이 되는데 사진들을 보면 아두이노의 상상력을 자극하는 이미지로 가득하네요.


위와 같이 아두이노를 검색하면 1차 검색으로 아두이노로 표현한 수많은 작품들이 포괄적으로 검색됩니다. 그런데 위에서 아무 이미지나 클릭해보시면 바로 해당 이미지의 post로 가는게 아니라 해당 이미지와 같은 주제로 2차 검색이 이러우 집니다.

그러면, 어떻게 2차 검색이 이루어지는 볼까요.

2) 특정 이미지 검색


아두이노 검색에서 6족 보행로봇 이미지가 마음에 들어서 한번 클릭 해봤네요. 그랬더니 아래 사진과 같이 6족 보행로봇과 비슷한 개념의 이미지들이 가득하네요.


즉, 아두이노->6족 보행로봇에 대한 관련 이미지들이 검색이 되었네요. 여기서 처음 클릭은 6족 보행로봇 이미지에서 다시 클릭하면 해당 6족 보행로봇 post로 최종적으로 넘어가서 정보를 확인 할 수 있게 되는 구조네요.

참고로 특정 이미지 클릭하여 위와 같은 이미지 창이 뜨면 하단에 이용자 아디가 표시 됩니다. 그 아디를 클릭하면 또 다른 공유 자료를 확인 할 수 있습니다.

한번 클릭해 봅시다.

3) 해당 이미지 저장한 이용자 클릭



위 사진처럼 이용자 아디를 클릭하면 해당 블로그로 넘어갑니다.


들어가보니 원하는 결과가 아니였지만 이렇게 이용자들 간의 정보를 공유가 이루어지네요.

이렇게 원하는 이미지를 클릭하고 그 이미지를 공유한 이용자 블로그에 들어가면 그 이미지를 수집한 이용자가 그 이미지와 관련 된 다른 수집 이미지를 검색 할 수 있다는 장점을 있네요. 즉, 누군가 특정 주제에 대해 자료를 수집하고 그 수집한 자료를 자신의 블로그에 정리되어 공유 되어 있다면 우리는 그 자료를 수집하는 시간을 절약 할 수 있습니다.

이제 이미지가 담겨져 있는 post가 대체 어떤 내용이 있는지 한번 살펴봅시다.

4) 특정 이미지 클릭


특정 이미지를 클릭하면 해당 post로 넘어 갑니다. 기대했던 정보는 아니지만 아래 사진처럼 정보를 얻을 수 있네요.


이렇게 원하는 정보를 수집할 수 있고 자신의 블로그에 스크랩하여 공유할 수 있어서 꽤 유용한 사이트 같네요.

마무리


우선 핀터레스트 사이트 자체가 최종 post까지 가지 않더라도 아두이노 관련 검색어로 검색 된 이미지만 보셔도 됩니다. 아두이노의 경우 상상력을 자극하는 이미지들이 많기 때문에 아두이노 공부하시는 분들에게 도움이 될 듯 싶네요.

댓글()