Some ideas that come to mind:
sample based instrument- store samples on the Arduino or on an SD card and trigger playback with buttons or other types of controls. Check out my Arduino drum sampler for an idea of how to get started.
digital synthesizer- make saw, sine, triangle, pulse, or arbitrary waveshapes- check out my waveform generator to get started
MIDI to control voltage module/ MIDI synthesizer- receive MIDI messages and translate them into a voltage so you can control an analog synthesizer with MIDI, or use the MIDI data to output audio of a certain frequency
analog output- you may find yourself needing to generate analog voltages from your Arduino at some point, maybe to communicate with an analog device
effects box/digital signal processing- in combination with a microphone/audio input you can perform all kinds of digital signal manipulations and send the processed audio out to speakers. Check out my vocal effects box for an example.
audio playback device- make your own ipod. With the addition of an SD shield you could create your own Arduino mp3 player (check out the wave shield documentation for an idea of how to get started with the code). The circuits and code provided here are compatible with SD shields that communicate via SPI.
Feel free to use any of the info here to put together an amazing project for the DIY Audio Contest! We're giving away an HDTV, some DSLR cameras, and tons of other great stuff! The contest closes Nov 26.
Parts List:
(x9) 1/4 Watt 20kOhm Resistors Digikey 0KQBK-ND
(x7) 1/4 Watt 10kOhm Resistors Digiikey CF14JT10K0CT-ND
(x2) TS922IN Digikey 497-3049-5-ND I like these because they can be powered off the Arduino's 5V supply (one 924 works too, but they don't seem to be available on digikey at the moment)
(x1) 10kOhm potentiometer linear Digikey 987-1308-ND
(x1) 0.01uF capacitor Digikey 445-5252-ND
(x1) 220uF capacitor Digikey P5183-ND
(x1) 0.1uF capacitor Digikey 445-5303-ND
(x1) 1/4 Watt 3kOhm Resistor Digikey CF14JT3K00CT-ND
(x1) 1/4 Watt 10Ohm Resistor Digikey CF14JT10R0CT-ND
(x1) Arduino Uno Sparkfun DEV-09950
Additional Materials:
22 Gauge Wire
solder
Remove these ads by
Signing UpStep 1: Digital to Analog Converter
The resistor ladder I'll be demonstrating in this tutorial is an 8-bit DAC, this means it can produce 256 (2^8) different voltage levels between 0 and 5v. I connected each of digital pins 0-7 to each of the 8 junctions in my 8 bit DAC (shown in figs 1 and 3).
You can also use an external DAC chip to perform digital to analog conversion. These chips receive digital serial data from the Arduino and output a voltage. If you are short on digital I/O pins or if you want higher fidelity digital to analog conversion, a DAC chip may be a good solution for you. I like to use the R2R ladder because it's easily sourced (you probably already have all the resistors), cheap, easy to address in the Arduino code, fast, and it does a surprisingly good job for what it is. There seems to be kind of a misconception abut 8 bit audio- that it always has to sound like the sounds effects from a Mario game- but 8bit audio with this really basic DAC can actually replicate the sounds of people's voices and instruments really well, I'm always amazed at the quality of sound that can come from a bunch of resistors.















































Visit Our Store »
Go Pro Today »




TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 49;
TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << CS11);
TIMSK1 |= (1 << OCIE1A);
and changing the ISR to ISR(TIMER1_COMPA_vect) ?
which code are you talking about? which step?
I want to use your project as a basis for my midi guitar. Where do i plug my oscilloscope probe to see if the signal is now digital?
How can i do to play in the output (speaker) my voice with a delay?
Like a 3sec ou 5sec delay...
I don't know how to do it in arduino.
I want to do a digital low pass filtering before putting the signal in the DAC.
I am not quite sur how to handle it in arduino.
Since the most simple form of a low pass filter is
T*ds/dt+s(t)=K*e(t) e : signal to process
s : output signal
T : Time constant
K : Gain filter
I was thinking about doing something like :
int incoming;
void setup(){}
void loop()
{ e = analogRead(A0);
for (byte j=0; j { s[j+Δt] = K*e[j]*Δt/T + s[j](1-Δt/T) }
}
Δt is the sampling rate
But how can I define the upper limit ( N ), since the arduino is constantly reading value from A0 ?
Thanks
this is what I'm thinking:
lastOutput = output;//record the last thing you output
incoming = analogRead(A0);//get new value
output = lastOutput + (1-c*(abs(incoming-lastOutput))*(incoming-lastOutput);//where 0<=c*(abs(incoming-lastOutput))<1
PORTD = output;//send to DAC
not sure if this is quite it, just an idea off the top of my head, but some really interesting ideas here, I may have to experiments with it a little myself... let me know how it works out!
I don't understand the line :
output = lastOutput + (1-c*(abs(incoming-lastOutput))*(incoming-lastOutput) ;
How did you come up with it ?
And how is this changing the slew rate ?
http://en.wikipedia.org/wiki/Low-pass_filter#Algorithmic_implementation
basically you would have:
lastOutput = output;//record the last thing you output
incoming = analogRead(A0);//get new value
output = lastOutput + c*(incoming-lastOutput);//where 0PORTD = output;//send to DAC
does it make sense how I got this from the wiki article? specifically from this part:
"for i from 1 to n
y[i] := y[i-1] + α * (x[i] - y[i-1])"
as for the slew rate stuff, the slew rate is the maximum change in voltage over time of a component. So if you put a pulse signal into a component, you can measure the slew by looking at how long it took the component to output the change in voltage. low pass filtering relates to slew rate because the effect of a low pass filter is to slow down the rate of change of a signal (dv/dt). it;s a little different than slew bc slew often only effects the max dv/dt, anything under this max is unaffected, but filter effects all dV/dt, but dampens higher dv/dt more. does that make sense?
this pic might help:
http://en.wikipedia.org/w/index.php?title=File:Slew-rate.svg&page=1
this is the effect of low slew rate on a pulse, with lp filtering the output would follow the same general shape, but will have exponential curves in its transitions:
http://en.wikipedia.org/wiki/File:Raised-cosine-filter.png
I'll try the code within the next couple of weeks. I will keep you in the loop !
Thank you SO much again.
-frequency response- they cut out the higher frequency components of a signal- this is a much more analytical approach, but it is very hard to implement in code, as it requires an fft of the signal
-waveshaping- they smooth out large changes in dv/dt. This way of thinking about low pass filtering makes them much simpler to implement in your code because you only need to store two data points and do some simple math to get the slope
yes I'm really interested to hear the result, definitely keep me posted!
good luck!
lastOutput = output;//record the last thing you output
incoming = analogRead(A0);//get new value
output = lastOutput + c*(incoming-lastOutput);//where c is between 1 and 0
PORTD = output;//send to DAC
PS: I'm trying to do the Input and output Instructables togheter, in other words: Talk on the mic->ADC->DAC->Speakers.
Can someone help-me with this?
Thanks
22k will be ok for testing purposes, but when you solder this together I'd recommend getting the 20k. If you read my Arduino Audio Input tutorial you can get some info about how to set up the mic input circuit. The code for mic->ADC->DAC->speakers is at the bottom of step 6 of my audio input tutorial: here.
hope that helps you get started!
Personally, I never really bother with this, I guess the 8-bit R2R DAC is fun for me because it's such a lo-fi solution for generating audio, so I don't worry too much about making it perfect. I kind of accept that each one just ends up with its own unique idiosyncrasies. If I wanted to make a better 8 bit DAC I'd probably opt for a dedicated IC rather than bother with matching resistors. There are plenty of 8 bit parallel input DACs available that would work great with this tutorial and code.
thanks for the comment, that was really helpful!
http://www.taydaelectronics.com/catalogsearch/result/?q=operational+amplifier+quad+pdip
The aim is to replace the TS924IN, which I'm getting quoted at about £1.59
I'm running a project to 'standardise' a breadboard and stripboard layout for use in an educational context, and audio output (especially with a resistor ladder) would be a brilliant project. However, the one Op-Amp IC you've chosen almost doubles the cost of this as a kit!
Finding something which would be adequate from Tayda's stock would be really handy. Hope someone knows more about reading data sheets than I do.
http://www.taydaelectronics.com/tlc274-quad-operational-amplifier-precision-pdip-14-tlc274cn.html
with datasheet...
http://pdf1.alldatasheet.com/datasheet-pdf/view/28886/TI/TLC274CN.html
...might be able to cope, although the need for a negative rail I'm not totally clear on. I appreciate it's more limited at 45mA total (30mA per channel) but more in the ballpark.
Do you think it's possible to set up a circuit with a TLC274CN across 6V (4xAA) giving -3V and +3V which seems a good enough voltage to drive an ATMEGA328-PU as well. Would certainly be quiet, but maybe good enough for a short sample to be played as part of an electronic game, and could add a battery-boosted speaker.
Does this make any sense?
Higher sample rates allow more resolution in regards to amplitude which directly translates into more dynamic range. Let's not confuse things here.
If Amanda is synth'ing/decoding 8 bit samples, it is 8 bit audio period. 8 bit gave digital audio a bad name in the early days account its grainy sound. 16 bit/44.1kHz is red book CD quality. Most modern audio interfaces allow 24 bit with 44.1-96kHz sample rates.
Most DSP is done internally at 32 bit allowing additional headroom and reducing the artifacts caused by floating point rounding errors