본문 바로가기
로봇프로젝트

3D 프린터로 제작된 로봇 - Brainy Botic - a 3D Printed Robot Controlled by an Arduino Nano

by 모빌리티키즈 2023. 11. 29.
728x90
반응형

 

안녕하세요.

모빌리티키즈입니다.

 

제작한 프로젝트는 "Brainy Botic"이라는 이름의 3D 프린터로 제작된 로봇입니다. 이 로봇은 Arduino Nano로 제어됩니다.

이 프로젝트의 주요 목적은 3D 프린팅, 전자 및 프로그래밍 기술을 실전에 적용하여 이러한 종류의 프로젝트를 좋아하는 사람들에게 매력적으로 제시하는 것입니다.

로봇은 상자 모양을 가지고 있는데, 이는 세 가지 주요 이유 때문입니다. 첫째로, 프린팅 과정에서 지지물이 필요하지 않도록 하는 것이 프린팅 과정을 더 쉽게 만들기 때문입니다. 둘째로, 로봇을 모듈식으로 만들어 여러 가지 용도로 사용할 수 있도록 모듈, 구성품 및 센서를 쉽게 교체할 수 있도록 하기 위한 것입니다. 마지막으로, 나중에 레이저 컷 기술과 결합한 다른 버전의 로봇을 출시하여 그 영역에서 더 많은 지식을 습득하고자 합니다.

조립 프로세스를 가능한 간단하게 만들기 위해 상용 구성품을 선택했지만, 로봇 얼굴에 표정을 주기 위해 주로 LED에 솔더링 작업이 필요합니다.

 

이 프로젝트의 주요 목적은 이러한 종류의 프로젝트를 좋아하는 사람들에게 매력적인 방식으로 3D 프린팅, 전자 및 프로그래밍 기술을 연습하는 것입니다.

로봇은 세 가지 주요 이유로 상자 모양을 가지고 있습니다: 첫째, 인쇄 과정을 더 쉽게 만들기 위해, 즉 인쇄 과정에서 지지대가 필요하지 않습니다. 둘째, 모듈식이어야 하므로 다양한 사용 사례에서 로봇을 사용할 수 있는 방식으로 모듈, 구성 요소 및 센서를 쉽게 교체할 수 있습니다. 그리고 마지막으로, 저는 이 로봇의 다른 버전을 출시할 계획이지만 레이저 절단 기술과 혼합하여 해당 분야에 대한 더 많은 지식을 얻을 계획입니다.

조립 프로젝트를 가능한 한 단순하게 만들려고 노력했고 이를 위해 기성품 구성 요소를 선택했지만 주로 LED에 로봇 얼굴을 표현하는 납땜이 여전히 필요합니다.

로봇이 단순해 보일지 모르지만 이 버전의 로봇을 만들기 위해 설계 과정에서 많은 시행착오를 겪었습니다. 이 프로젝트를 재현한다면 적어도 "목적지가 아니라 여행"이기 때문에 나만큼 즐길 수 있기를 바랍니다.

공급

도구:

  • 3D 프린터
  • 납땜

소모품:

  • 3D 프린트 필라멘트

구성 요소:

  • 2 x SG90 360º 서보 모터
  • 3 x SG90 180º 서보 모터
  • 2 x SG90 서보 모터용 휠
  • 금속 볼 이송 장치.
  • M3 나사
  • M3 스퀘어 너트
  • M3 너트
  • 듀퐁 전선
  • Smile Shark LED 손전등 전원 은행 USB (모든 USB 보조 배터리가 가능합니다. 손전등이 있기 때문에 이것을 선택했습니다)
  • 3개의 7비트 RGB WS2812 원형 LED. (눈과 입용)

1단계: 3D 프린팅

파일은 다음 구조로 구성됩니다.

  • 로봇의 머리
  • 피부
  • 해골
  • 무기

색상의 의미는 다음과 같습니다.

  • 빨간색: 로봇의 피부용
  • 흰색: 스켈레톤입니다.

head.stl
0.97MB
arms.stl
2.24MB
skeleton.stl
2.66MB
skin.stl
5.22MB

 

2단계: 헤드 조립

헤드에는 로봇이 왼쪽과 오른쪽을 볼 수 있도록 하는 목용 서보가 포함되어 있습니다.

얼굴은 눈과 입을 만들기 위해 3 개의 7 비트 rgb LED로 구성됩니다.

4단계: 섀시 조립

섀시는 전체 로봇을 지원하며 각각 2º 서보 모터와 금속 볼 이송 장치에 부착된 360개의 바퀴를 포함합니다.

5단계: 앞면과 뒷면 피부

이 앞면과 뒷면 부분에는 팔과 머리가 부착되어 있습니다.

6단계: 코딩

서보 및 LED 테스트를 위해 arduino nano 업로드 된 간단한 프로그램 :

#include <FastLED.h>
#include <Servo.h>


Servo servoLeft;
Servo servoRight;
Servo servoArmLeft;
Servo servoArmRight;
Servo servoHead;

int pos0 = 0;


#define LED_PIN     7
#define NUM_LEDS    21
#define EYE_LEFT     14
#define EYE_RIGHT     7
#define MOUTH     0
CRGB leds[NUM_LEDS];
enum lookDirection { FRONT, UP, DOWN, LEFT, RIGHT };


void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  Serial.begin(9600);
  Serial.println(F("Establishing connections..."));

  servoLeft.attach(2);
  servoRight.attach(3);
  servoLeft.attach(4);
  servoRight.attach(5);
  servoHead.attach(6);


  // Servo is stationary.
  servoLeft.write(90);
  servoRight.write(90);
  servoLeft.write(90);
  servoRight.write(90);
  servoHead.write(90);
}

void clearEyes() {
  for (int i = 0; i < 7; i++) {
    leds[EYE_LEFT + i] = CRGB(0, 0, 0);
    leds[EYE_RIGHT + i] = CRGB(0, 0, 0);
  }
}


void clearMouth() {
  for (int i = 0; i < 7; i++) {
    leds[MOUTH + i] = CRGB(0, 0, 0);
  }
}

void openEyes() {
  clearEyes();
  for (int i = 0; i < 7; i++) {
    leds[EYE_LEFT + i] = CRGB(255, 255, 255);
    leds[EYE_RIGHT + i] = CRGB(255, 255, 255);
  }
  FastLED.show();
}

void closeEyes() {
  clearEyes();
  leds[EYE_LEFT + 0] = CRGB(255, 255, 255);
  leds[EYE_LEFT + 3] = CRGB(255, 255, 255);
  leds[EYE_LEFT + 6] = CRGB(255, 255, 255);


  leds[EYE_RIGHT + 0] = CRGB(255, 255, 255);
  leds[EYE_RIGHT + 3] = CRGB(255, 255, 255);
  leds[EYE_RIGHT + 6] = CRGB(255, 255, 255);
  FastLED.show();
}


void look(lookDirection direction) {
  int i = 0;
  switch (direction) {
  case FRONT:
    i = 6;
    break;
  case LEFT:
    i = 5;
    break;
  case RIGHT:
    i = 5;
    break;
  default:
    i = 5;
    break;
  }
  clearEyes();
  leds[EYE_LEFT + i] = CRGB(255, 255, 255);
  leds[EYE_RIGHT + i] = CRGB(255, 255, 255);
  FastLED.show();
}


void smile() {
  clearMouth();
  leds[MOUTH + 0] = CRGB(255, 255, 255);
  leds[MOUTH + 3] = CRGB(255, 255, 255);
  leds[MOUTH + 4] = CRGB(255, 255, 255);
  leds[MOUTH + 5] = CRGB(255, 255, 255);
  FastLED.show();
}


void loop() {
  smile();
  openEyes();
  delay(4000); 
  closeEyes();
  delay(500); 


  for(pos0=0; pos0 <= 140; pos0++){ 
    servoLeft.write(pos0);
    delay(10);
    servoRight.write(140 - pos0);
    delay(10);
  }

  // Servo spins forward at full speed for 1 second.
  servoLeft.write(140);
  servoRight.write(140);
  servoArmLeft.write(140);
  servoArmRight.write(140);
  servoHead.write(140);
  delay(1000);
  // Servo is stationary for 1 second.
  servoLeft.write(90);
  servoRight.write(90);
  servoArmLeft.write(90);
  servoArmRight.write(90);
  servoHead.write(90);
  delay(1000);
  // Servo spins in reverse at full speed for 1 second.
  //  myservo.write(0);
  servoLeft.write(50);
  servoRight.write(50);
  servoArmLeft.write(50);
  servoArmRight.write(50);
  servoHead.write(50);
  delay(1000);
  // Servo is stationary for 1 second.
  servoLeft.write(90);
  servoRight.write(90);
  servoArmLeft.write(90);
  servoArmRight.write(90);
  servoHead.write(90);
  delay(1000);
}

 

728x90
반응형