The purpose of this device is a bit evil. Oh well, sue me. I made it as a yoke for the first of april and many more days to come.
A brief description:
The device beeps a short beep of a very annoying frequency in random times. The time between beeps is anywhere within half an hour to nine hours.
Point:
The subject of your devious device has a flat/house. Put the beeper inside the house, and when the first beep occurs, your victim will just wonder about that what was it. When it occurs again and again he will try to locate the source. After checking all cellphones, smokealarms, battery powered devices in general he will be clueless as to what is causing this. The beeping will be a mystery as long as the battery lives. Or it will drive him nuts.
Instruction:
1. Activate the device
2. Hide the device
3. Don't stay around to watch the fun.
It beeps in random. Where the time between beeps can be anything from 30minutes, to 9hours and 30minutes.
Hardware:
The hardware is boringly simple. One piezotransducer, one battery, one AVR. All packed like you choose it. Here's the schematic:
A sample of how you can make it is here:
As you can see my main point is always functionality. Not decoration. But there's a gazilion other ways you can make the device.
Firmware:
I release the firmware under GNU. In the project folder, which you can download on the bottom of the page is a precompiled hex file which worked for me.
/* Copyright David Gustafik, 2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include <avr/io.h> #include <avr/interrupt.h> #include <compat/deprecated.h> #include <stdlib.h> /* (to be used on first of april, or whenever in an evil mood (for me 24/7)) by David 'daqq' Gustafik The Beeper of Madness: Beeps a short beep of very annoying frequency in random times. Beeps occur randomly within half an hour to nine and a half hour. Instruction: 1. Activate the device 2. Hide the device 3. Don't stay around to watch the fun. Point: The subject of your devious device has a flat/house. Put the beeper inside the house, and when the first beep occurs, your victim will just wonder about that what was it. When it occurs again and again he will try to locate the source. After checking all cellphones, smokealarms, battery powered devices in general he will be clueless as to what is causing this. The beeping will be a mystery as long as the battery lives. Or it will drive him nuts. WARNING: This software is provided as is without any waranties at all. The author is not responsible for any injuries/material damage that may arise from the usage of this software/device README: The hex file you received with the zip file that contained this file is calibrated for a ATTiny2313 running on the internal oscilator @ 4MHz and with the CKDIV8 fuse enabled. Therefore the processor is running at 500kHz. */ #define SERIAL_NUMBER 1 //this is the seed for the random number generator. you may either use my //serial number (1) or recompile it (unadvised) with your own. //defs #define BUZZER1() {sbi(PORTB,0);cbi(PORTB,1);} #define BUZZER0() {cbi(PORTB,0);sbi(PORTB,1);} #define BEEP_INTERVAL 0.08 #define BEEP_LENGTH 2500 #define nop() asm volatile ("nop;") //globals volatile unsigned int rand_cond=0; volatile unsigned int rand_box=0; //functions void beep(void); void wait(unsigned int a); #define _ms(x) x*45 //timer overflow interrupt. occurs each 0.5seconds. ISR(TIMER0_OVF_vect) { rand_box++; return; } int main(void) { DDRD = 0x00; DDRB = _BV(1) | _BV(0); ACSR=0x80;//disable power to the analog comparator TCCR0B=0x05; TIMSK = 0x02; srand(SERIAL_NUMBER); wait(_ms(100)); beep(); sei(); while(1) { if(rand_box==rand_cond) { rand_box=0; rand_cond=rand()%(0xFFFF-1000)+1000; beep(); } } } void beep() { unsigned int temp; for(temp=0;temp!=BEEP_LENGTH;temp++)//does the beeping on the piezo. { BUZZER0(); wait(_ms(BEEP_INTERVAL)); BUZZER1(); wait(_ms(BEEP_INTERVAL)); } return; } void wait(unsigned int a) { unsigned int b,c; for(b=0;b!= a; b++)for(c=0;c!= 5;c++) nop(); return; }
The code is boringly simple. You'll need an AVR running @ 4MHz with the CKDIV8 fuse enabled. This way, the device eats only 200uA (microamps) and can last long out of a lithium battery, like the one on the pictures.This is the configuration of your fuses to run this:
Download:
Download the project folder here:
NOTE: If you make this device I ask nothing in return, just PLEASE take a photo of it and post it into my forum. That's all I ask.
Mods
A number of people built this device. Macsek, a fine guy from Hungary improved my original device by using a smaller AVR (Tiny13) and made smaller version, easier to conceal.
Here's the photo and the source:
/* Copyright David Gustafik, 2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA date modified by change ---------- -------------------------- ---------------------------- 2007.03.27 Macsek mmx233@gmail.com Added Tiny13 support */ #include <avr/io.h> #include <avr/interrupt.h> #include <compat/deprecated.h> #include <stdlib.h> /* (to be used on first of april, or whenever in an evil mood (for me 24/7)) by David 'daqq' Gustafik The Beeper of Madness: Beeps a short beep of very annoying frequency in random times. Beeps occur randomly within half an hour to nine and a half hour. Instruction: 1. Activate the device 2. Hide the device 3. Don't stay around to watch the fun. Point: The subject of your devious device has a flat/house. Put the beeper inside the house, and when the first beep occurs, your victim will just wonder about that what was it. When it occurs again and again he will try to locate the source. After checking all cellphones, smokealarms, battery powered devices in general he will be clueless as to what is causing this. The beeping will be a mystery as long as the battery lives. Or it will drive him nuts. WARNING: This software is provided as is without any waranties at all. The author is not responsible for any injuries/material damage that may arise from the usage of this software/device README: The hex file you received with the zip file that contained this file is calibrated for a ATTiny2313 running on the internal oscilator @ 4MHz and with the CKDIV8 fuse enabled. Therefore the processor is running at 500kHz. */ //#define DEBUG #ifdef DEBUG // can be enabled only if DEBUG is set #define DEBUG_ONSCREEN #endif #define SERIAL_NUMBER 1 //this is the seed for the random number generator. you may either use my //serial number (1) or recompile it (unadvised) with your own. //defs #ifdef __AVR_ATtiny13__ #define BUZZER1() {sbi(PORTB,3);cbi(PORTB,4);} #define BUZZER0() {cbi(PORTB,3);sbi(PORTB,4);} #elif defined __AVR_ATtiny2313__ #define BUZZER1() {sbi(PORTB,0);cbi(PORTB,1);} #define BUZZER0() {cbi(PORTB,0);sbi(PORTB,1);} #endif #define BEEP_INTERVAL 0.08 #define BEEP_LENGTH 2500 #define nop() asm volatile ("nop;") //globals volatile unsigned int rand_cond=0; volatile unsigned int rand_box=0; //function prototypes void beep(void); void wait(unsigned int); void tone(unsigned int, unsigned int); #define _ms(x) x*45 //timer overflow interrupt. occurs each 0.5seconds. #ifdef __AVR_ATtiny13__ ISR(TIM0_OVF_vect) #elif defined __AVR_ATtiny2313__ ISR(TIMER0_OVF_vect) #endif { rand_box++; #ifdef __AVR_ATtiny13__ // alive flashing led on timerIT if(rand_box&1) sbi(PORTB,0); else cbi(PORTB,0); #endif return; } int main(void) { #ifdef __AVR_ATtiny13__ DDRB = _BV(3) | _BV(4)|_BV(0); // output on pin 2&3 so no interaction w/SPI nor RESET ACSR = _BV(ACD); //disable power to the analog comparator TCCR0B=_BV(CS02) | _BV(CS00); // CLK_IO/1024 TIMSK0 = _BV(TOIE0); // Timer 0 Overflow Interrupt Enable #elif defined __AVR_ATtiny2313__ DDRD = 0x00; DDRB = _BV(1) | _BV(0); ACSR=0x80;//disable power to the analog comparator TCCR0B=0x05; TIMSK = 0x02; #else // other types could be tested here DDRD = 0x00; DDRB = _BV(1) | _BV(0); ACSR = _BV(ACD); //disable power to the analog comparator TCCR0B=_BV(CS02) | _BV(CS00); // CLK_IO/1024 TIMSK = _BV(TOIE0); // Timer 0 Overflow Interrupt Enable #endif srand(SERIAL_NUMBER); // wait(_ms(100)); beep(); wait(_ms(1000U)); int i,j; //for(i=) BEEP_INTERVAL 0.08 #define BEEP_LENGTH 2500 sei(); while(1) { if(rand_box==rand_cond) { rand_box=0; #ifdef DEBUG rand_cond=rand_box+60; //30sec #else rand_cond=rand()%(0xFFFF-1000)+1000; #endif beep(); } } } void beep() { unsigned int temp; for(temp=0;temp!=BEEP_LENGTH;temp++)//does the beeping on the piezo. { BUZZER0(); wait(_ms(BEEP_INTERVAL)); BUZZER1(); wait(_ms(BEEP_INTERVAL)); } return; } void tone(unsigned int freq, unsigned int len) { while(len--) { BUZZER0(); wait(_ms(len)); BUZZER1(); wait(_ms(len)); } } void wait(unsigned int a) { unsigned int b,c; #ifndef DEBUG_ONSCREEN for(b=0;b!= a; b++) for(c=0;c!= 5;c++) nop(); #endif return; }