PROTO D21G audio playback

using the DAC output to play sound


The Industruino D21G MCU runs at 48MHz and has a DAC output, which enables it to create a sound output. Arduino provides this example of a simple audio player, with the AudioZero library available in the IDE library manager.

A short video of the demo project is shown below:


A0 vs DAC0

On the Arduino boards, the DAC is on pin A0 but this pin is not defined in the Industruino D21G, which uses DAC0 as pin name for this output. The AudioZero library uses the A0 name, so we have to add a line to the AudioZero.h library file:

  #define A0 DAC0  // added for Industruino D21G

This line makes sure the library uses DAC0 instead of A0.

The above tutorial uses an LM386 as audio amplifier, but i used a simple cheap class D stereo amp (PAM8403) that does not even require a DC filtering capacitor; the DAC output can be directly connected to one of the amp's input channels. It can be powered from the PROTO's 5V and GND terminals, so only 3 wires are required.

SD card

We use the SD card slot in the Industruino Ethernet module. As we're not using the Ethernet functionality, we need to make sure to pull the SPI chip select lines of the Ethernet and FRAM high to avoid interference.

The sound file needs to be of a certain format: 8-bit unsigned PCM mono. I generated a file that with this online converter.

Below the code as modified from the above library example. The original did not have the AudioZero.end() so there was a lot of noise after the file stopped playing.

  Simple Audio Player for Arduino Zero
  Demonstrates the use of the Audio library for the Arduino Zero

  Hardware required :
   Arduino shield with a SD card on CS4
   A sound file named "test.wav" in the root directory of the SD card
   An audio amplifier to connect to the DAC0 and ground
   A speaker to connect to the audio amplifier

  Arturo Guadalupi <>
  Angelo Scialabba <>
  Claudio Indellicati <>

  This example code is in the public domain

  online .wav converter:

  Modified for INDUSTRUINO D21G by Tom Tobback
  Nov 2017

  NOTE: pin A0 is not defined for Industruino, the DAC output is on pin DAC0
  add this line to the library file AudioZero.h:
  #define A0 DAC0  // added for Industruino D21G

#include <SD.h>
#include <SPI.h>
#include <AudioZero.h>

#include <UC1701.h>      // Industruino LCD
static UC1701 lcd;

void setup()
  pinMode(10, OUTPUT); // Ethernet CS             // needed for Industruino Ethernet module
  pinMode(6, OUTPUT);  // FRAM CS
  pinMode(4, OUTPUT);  // SD card CS
  digitalWrite(10, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(4, HIGH);

  pinMode(26, OUTPUT);      // Industruino backligh on
  digitalWrite(26, HIGH);

  lcd.setCursor(2, 0);
  lcd.print("INDUSTRUINO D21G");
  lcd.setCursor(2, 1);
  lcd.print("AudioZero demo");

  // debug output at 115200 baud
  //  while (!SerialUSB);  // useful for debugging

  // setup SD-card
  SerialUSB.print("Initializing SD card...");
  lcd.setCursor(2, 3);
  lcd.print("init SD card...");
  if (!SD.begin(4)) {
    SerialUSB.println(" failed!");
    while (true);
  SerialUSB.println(" done.");


void loop()
  // 44100kHz stereo => 88200 sample rate
  AudioZero.begin(1 * 44100);                // online .wav generator did not have 88200Hz, only 44100Hz

  // open wave file from sdcard
  File myFile ="T2.wav");
  if (!myFile) {
    // if the file didn't open, print an error and stop
    SerialUSB.println("error opening .wav file");
    lcd.setCursor(2, 4);
    lcd.print("file not found");
    while (true);

  lcd.setCursor(2, 4);
  lcd.print("playing .wav file");

  // until the file is not finished;

  SerialUSB.println("End of file. Thank you for listening!");
  lcd.setCursor(2, 5);
  lcd.print("finished playing file");

  AudioZero.end();   // otherwise noise on DAC output

  lcd.setCursor(2, 6);
  lcd.print("press Enter to play");

  while (digitalRead(24));   // wait for Enter button pressed

  lcd.setCursor(2, 4);
  lcd.print("                         ");
  lcd.setCursor(2, 5);
  lcd.print("                         ");
  lcd.setCursor(2, 6);
  lcd.print("                         ");