Introduction: 3 Easy ATTiny Holiday Gifts
Every year the holiday season rolls around and I get stuck on what to give for my friends and family. People always say that it's better to make the gift yourself than buy it at a store so this year I did just that. The first displays a name or basic image when waved through the air, the second fades smoothly between two white led's (It also has a safety pin to attach it to clothes or a purse), and the third is a mood light of sorts, scrolling seamlessly between colors. All are under $15 and are easy to assemble in less than an hour. You could also give these instructions as well as parts as a gift to someone interested in learning electronics.
Note: A basic level of soldering is assumed. However, unlike my previous instructable I will glossover how to program an AVR. I really hope that this helps people who are trying to get started in electronics. I remember when I was there and will be happy to take any questions you may have. Remember there are no stupid questions! I have left it open to you to determine how you will lay out your circuit board in hopes that you will come up with a new way of displaying the simple circuits I have drawn out. Please post pictures once you are done, I can't wait to see what you come up with!
Parts for All of the Projects
N = number of projects
xN ATTiny45 (www.digikey.com)
xN 8-pin DIP socket (RadioShack)
x 1 Large Perf Board (I got mine at RadioShack)
xN 3v Coin CellBattery and holder (RadioShack)
x1 Programmer (I use this and the supplied makefile will be configured to use this one)
x2N Resistors, one 10 ohm and one 10k ohm (RadioShack)
Here's a picture of the three completed projects:
Step 1: The Name Flasher
x5 DIFFUSED 3mm LED's (RadioShack)
This project uses persistence of vision to display an image or text when moved rapidly. It works better when it's dark. With the AVR we are switching between LED's faster then the eye can see we can create a picture in the air with very few components.
The Code: (Download the .zip file at the bottom of the page for the code, makefile, etc. (That code does not have the extensive comments that this code does but if this code doesn't work, try the one in the zip file))
Now follow the instructions on page 4 to compile this code and send it to your AVR.
Attachments
Step 2: The Purse Light
Other Parts
x2 LED's NON DIFFUSED (RadioShack)
This project fades smoothly between two LED's. My mom wanted something to go on her purse to help her bee seen at night. I felt like a flashing bike light would draw too much attention so I made this.
It uses PWM (Pulse Width Modulation) to give the effect of dimming and brightening. What is actually happening is the led is flashing faster than the eye can see at varying intervals to simulate a change. You can see this more clearly when you wave it in of your face as you would with the Name Flasher. The code can be downloaded at the end of this page. See page 4 on how to compile to your AVR.
Instead of commenting the code here I'll briefly explain the concept. PWM is generated by a timer. Each clock cycle the timer counts up one. When it reaches a certain value (In this case OCR1B) it changes the state of a pin (In this case OC1B). To get the LED's to "switch off" I wired the other one to [OPPOSITE]OC1B (That's what the bar across the top means). Then we use x to increment and decrement the amount of time for the LED's to be on.
Attachments
Step 3: The Color Scroller
Other Parts
x1 RGB LED (diffused is better) (RadioShack)
This to me is a classic. I have always been fasinated by lights like this and find them very calming so naturally I wanted to make one. Also their visibility in society gives them a real WOW factor. "You MADE that?!"
The code is nearly the same and, in my opinion, easier to read. You can download the at the bottom. This time we provide a PWM'd pin for each grounding pin on the RGB LED. In this way we ground through the chip. Volts can be measured as the difference between two points.
3v-0v=3v
5v-2v=3v
***3v-3v=0v***
This last instance is what we are doing when we ground through the chip. When there are three volts on both sides, per say, there are not enough volts to drive a LED. So to fade between colors we chose a color and another color. Set one equal to x and the other equal to 255-x or the INVERSE of x. Like we were doing in the previous project. Now go to step 4 to program.
Attachments
Step 4: Programing
First download and install Emacs, avr-gcc, and Avrdude and any dependancies they might have. On Arch linux I did this with: sudo pacman -Sy emacs avrdude
Now it's time to hook up your programmer to your avr. Wire the pins on the 6-pin ISP programmer (picture below) to the corosponding pins on your AVR (Datasheet, page 2)(I did this on a breadboard). Now plug in the programmer to your computer and VERY QUICKLY touch the top of the AVR. If it is hot, REMOVE THE PROGRAMMER FROM YOUR COMPUTER AT ONCE check your connections and try again (Power and Gnd backwards?). If it is not hot then open emacs and press Ctl-x Ctl-f to find the .c file. Open it and then press Meta(Usualy Alt)-x and type compile. Press enter twice and if you are lucky your AVR should now be running your code!
Thanks for reading! I hope you enjoyed it and learned something. Please, don't hesitate to ask questions and don't forget to post pics of what you come up with. Happy holidays and don't forget to vote!

Participated in the
Homemade Holidays Contest
45 Comments
8 years ago on Step 3
Nice DIY project. :) Can be ATTINY45 programmed via the Arduino?
Reply 6 years ago
yes.
(realize post is 2 years old, posting for others who scroll by... like you)
6 years ago
Hy , if you help me , can you give the code to write STF with PORTB , I would be grateful ! Thanks!
8 years ago on Step 4
Very nice projects ...thanks for sharing .
Build_it_Bob
8 years ago
Cool!
8 years ago
Thanks:D
8 years ago on Introduction
where do you write the code sorry im new to AVRs
Reply 8 years ago on Introduction
I generally write in good old emacs when I'm on a *nix system, though I am partial to Sublime Text 2. Neither are IDEs.
9 years ago on Introduction
Hi!
First of all nice tutorial!
But I have one question, it is written in the Attiny45 datasheet that it has only 2 PWM pins, am I misunderstanding something?
Have a nice day!
Reply 9 years ago on Introduction
*Note: OC stands for output compare. In the datasheet it says that the 2nd T/C has separate Output Compare Registers. This is what's really important to us. One output compare reg. gets us one easy channel of PWM.
Reply 9 years ago on Introduction
Yep, that'a a little tricky. In the data sheet it says there's a Timer/Counter that has 2 PWM outputs. But, if you look right underneath that, there's the High-Speed T/C. This T/C can also do PWM on some other pins.
In general, I look at the pinout and see how many pins have a separate OC** designator, as those are the pins that can be used for PWM.
Cheers!
11 years ago on Introduction
Great instructable!
This evening i got the rgb scroller working with the abby version, and i got an idea for a mod.
My idea is to read a 10 k potentiometer and to select a color based on the value.
So if the potentiometer is a 10 bit value i could break the value in blocks of three that'll be the codes for the color components, and if the last bit is set it scrolls through colors.
I'm loosing some resolution there, but it's ok.
I'm just starting to work with microcontrollers and i have had experience only with arduino so far. What do you think, could this work?
Can you give me some advice on how to proceed?
Reply 11 years ago on Introduction
I think this could work. If you didn't mind (relatively) low resolution you could use the number from the adc to specify where in the code you are and have the code be near the same as I have already written. Since you're good with arduino I'd try out your ideas there and then translate them into code for the attiny45.
Reply 11 years ago on Introduction
can you give the code for writting robot
Reply 11 years ago on Introduction
I'm not sure what you mean by that statement. Could you explain?
Reply 11 years ago on Introduction
as you rote zoe with pov can you give the code to write robot with pov
Reply 11 years ago on Introduction
It would look something like this:
00011111
00000101
00011010
00011111
00010001
00011111
00011111
00010101
00001010
"o" again
00000001
00011111
00000001
Reply 10 years ago on Introduction
lol thank you
Reply 11 years ago on Introduction
I'm having some trouble modifying the code. If i try something like y=bright(); the hex file gets almost 10 times bigger and i get the following
>>avrdude: ERROR: address 0x1010 out of range at line 257 of new.hex
Can I use the adc value directly or am I missing something? I'd like to change the wait time with a pot so i could "freeze" a color or fast forward if i don't like it
Sorry if this is a noob question, but i haven't got much experience with microcontrollers.
Thank you!
Reply 11 years ago on Introduction
I'm not sure why "y = bright();" would kill the hex file. You will need to change the bright() function so that if the pot at a certain point stops the cycle. Something like this:
char bright()
{
....
....
(just before the return statement)
while(adc <= 1); //This'll do nothing while the adc is less than 1
...
You'll need to change the "_delay_ms(y);" to "_delay_ms(bright());"