코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2015-09-07 15:50:22
Pixar의 대표 아이콘하면 떠오르는 것이 있습니다. 바로 램프인데요~!!
아마 영화관에서 영화를 볼때 다들 한번씩은 봤을거라 생각합니다.
아마 다들 모양은 알지만 이 램프에 이름이 붙어 있는 사실을 아시나요? 이름은 룩소라 합니다.
룩소는 1986년 단편영화 Luxo.Jr의 주인공이기도 합니다. 이 영화는 픽사가 1986년에 제작해서 아카데미 상 후보에도 오르기까지 합니다.
3D프린터가 나오고 위의 램프디자인을 이제는 Thingiverse에서 무료로 구할 수 있습니다! (검색어는 Snap Together Lamp라고 치면 나옵니다.)
아래 영상에서도 3D Printer로 제작하고 싶은 인기 아이템 순위 5위에 들기도 했습니다.
이번 프로젝트에서는 픽사의 아이콘인 룩소를 출력하여 아두이노로 LED를 달아보겠습니다~!
NO | 부품명 | 수량 | 상세 설명 |
1 | 오렌지 보드 | 1 | 아두이노 UNO 호환보드 |
2 | 7 SMD RGB LED | 1 | |
3 | 점퍼 케이블 | 3 | |
4 | 3D 프린터 출력물 | 1 | 룩소 |
부품명 | 오렌지보드 | 7 SMD RGB LED | 점퍼 케이블 |
파트 |
3D프린터로 출력한 룩소를 조립과정을 찍어보았습니다.(사진을 찍다 말다 해서 중간 중간 비어있는 과정들도 많습니다.)
룩소 내부의 LED는 7 SMD RGB LED로 설치하였습니다.
코드는 코코아팹 초창기에 작성한 튜토리얼인 '시리얼통신으로 제어하는 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);
}
}
수박쨈