The homepage of David 'daqq' Gustafik
Sanity nullifier

The Sanity nullifier

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:

Schematic

A sample of how you can make it is here:

photo

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:

ponyprog

Files:

DOWNLOAD PROJECT FOLDER (EVERYTHING AROUND 100kB)

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:

macske

/*
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;
}

 
bottombar