아이가 유치원에서 너무나 예쁜 스탠드를 만들어 왔습니다.. AAA 건전지가 들어가는 예쁜 스탠드.
스텐드 옆면에 예쁘게 그림을 그려서 본인이 자는 방에 가져다 두고는
"오늘부터 얘가 나를 지켜줄꺼야~"
ㅎㅎ
너무나 귀엽지 않습니까?
저녁이 되어 불을 켜보니
헐랭
정말 오던 잠도 달아날 것 같은 푸르스름한 조명이더군요.
그래서 바꿔주기로 하였습니다.
- 일단 조명 색상은 따뜻한 색상으로
- 밤새 켜져 있지 않도록 자동으로 소등될 것
요렇게 간단한 요구사항을 작성한뒤에 바로 실행에 들어갑니다.
필요한 재료는 간단합니다.
- Attiny85 (아두이노를 사용하기는 아깝잖아요?)
- 1W LED (5000K 미만)
- 50uf 전해 콘덴서 (작은걸로)
- 전선 조금.
간단하죠?
우선 자동으로 소등이 되어야 하고 소등이 될때는 서서히 어두워 지는 것이 좋을 것 같아 먼저 테스트를 해보기로 하였습니다.
우선 Attiny 에 대하여 간단히 알아 보아야 하는데요. attiny 는 아주 작은 마이크로프로세서로 칩안에 부트로더, 디지털핀, 아날로그핀, PWM 핀을 모두 갖춘 환상적인 부품입니다. 전압만 적당히 주면 칩하나로도 왠만한 동작이 가능한 녀석입니다. 나중에 이녀석을 이용한 작품들을 좀 소개해 드리겠습니다.
소스코드를 업로드 하기 위하여 별도의 프로그래머가 필요하긴 하지만 아두이노를 이용하여 간단하게 프로그래머로 사용할 수 있는 방법이 있으니 걱정마시고 진행하시면 됩니다.
저는PWM 핀에 일정 시간이 지나면 서서히 전압을 감소 시킨뒤 0V 까지 떨어지면 Attiny85를 sleep 모드로 진입시켜 초절전상태가 되도록 할 계획입니다.
아두이노 ISP 만들기
아두이노를 ISP 와 같이 사용하여 Attiny85 를 프로그래밍 할 건데요. 간단합니다.
아두이노 예제에 있는 ArduinoISP 를 열어 주세요.
해당 소스를 본인의 아두이노 설정에 맞게 세팅한 뒤 업로드를 합니다.
그런 다음 10uf 전해 콘덴서를 하나 준비해주시고
Arduino reset -- 콘덴서의 + ,
Arduino GND -- 콘덴서의 - 를
연결한 뒤 Arduino 와 Attiny85의 각 핀을 아래와 같이 연결합니다.
- Arduino 5V -- ATTiny85 Pin 8 (Vcc)
- Arduino GND -- ATTiny85 Pin 4 (GND)
- Arduino Pin 13 -- ATTiny85 Pin 8 (SCK)
- Arduino Pin 12 -- ATTiny85 Pin 7 (MISO)
- Arduino Pin 11 -- ATTiny85 Pin 6 (MOSI)
- Arduino Pin 10 -- ATTiny85 Pin 1 (Slave Reset)
전 브래드 보드에 매번 연결하는 것이 귀찮아서 간단한 보드를 하나 만들었습니다.
위 사진과 같이 만들어서 소켓에 아두이노 나노와 attiny85 를 끼웠다 뺐다 할 수 있게 했습니다.
참고로 사진에 보이는 attiny85 는 smd 타입으로 dip 타입보다 작고 가격도 조금 저렴합니다. 저는 smd 타입에 8핀 보드를 붙여서 사용하고는 합니다.
일단 이러면 코드 테스트를 위한 준비가 완료 되었습니다.
코딩을 해보자!
// this code for enter sleep mode
#include <avr/sleep.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
//setting variables
int ledPin = 0; // LED connected to digital pin 9
float timer = 2400;
float maxBrightness = 255.0;
float a = 0;
float curX = 0;
float curY = 0;
void setup() {
// 그래프의 기울기 값 계산
a = maxBrightness / (timer*timer);
}
void loop() {
curX++;
curY = a * (curX*curX);
analogWrite(ledPin, maxBrightness - curY);
if (maxBrightness - curY < 1 )
{
analogWrite(ledPin, 0);
system_sleep(); // sleep 모드 진입
}
delay(1000);
}
void system_sleep()
{
cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable();
sleep_mode(); // System sleeps here
sleep_disable(); // System continues execution here when watchdog timed out
sbi(ADCSRA, ADEN); // switch Analog to Digitalconverter ON
}
코드 위아래에 좀 눈에 익지 않은 코드가 있죠? 그 부분이 바로 sleep 모드 진입을 시키기 위한 코드입니다. attiny85 는 슬립 모드에 진입하면 놀라울 만큼 전기를 먹지 않기 때문에 아주 유용한 기능이 아닐 수 없습니다. sleep 모드에서 깨우기 위하여는 reset pin 에 GND 를 스위치 등으로 순간 연결해 주거나 전원을 껏다가 켜면 다시 최초 상태로 실행이 됩니다.
위에 타이머 부분이 전체 조명이 켜져있는 시간이되겠습니다. 다만 정확한 시간 조정은 안되고 대충 감으로 잡아야 하더군요. 현재 설정은 2400 초 인데요. 대략 40분 내외의 시간이 흐르면 소등됩니다. (한 30분 지나면 점점 어두워집니다)
loop 의 아래쪽에 현재 아날로그 출력값이 1보다 작아지면 sleep 모드로 진입하는 코드가 있고요.
그게 전부입니다. ㅋ
이제 attiny85 에 업로드를 해야하는데요.
먼저 라이브러리가 없다면 추가를 해주어야 겠죠?
구버전용 라이브러리는 직접 받으셔야 하고요. 신버전은 json 을 추가해주고 설치를 하면 됩니다.
아래 경로에서 라이브러리 설치에 대한 내용을 확인하시면 됩니다.
보드는 attiny > attiny85 1Mhz 로 선택해 주시고요.
ISP 는 Arduino as ISP 를 선택해 주시면 됩니다.
그리고 업로드 고고
Hardware 개조 타임
이제 조명을 뜯어서 기존의 LED 를 떼어내고 Attiny 와 LED 를 부착해줄 차례 입니다.
당연한 이야기지만 먼저 배터리를 제거해 줍니다.
상단의 흰색 갓은 위로 잡아 당기면 그냥 빠집니다. 꽉 끼워져 있기는 한데 본드로 붙어있는 것은 아니더군요.
아래쪽 나사를 모두 풀어주고 분리하면 위와 같은 상태입니다. 심플하네요.
스프링이 도망가지 않게 살살 열어 줍니다.
어쨌든 문제의 LED는 제거합니다.
크기도 엄청 크네요.
스위치에 붙어 있는 저항도 필요 없으니 떼어낼겁니다.
Attiny 에 배터리 (약 4.5v) 를 연결하니 전압이 불안정한지 동작이 원하는데로 되지 않아 굴러다니는 전해 콘덴서를 하나 붙여 주었습니다. 저는 50uf 를 달아 주었는데요. 적당히 아무거나 달아도 될 듯 합니다. 크기가 작아 소켓보드 아래에 쏙 들어가네요. ㅎㅎ
예전에 사두었던 LED 가 적당해 보여 달아주었습니다. 불빛도 너무 노랗지도 않고 방열판도 있으니 적당하다 생각되었습니다.
본딩을 해서 붙인뒤 고정을 위해 일단 테이프로 붙여 둡니다.
자 이제 거의 다 되었습니다.
스위치에 있는 저항을 테어내고 전선을 연결할 겁니다. 스위치로 - 가 연결되고 스위치의 다른 한쪽이 attiny 의 GND 에 연결되면 됩니다.
빨간선은 + 이므로 attiny 의 5V 에 연결합니다.
쨔잔~ 네 예쁘게 잘 들어옵니다.
Attiny 는 3M 양면 테이프로 붙여주면 완성입니다.
참고로 위와 같이 배선하시면 안됩니다. 잘못 배선한 사진인데요. LED 로 가는 굵은 빨간선이 사진상 오른쪽 맨 아래 핀에 연결이 되어야 합니다. ㅜㅜ
아래 사진에는 다시 제자리에 납땜을 했습니다.
자 이제 완성입니다.
배선에 약간 오류가 있기는 했지만 간단한 문제로 바로 해결하였습니다.
최종 결과물은?
ㅋㅋ 처음과 똑같네요. 다시봐도 그림이 너무 예쁩니다.
어쨌든 이제 아이방에 놔주기만 하면 됩니다.
음~ 마음에 드는군요.
아이도 좋다며 매일 켜고 자고 있습니다. ㅎㅎ
자동으로 소등이 되니 배터리도 많이 먹지 않고요.
만약 사용해보고 배터리를 많이 먹는다 싶으면 저항을 하나 달아줄 계획입니다. 저항은 아주 작은 용량의 저항이면 됩니다.
자 간단한 작업으로 싸구려 같은 장난감에서 고급스러운 조명 색상에 타이머 기능까지 있는 멋진 조명으로 탈바꿈 하였습니다. 여러분도 한번 도전해 보시면 어떨까요?
그럼 오늘의 포스팅을 마칩니다. ~
2022.01.31 - [DIY/Arduino] - [아두이노]NRF24L01을 이용하여 무선으로 mpu6050 신호 전달하기
2019/10/13 - [DIY] - [DIY] 아이방 수면등 만들기 (feat. 아이그림)
2020/05/17 - [DIY] - [재활용] 고장난 LED 바 수리하기 > 화장대 조명 만들기
2020/03/23 - [DIY/Arduino] - Arduino(아두이노) 무작정 시작하기
2020/10/29 - [DIY] - [DIY] 오래된 다목적 랜턴 LED 램프, 충전식으로 교체하기
'DIY > Arduino' 카테고리의 다른 글
[아두이노]2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지 (3) | 2022.01.31 |
---|---|
[아두이노] 아날로그 핀으로 stepper moter 를 돌려보자 (2) | 2021.04.17 |
C# 에서 아두이노로 시리얼 통신 하기 (0) | 2020.06.29 |
[DIY] 아두이노로 통합(만능) 리모콘 만들기 3/3 (4) | 2020.06.17 |
0.96 inch OLED 디스플레이 구동하기 (0) | 2020.05.26 |