Posted: 30 Sept. 2017
Last Updated: 30 Sept. 2017
Related Articles:
Other Articles:
(*Articles containing or linking to source code are marked with an asterisk)
- How to make a Linux Live USB with a 2nd, Windows-readable partition for storage
- Computa Pranksta USB Mouse & Keyboard Device User Manual
- *Arduino (ATmega328) Direct Register Manipulation for Custom PWM Output (ex: 1us HIGH followed by 99us LOW --> 1% Duty Cycle at 10kHz)
- *MAX5481 10-bit Digital Potentiometer Arduino Code
- Eagle PCB CAD - How to copy a part from one schematic to another
- *Arduino-like millisecond (ms) and microsecond (us)-resolution timestamps in Python: millis(), micros(), delay(), & delayMicroseconds()
- BattleBots Season 2 "Buzz" Fire Drone for Team Caustic Creations, with Team Interviews & fire-shooting Videos
- *The Power of Arduino
- Restoring/Recharging Over-discharged LiPo (Lithium Polymer) Batteries!
- Parallel Charging Your LiPo Batteries
- *Using the Arduino Uno’s built-in 10-bit to 16+-bit ADC (Analog to Digital Converter)--an Article on Oversampling
- Beginner RC Airplane Setup
/*
lookup_table_sine_wave_arduino_siren.ino
- play a frequency-varying sine wave in a piezo buzzer
- Published: http://www.electricrcaircraftguy.com/2017/10/arduino-sine-wave-siren-code.html
By Gabriel Staples
www.ElectricRCAircraftGuy.com
Written: 5 Nov. 2015
Last Updated: 30 Sept. 2017
Update History (newest on TOP):
- 30 Sept. 2017: cleaned up code so I can share it on my website
- 20 Jan 2016: modified code to use ToneAC to dual drive a 120W peak/60W
RMS speaker through a high-power H-bridge I made
- 5 Nov. 2015: first version, uses built-in Arduino tone() function:
https://www.arduino.cc/en/Reference/Tone
References:
-http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml
-https://www.arduino.cc/en/Reference/Tone
-https://en.wikipedia.org/wiki/Siren_(alarm)
Libraries needed:
-ToneAC: http://playground.arduino.cc/Code/ToneAC
*/
//Includes
#include <avr/pgmspace.h> //http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
#include <toneAC.h> //plays on pins 9 & 10 for ATmega328
//Global vars & consts
byte sirenVolume = 1; //for ToneAC; from 0-10
const unsigned int SIREN_SLOW = 25000; //us; desired delta time between siren freq updates
const unsigned int SIREN_FAST = 5000; //us
unsigned int sirenPeriod = SIREN_SLOW; //us
//sine wave lookup table to produce the siren sound
static const unsigned int sineLookupTable[] PROGMEM =
{
//Sine wave lookup table generator:
// - http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml
//Number of points: 256
//Max Amplitude: 255
//Numbers per row: 8
//Decimal
128,131,134,137,140,143,146,149,
152,155,158,162,165,167,170,173,
176,179,182,185,188,190,193,196,
198,201,203,206,208,211,213,215,
218,220,222,224,226,228,230,232,
234,235,237,238,240,241,243,244,
245,246,248,249,250,250,251,252,
253,253,254,254,254,255,255,255,
255,255,255,255,254,254,254,253,
253,252,251,250,250,249,248,246,
245,244,243,241,240,238,237,235,
234,232,230,228,226,224,222,220,
218,215,213,211,208,206,203,201,
198,196,193,190,188,185,182,179,
176,173,170,167,165,162,158,155,
152,149,146,143,140,137,134,131,
128,124,121,118,115,112,109,106,
103,100,97,93,90,88,85,82,
79,76,73,70,67,65,62,59,
57,54,52,49,47,44,42,40,
37,35,33,31,29,27,25,23,
21,20,18,17,15,14,12,11,
10,9,7,6,5,5,4,3,
2,2,1,1,1,0,0,0,
0,0,0,0,1,1,1,2,
2,3,4,5,5,6,7,9,
10,11,12,14,15,17,18,20,
21,23,25,27,29,31,33,35,
37,40,42,44,47,49,52,54,
57,59,62,65,67,70,73,76,
79,82,85,88,90,93,97,100,
103,106,109,112,115,118,121,124,
};
//calculate the length of the lookup table above
const unsigned int NUM_SINEWAVE_ELEMENTS = sizeof(sineLookupTable)/sizeof(unsigned int);
//Function declarations/prototypes
void playSirenSound(byte volume = 1, unsigned int period_us = SIREN_SLOW);
//Function definitions:
//-------------------------------------------------------------------------------------------------
//setup
//-------------------------------------------------------------------------------------------------
void setup()
{
Serial.begin(115200);
Serial.println(F("begin"));
//FOR DEBUGGING
Serial.print(F("NUM_SINEWAVE_ELEMENTS = ")); Serial.println(NUM_SINEWAVE_ELEMENTS);
}
//-------------------------------------------------------------------------------------------------
//loop
//-------------------------------------------------------------------------------------------------
void loop()
{
playSirenSound();
//OR
// playSirenSound(sirenVolume, sirenPeriod);
}
//-------------------------------------------------------------------------------------------------
//playSirenSound
//-------------------------------------------------------------------------------------------------
void playSirenSound(byte volume, unsigned int period_us)
{
//local vars
static unsigned long t_start = micros(); //us
unsigned long t_now = micros(); //us
if (t_now - t_start >= period_us)
{
t_start = t_now; //us; update
static unsigned int sirenIndex = 0;
//look up value in lookup table
// - NB: pgm_read_word is for reading 2 byte values,
// pgm_read_byte is for reading 1 byte values
unsigned int freq = pgm_read_word(sineLookupTable + sirenIndex);
sirenIndex++;
if (sirenIndex >= NUM_SINEWAVE_ELEMENTS)
sirenIndex = 0; //start back at beginning of sine wave
toneAC(freq+635, volume);
}
}
END
Keywords: Arduino nano, H-bridge, audio, speaker, siren, siren sound, police siren, lookup table, sine wave lookup table, AVR PROGMEM, AVR-LibC, toneAC
This comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
ReplyDelete