🛠 Mini sample player on the 12-bit DAC
Goal
Build a tiny sample player: store an 8-bit waveform in flash, rescale it to the 12-bit DAC on A0, and stream it at a fixed rate. The budget is generous for a microcontroller - 256 KB flash and 32 KB SRAM - so hundreds of samples of a few seconds fit in code space.
Code skeleton
const uint8_t SND[] PROGMEM = { /* 8-bit PCM, e.g. 8 kHz */ };
const size_t N = sizeof(SND);
const float RATE = 8000.0f;
void setup {
analogWriteResolution(12);
}
void loop {
static uint32_t t0 = micros;
static size_t i = 0;
uint32_t n = (micros - t0) / (1000000UL / (uint32_t)RATE);
if (n < N) {
uint8_t s = pgm_read_byte(&SND[n]);
analogWrite(A0, (s - 128) * 8 + 2048); // 8->12 bit, mid-scale
} else {
analogWrite(A0, 2048); // silence = mid rail
if (micros - t0 > (N * 1e6f) / RATE + 100000) { t0 = micros; i = 0; }
}
}
Notes
- A0 can only source ~8 mA: always go through an amplifier (e.g. a TPA2006 breakout) before a speaker.
- Keep 8-bit samples centered at 128 and output mid-scale (2048) for silence to avoid clicks.
Other tutorials for this board
Code examples for this board
clignotante.inoArduinobouton-poussoir.inoArduinodac-analogique.inoArduinoentree-analogique.inoArduinopwm-respiration.inoArduinoservo-balayage.inoArduino