프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

픽사 램프 만들어 보기

2015-09-07 15:50:22

개요

Pixar의 대표 아이콘하면 떠오르는 것이 있습니다. 바로 램프인데요~!!

아마 영화관에서 영화를 볼때 다들 한번씩은 봤을거라 생각합니다.

 

아마 다들 모양은 알지만 이 램프에 이름이 붙어 있는 사실을 아시나요? 이름은 룩소라 합니다.

룩소는 1986년 단편영화 Luxo.Jr의 주인공이기도 합니다. 이 영화는 픽사가 1986년에 제작해서 아카데미 상 후보에도 오르기까지 합니다.

 

 

 

3D프린터가 나오고 위의 램프디자인을 이제는 Thingiverse에서 무료로 구할 수 있습니다! (검색어는 Snap Together Lamp라고 치면 나옵니다.)

 

아래 영상에서도 3D Printer로 제작하고 싶은 인기 아이템 순위 5위에 들기도 했습니다.

 

 

 

이번 프로젝트에서는 픽사의 아이콘인 룩소를 출력하여 아두이노로 LED를 달아보겠습니다~!

 

 

 

동영상 보기

 

 

사전에 필요한 내용

 

시리얼 통신으로 제어하는 Mood Lamp

무드램프 만들어 보기

 

 

부품 목록

NO 부품명 수량 상세 설명
1 오렌지 보드 1 아두이노 UNO 호환보드
2 7 SMD RGB LED  1  
3 점퍼 케이블 3  
4 3D 프린터 출력물 1 룩소

 

부품명 오렌지보드 7 SMD RGB LED 점퍼 케이블 
파트
 

 

하드웨어 Making

 

3D프린터로 출력한 룩소를 조립과정을 찍어보았습니다.(사진을 찍다 말다 해서 중간 중간 비어있는 과정들도 많습니다.)

 

 

 

 

 

 

 

룩소 내부의 LED는 7 SMD RGB LED로 설치하였습니다.

 

 

 

 

 

 

 

 

 

소프트웨어 Coding

 

코드는 코코아팹 초창기에 작성한 튜토리얼인 '시리얼통신으로 제어하는 Mood lamp'의 소스를 차용하였습니다.

RGB LED를 사용하는 것이기 때문에 소스는 LED종류나 색깔, 제어 방법에 따라 개인별로 자유롭게 코딩하여 사용할 수 있습니다.

 

코드에 있어서는 특별한 제약이 없습니다.

 

바로가기 링크 -> 시리얼 통신으로 제어하는 Mood lamp

 

/*
EarthShine Electronics

Project 10 - Serial Controlled Mood Lamp
*/


char buffer[18];  //입력받을 데이터값을 저장할 버퍼 생성
int red, green, blue;

//각각의 핀번호 설정 
int RedPin = 11;
int GreenPin = 10;
int YellowPin = 9;


void setup() {
  Serial.begin(9600); //시리얼통신속도 설정
  Serial.flush();     //현재 시리얼포트에 있는 데이터값을 삭제
  pinMode(RedPin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(YellowPin, OUTPUT);
}

void loop() {
  if(Serial.available() > 0) {  //시리얼포트내에 입력받은데이터값이 존재할 경우
    int index = 0;
    delay(100);
    int numChar = Serial.available();
    if (numChar > 15) {         //입력받은 데이터의 크기가 15바이트 이상일 경우
      numChar = 15;             //15로 고정
    }
    while (numChar--) {         //입력받은 데이터를 버퍼에 저장
      buffer[index++] = Serial.read();
    }
    splitString(buffer); //함수 호출
  }
}

void splitString(char* data) {
  Serial.print("Data entered: ");
  Serial.println(data);
  char* parameter;
  parameter = strtok(data, " ,"); //입력받은 문자를 ""안의 " ,"이 문자를 기준으로 잘라냄
  while(parameter != NULL) { //잘라낸 값이 0이 아닐경우에는 그값으로 다시 " ,"을 기준으로 잘라냄
    setLED(parameter);
    parameter = strtok (NULL, " ,");
  }
  
//데이터 버퍼의 값을 비운다
  for(int x = 0; x < 16; x++) {
    buffer[x] = '\0';
  }
  Serial.flush();
}

void setLED(char* data) {
  if((data[0] == 'r') || (data[0] == 'R')) { //잘라낸 데이터의 첫글자가 r이나 R일 경우
    int Ans = strtol(data+1, NULL, 10); //뒤에오는 값을 10진수의 int형으로 변환
    Ans = constrain(Ans, 0, 255);  //int형 값을 최소0 최대255로 제한한다
    analogWrite(RedPin, Ans);  //int값의 크기만큼 LED를 점화한다
    Serial.print("Red is set to: ");
    Serial.println(Ans);
  }
    if((data[0] == 'g') || (data[0] == 'G')) { //잘라낸 데이터의 첫글자가 g나 G일 경우
    int Ans = strtol(data+1, NULL, 10);  //뒤에오는 값을 10진수의 int형으로 변환
    Ans = constrain(Ans, 0, 255);  //int형 값을 최소0 최대255로 제한한다
    analogWrite(GreenPin, Ans);  //int값의 크기만큼 LED를 점화한다
    Serial.print("Green is set to: ");
    Serial.println(Ans);
  }
    if((data[0] == 'y') || (data[0] == 'Y')) { //잘라낸 데이터의 첫글자가 y나  Y일 경우
    int Ans = strtol(data+1, NULL, 10);  //뒤에오는 값을 10진수의 int형으로 변환
    Ans = constrain(Ans, 0, 255);  //int형 값을 최소0 최대255로 제한한다
    analogWrite(YellowPin, Ans);  //int값의 크기만큼 LED를 점화한다
    Serial.print("Yellow is set to: ");
    Serial.println(Ans);
  }
}

 

 

 

 

 

수박쨈

아두이노, Arduino, 오렌지 보드, 7 SMD RGB LED, 룩소