산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

부품 및 소모품

부품수량비고
아두이노 나노 R3 (Arduino Nano R3)1
SG90 마이크로 서보 모터1목(머리) 움직임용
MAX7219 적색 LED 도트 매트릭스 디스플레이 모듈1눈(표정) 표시용, 2개 모듈 사용
4xAA 배터리 홀더1리튬 이온 배터리 3.7V 200mAh도 사용 가능
나사 세트1
투명 아크릴 욕조 폭탄 몰드 쉘1머리 덮개용
아두이노 트링킷 - 미니 마이크로컨트롤러 5V1서보 제어용 별도 MCU

필수 도구 및 장비

프로젝트 소개

이야기

원래 이 프로젝트는 Thingiverse의 'Xpider'를 만들려고 했었습니다. 그러다 Alex Glow의 'Archimedes'를 보고 충격을 받았죠. 너무 갖고 싶어서 나만의 로봇 동반자를 만들기 시작했습니다. 저는 올빼미 타입은 아니었고, 내 파트너가 특별하길 바랐습니다. 그러다 아프리카 민담의 거미 아난시(Anansi) - 트릭스터이자 이야기의 신 - 가 떠올랐습니다. 이야기라는 컨셉으로 봇을 디자인하기로 했고, 그렇게 Asi가 탄생했습니다 (실제로는 Asi_v4, v1-v3는 프로토타입).

조립

원래 디자인은 Xpider였지만, 많은 부분을 수정하고 뜯어고치며 나만의 것으로 만들었습니다. 출력해야 할 주요 부품들입니다.

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

조립은 자명하지만 사진으로도 남겨둡니다.

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇
ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

전자 부품은 머리 위쪽이나 아래쪽 어디에든 넣을 수 있습니다(취향껏). 하지만 서보는 사진과 같이 장착해야 합니다. 기어가 서보에 장착되었는지 꼭 확인하세요.

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

Asi는 두 개의 마이크로컨트롤러로 제어됩니다: 트링킷(Trinket)과 아두이노 나노.

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇
ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇
ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

두 개의 작은 브레드보드를 데이지 체인으로 연결하고 4xAA 배터리로 전원 공급합니다. (리튬 이온 배터리 3.7V 200mAh도 사용 가능하지만, 가끔 작동하지 않는 경우가 있어 리튬 배터리 2개를 같은 온오프 스위치에 연결해 동시에 켜지도록 하는 것을 추천합니다.)

머리는 연말에 산 크리스마스 볼(투명 구)입니다. 한 발 물러서서 검정 스프레이 페인트로 가볍게 뿌렸습니다. 그런 다음 글루건으로 Asi의 목 부분에 붙이면 완성! 입니다.

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇
ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇
ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

착용 방법은 간단합니다. 하단 부분의 구멍에 아머 와이어를 통과시키고 백팩의 어깨 끈에 감아 고정하면 됩니다.

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

코드

Asi Eye (아두이노 나노용)

#include <LedControl.h>
#include "LedControl.h"

/* LetControl 객체 생성, 핀 연결 정의
   눈용 MAX72XX 2개 사용 */
#define PIN_EYES_DIN 12
#define PIN_EYES_CS 11
#define PIN_EYES_CLK 10
LedControl lc = LedControl(PIN_EYES_DIN, PIN_EYES_CLK, PIN_EYES_CS, 2);

// 회전 설정
bool rotateMatrix0 = false; // 0번 매트릭스 180도 회전
bool rotateMatrix1 = false; // 1번 매트릭스 180도 회전

// 눈동자 없는 눈 모양
byte eyeBall[8] = {
  B00111100,
  B01111110,
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100
};
byte eyePupil = B11100111; // 눈동자 패턴

byte eyeCurrent[8]; // 현재 LED 상태 저장
int currentX, currentY;
int cntLoop = 0, cntEffect = 0;

#define MIN -2
#define MAX 2
#define DELAY_BLINK 40
#define EFFECT_ITERATION 4 // 몇 루프마다 이펙트 실행 (0이면 비활성화)

void setup() {
  lc.shutdown(0, false); lc.shutdown(1, false); // 절전 모드 해제
  lc.setIntensity(0, 1); lc.setIntensity(1, 1); // 밝기 낮게 설정
  lc.clearDisplay(0); lc.clearDisplay(1); // 화면 지우기
  
  // LED 테스트: 수직 라인 스크롤
  byte b = B10000000;
  for (int c = 0; c <= 7; c++) {
    for (int r = 0; r <= 7; r++) {
      setRow(0, r, b); setRow(1, r, b);
    }
    b = b >> 1; delay(50);
  }
  // 전체 점등
  b = B11111111;
  for (int r = 0; r <= 7; r++) { setRow(0, r, b); setRow(1, r, b); }
  delay(500);
  lc.clearDisplay(0); lc.clearDisplay(1); delay(500);
  
  randomSeed(analogRead(0)); // 랜덤 시드
  displayEyes(0, 0); delay(2000); // 중앙 정렬
  blinkEyes(true, false); blinkEyes(false, true); delay(1000); // 크레이지 블링크
}

void loop() {
  // 무작위 위치로 이동, 무작위 시간 대기
  moveEyes(random(MIN, MAX + 1), random(MIN, MAX + 1), 50);
  delay(random(5, 7) * 500);
  
  // 깜빡임 확률
  if (random(0, 5) == 0) {
    delay(500); blinkEyes(); delay(500);
  }
  
  // 특수 이펙트 확률
  if (EFFECT_ITERATION > 0) {
    cntLoop++;
    if (cntLoop == EFFECT_ITERATION) {
      cntLoop = 0;
      if (cntEffect > 6) cntEffect = 0;
      switch(cntEffect) {
        case 0: crossEyes(); delay(1000); break;        // 째려보기
        case 1: roundSpin(2); delay(1000); break;       // 둥근 회전
        case 2: crazySpin(2); delay(1000); break;       // 크레이지 회전
        case 3: methEyes(); delay(1000); break;         // 메스 아이즈
        case 4: lazyEye(); delay(1000); break;          // 게으른 눈
        case 5: blinkEyes(true, false); blinkEyes(false, true); delay(1000); break;
        case 6: glowEyes(3); delay(1000); break;        // 글로우
        default: break;
      }
      cntEffect++;
    }
  }
}

// 이하 주요 함수들: blinkEyes, displayEyes, moveEyes, crossEyes, 
// crazySpin, roundSpin, methEyes, lazyEye, glowEyes, setRow, bitswap
// (전체 코드는 원문 참조)

Asi Neck with Trinket (트링킷용 목 서보 제어)

// 서보 파라미터. Trinket에서 핀은 반드시 1 또는 4여야 함.
// 서보 위치는 타이머/카운터 틱 단위 (1 틱 = 0.128ms)
// 일반적인 서보 펄스 1-2ms, 서보마다 다를 수 있어 조정 필요
#define SERVO_PIN 4        // Trinket에서 핀 1 또는 4 지원
#define SERVO_MIN 4        // ~1ms 펄스
#define SERVO_MAX 26       // ~2ms 펄스

Adafruit_TiCoServo servo;

void setup(void) {
  #if (F_CPU == 16000000L)
  // 16MHz Trinket은 올바른 타이밍을 위해 프리스케일 설정 필요
  // servo.attach() 전에 반드시 실행되어야 함!
  clock_prescale_set(clock_div_1);
  #endif
  servo.attach(SERVO_PIN);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);
}

uint32_t lastLookTime = 0; // 마지막 고개 돌린 시간

void loop(void) {
  unsigned long t = millis();
  
  // 마지막 고개 돌림 후 0.5초 이상 지났다면
  if ((t - lastLookTime) > 500) {
    if (random(10) == 0) { // 10% 확률로
      servo.write(random(SERVO_MIN, SERVO_MAX)); // 무작위 방향 전환
      lastLookTime = t;
    }
  }
  
  // 별개로 눈 깜빡임 시뮬레이션 (LED)
  if (random(10) == 0) {
    digitalWrite(LED_PIN, LOW);
    delay(random(50, 250));
    digitalWrite(LED_PIN, HIGH);
  }
  delay(100); // 초당 약 10회 루프
}

커스텀 부품 및 인클로저 (3D 프린팅 파일)

회로도

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

Asi를 시작하는 데 사용한 회로들입니다. 작은 기판들에서 데이지 체인으로 연결해 둘 다 전원 공급 가능합니다.

ASi(아난시) 로봇 동반자: 아두이노 나노와 LED 디스플레이로 만드는 친근한 로봇

제조공정

  1. 라즈베리 파이와 아두이노로 로봇 만들기: 단계별 통합 가이드
  2. DIY 월-E 영감 라즈베리 파이 CD-박스 로봇
  3. PiCy: 나만의 초소형 라즈베리 파이 구동 로봇 만들기
  4. 구르는 알람 로봇: 라즈베리 파이와 구글 캘린더 연동 스마트 모바일 기상 시스템
  5. 아두이노로 만드는 모터 구동 마인크래프트 크리퍼 로봇
  6. 아르키메데스: 감정 감지 AI 로봇 올빼미
  7. 윈도우 10 IoT 코어로 음성·컴퓨터 비전 로봇 만들기
  8. ROS 로봇: 라즈베리파이 터미널 제어 내비게이션
  9. 심플 파이 로봇 – 라즈베리파이로 2WD 자율 로버 만들기
  10. 음료 로봇 이해: 기술, 자동화, 음료 산업에서의 역할