IT를 품은 기계공학도

3축 짐벌 프로젝트 - 3D프린터 출력 및 코드와 시연영상 본문

아두이노 프로젝트/3축 짐벌

3축 짐벌 프로젝트 - 3D프린터 출력 및 코드와 시연영상

아름돌이 2020. 9. 1. 00:02

2020/08/27 - [아두이노 프로젝트/3축 짐벌] - 3축 짐벌 프로젝트 - 3D설계와 자이로 센서(MPU6050) 각도 읽어오기

 

3축 짐벌 프로젝트 - 3D설계와 자이로 센서(MPU6050) 각도 읽어오기

이 프로젝트를 시작하게 된 계기가는 이거다! 유튜브에서 아두이노 3축 짐벌을 봤는데 상당히 재밌어 보였다! https://www.youtube.com/watch?v=UxABxSADZ6U 이 프로젝트를 비슷하게? 따라 해보려고 한다. 메�

ilovemecha.tistory.com

3D 출력물과 조립

지난 번 포스팅에서는 3D 프린팅을 위한 설계와 자이로 센서의 값을 받아오는 것을 하였다.

이번 주에 모터랑 나사들이 도착했는데.. 안타깝게 설계실 수로 인해 사포질과 구멍 내기 작업을 직접 손으로 했다.

 

출력물은 꽤 깔끔하게 나왔다!! 서보모터를 껴보니 딱 중간끼워맞춤이 잘 돼있었다!

모터가 딱딱 들어가고 나사들도 딱 맞아떨어지니 기분이 좋았다.

조립하고 나니 제법 그럴싸한 짐벌이 완성된 것 같다. 하지만 아직 배선이 남았다는 것!..

아두이노 보드와 브레드보드 그리고 모든 선들을 본체 안에 넣어버렸다. 그 결과 나름 깔끔한(?) 외형을 갖게 되었다.

 

코드와 실험

우선 모터를 3개 돌리려면 한 개부터 돌릴 줄 알아야 한다.

#include <Servo.h>

int Servo_Pin1 = 9;
Servo Servo1;

void setup() {
  Servo1.attach(Servo_Pin1);
}

void loop() {
  Servo1.write(90);
  delay(1000);
  Servo1.write(0);
  delay(1000);
  Servo1.write(180);
  delay(1000):
}

아주 간단한 예제이다 모터의 신호선을 9번 핀에 꽂고 코드를 실행하면 위와 같이 실행이 될 것이다.

모터 3개를 돌려보자!

 

#include <Servo.h>

int Servo_Pin1 = 9;
int Servo_Pin2 = 10;
int Servo_Pin3 = 11;

Servo Servo1;
Servo Servo2;
Servo Servo3;

void setup() {
  Servo1.attach(Servo_Pin1);
  Servo2.attach(Servo_Pin2);
  Servo3.attach(Servo_Pin3);
}

void loop() {
  Servo1.write(90);
  Servo2.write(90);
  Servo3.write(90);
  delay(1000);
  Servo1.write(0);
  Servo2.write(0);
  Servo3.write(0);
  delay(1000);
  Servo1.write(180);
  Servo2.write(180);
  Servo3.write(180);
  delay(1000):
}

3개라고 뭐가 달라지겠냐만, 서보 객체를 좀 더 선언해주었을 뿐 큰 어려움은 없다. 라이브러리를 사용하니까 코드가 굉장히 간단해진다! 마지막으로 최종적으로 자이로 센서까지 연결해 준 뒤 아래와 같은 코드를 넣어준다. 그냥 라이브러리 두 개를 합쳐 놓았을 뿐.. 어려운 것은 없다.

최종 코드이다. 혹시 코드가 오작동하거나 궁금한 점이 있다면 언제든지 코멘트 부탁드립니다.

//All copyright 2020.8.30 공돌학사. All rights reserved
//If you have a any question, Send me a E-mail
//My email address : kaingsik4@naver.com

//라이브러리를 불러옵니다.
#include <Servo.h>
#include <MPU6050_tockn.h>
#include <Wire.h>

//MPU6050 객체 선언
MPU6050 mpu6050(Wire);

//SERVO 신호 선 설정 및 서보 객체 선언.
int Servo_Pin1 = 9;
int Servo_Pin2 = 10;
int Servo_Pin3 = 11;
Servo Servo1;
Servo Servo2;
Servo Servo3;

//X,Y,Z축 각도를 받아올 변수 선언
int Deg_X;
int Deg_Y;
int Deg_Z;

//시작 될 때 한번 설정
void setup() {
  //MPU사용 ON
  Serial.begin(19200);
  Wire.begin();
  mpu6050.begin();

  //서보모터 사용할 핀 연결
  Servo1.attach(Servo_Pin1);
  Servo2.attach(Servo_Pin2);
  Servo3.attach(Servo_Pin3);

  // 서보모터 초기 각도 설정
  Servo1.write(90);
  Servo2.write(90);
  Servo3.write(90);
}

void loop() {
  mpu6050.update();
  Deg_X = mpu6050.getAngleX();
  Deg_Y = mpu6050.getAngleY();
  Deg_Z = mpu6050.getAngleZ();

  Servo1.write(90-z);
  Servo2.write(90+y);
  Servo3.write(90+x);
}

그리하여 최종 영상!

 

마치며

이번 프로젝트는 뭐 제어기법이 들어가거나 한 부분은 하나도 없다. 모터의 다이나믹 특성도 이미 라이브러리에서 다 잡혀있고, 자이로의 값을 얼마나 정확히 받아오냐가 이번 프로젝트의 핵심이었던 것 같다. 한 가지 아쉬운 점은 서보모터의 미세한 진동과 내 손떨림은 잡지 못했지만. 이번 프로젝트는 이쯤에서 마무리하려고 한다. 짧았지만 첫 프로젝트 포스팅인 만큼 부족한 점이 참 많은 것 같다. 혹시 프로젝트를 역설계하시다가 모르는 부분이 있으면 언제든지 코멘트 부탁드립니다 :)

Comments