Pov Spinner
So i was thinking: let's make something obvious.
This instructable is on making a spinner with a persistence of vision illusion inside.
Parts and Wiring
- ATtiny 45 ic
- 5 smd led (1206)
- 5 smd resistor (47 Ohm)
- 2 small pieces of pcb
- 1 coin battery (3v - 16mm)
- 8 pieces of metal (for balance)
- a piece of mdf (3mm) for the spinner itself
- a 22mm metal ball-bearing (center)
The wiring is pretty straight forward. I followed the datasheet from Atmel (see screenshot above)
- The positive pins on the led go to PB0 - PB4 on the ic. I added a resistor in between.
- negative pins go to GND.
- Power the ic by connecting the battery to VCC and GND.
Programming the Ic
In order to put code on the Attiny we need to follow a few steps:
- Upload the 'ArduinoISP' example to the Arduino board ( located in the examples folder)
- In Arduino preferences point to https://raw.githubusercontent.com/damellis/attiny... or look for attiny library (by David A. Mellis) and install it
- In Tools> programmer select the ‘Arduino as ISP’ option
- Attiny 45 runs on 1 Mhz but can be changed under ’Tools’. That's a bit to slow for persistence of vision: change it to 16 Mhz (normal clock on a regular Arduino)
- If you do the previous step you have to burn the boot loader. (Tools > burn bootloader)
- wire the Attiny to the Arduino board (see this page for the exact wiring or look at screenshot above). You also need a 10 uF capacitor between reset and ground to avoid reset (and starting the bootloader)
- upload the code below to the attiny.
- done.
arduino / attiny code from the spinner:
<p>int letterSpace;<br>int dotTime;</p>byte invader[] = {1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0}; byte invader2[] = {0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1}; int amount = 12; void setup() { // setting the ports of the leds to OUTPUT pinMode(0, OUTPUT); pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); letterSpace = 2; dotTime = 1;<br>}<br>
void printImage(byte pix[]){ int y, i; // image for (i = 0; i < amount; i++) { for (y = 0; y < 5; y++) { digitalWrite(y, pix[y + (i * 5)]); } delay(dotTime); } // space between images for (y = 0; y < 5; y++) { digitalWrite(y, 0); } delay(letterSpace); }
void loop(){ printImage(invader); printImage(invader2); }
Downloads
Simple Spinner Images
create images
The spinner needs an image to display so i've made a small browser page to create sequences / images for the spinner. (attached as file)
It has an interface of multiple input tags (type: checkbox) and two functions: one to create a new column and one to create the sequence of 0 and 1.
My son (6) had a good time making some invader like sequences.
js:
var start = 8; // start with 8 columns // a function to create a column of inputs. i have 5 led in the spinner.. function makeColumn() { var box = document.createElement("div"); box.id = "col"; // check css for styling. for (var i = 0; i < 5; i++) { var input = document.createElement("input"); input.type = "checkbox"; box.appendChild(input); } document.body.appendChild(box); }
// function attached to load event. Creates the buttons and the columns based on the amount stored in start variable function create() { var b = document.createElement("button"); b.innerHTML = "create"; b.addEventListener('click', generate); document.body.appendChild(b); var b2 = document.createElement("button"); b2.innerHTML = "add row"; b2.addEventListener('click', addNew); // event for adding a new column document.body.appendChild(b2); var input = document.createElement("p"); input.id = "result"; document.body.appendChild(input); for (var i = 0; i < start; i++) { makeColumn(); } }
// adds a new column function addNew() { makeColumn(); start++; }
// function to generate the sequence of 0 and 1 function generate() { var inputs = document.querySelectorAll("input"); var result = []; for (var i = 0; i < inputs.length; i++) { var r = inputs[i].checked ? 1 : 0; result.push(r); } var pusher = document.querySelector("#result"); pusher.innerHTML = result; } // start everything when page is loaded. window.addEventListener('DOMContentLoaded', create);
css:
#col { display: inline-block; }
input { display: block; -webkit-appearance: none; width: 20px; height: 20px; background: black; margin: 1px 1px 0; }
input:checked { background: yellow; }
The spinner itself was made with NodeBox 3 - an interesting tool for design. The svg output is included.