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

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

댓글()