It use ATtiny13 AVR microcontroller and software PWM to slowly fade wings on and off.
First i made paper crane and the rest is copy-paste basic forms. The basic shapes are actually simple and flat. The most difficult part is soldering SMD components.
All electronics and batterys (4 x AA) are in the bottom wooden box.
/**
*
* Hardware ATtiny13
* Software Arduino IDE 1.8.10, Arduino as ISP, MicroCore
* Clock 9.6Mhz
*
* Author Tauno Erik
* Date 29.11.2019
*
*
*/
/* ATtiny13 pins
*
* Reset-ADC0-5/A0-PCINT5-PB5-| U |-VCC
* CLKI-ADC3-3/A3-PCINT3-PB3-| |-PB2-PCINT2-2/A1-SCK-ADC1
* ADC2-4/A2-PCINT4-PB4-| |-PB1-PCINT1-1-MISO-OC0B-INT0
* GND-|___|-PB0-PCINT0-0-MOSI-OC0A
*/
//#define F_CPU 9.6E6L
#include <avr/io.h>
#include <util/delay.h>
#define WING_UPPER PB2
#define WING_MIDDLE PB3
#define WING_LOWER PB0
#define BODY PB4
#define FADE_TIME 1024
#define PAUSE 10
void set_pin_high(byte pin) {
PORTB |= (1 << pin); // or PORTB |= _BV(pin);
}
void set_pin_low(byte pin) {
PORTB &= ~(1 << pin); // or PORTB &= ~_BV(pin);
}
void fade_in(int ftime, byte pin) {
unsigned int d_max = ftime;
for (int i = 1; i < ftime; i++) {
set_pin_high(pin);
_delay_loop_2(i);
set_pin_low(pin);
_delay_loop_2(d_max - i); // 1
}
set_pin_high(pin);
}
void fade_out(int ftime, byte pin) {
unsigned int d_max = ftime;
for (int i = 1; i < ftime; i++) {
set_pin_low(pin);
_delay_loop_2(i);
set_pin_high(pin);
_delay_loop_2(d_max - i); // 1
}
set_pin_low(pin);
}
void fade_out_in(int ftime, byte pin_out, byte pin_in) {
unsigned int d_max = ftime;
for (int i = 1; i < ftime; i++) {
// out:on in:off
set_pin_high(pin_out);
set_pin_low(pin_in);
_delay_loop_2(d_max - i);
// out:off in:on
set_pin_low(pin_out);
set_pin_high(pin_in);
_delay_loop_2(i);
}
set_pin_low(pin_out);
}
int main(void)
{
/* setup */
// set pins as OUTPUT
DDRB |= _BV(WING_UPPER); // sama mis DDRB |= (1 << PB2);
DDRB |= _BV(WING_MIDDLE);
DDRB |= _BV(WING_LOWER);
DDRB |= _BV(BODY);
// set pin to HIGH
PORTB |= _BV(WING_UPPER);
PORTB |= _BV(WING_MIDDLE);
PORTB |= _BV(WING_LOWER); */
/* Fade in Body */
delay(500);
fade_in(FADE_TIME, BODY);
byte first_time = 1;
/* loop */
while (1) {
if(first_time){
fade_in(FADE_TIME, WING_UPPER);
_delay_loop_2(PAUSE);
first_time = 0;
} else {
fade_out_in(FADE_TIME, WING_UPPER, WING_MIDDLE);
_delay_loop_2(PAUSE);
fade_out_in(FADE_TIME, WING_MIDDLE, WING_LOWER);
_delay_loop_2(PAUSE);
fade_out_in(FADE_TIME, WING_LOWER, WING_MIDDLE);
_delay_loop_2(PAUSE);
fade_out_in(FADE_TIME, WING_MIDDLE, WING_UPPER);
_delay_loop_2(PAUSE);
}
}
return 0;
}
Wow, looks great! The double-row construction gives it a wonderful look.