Rugged Audio Shield for Arduino

For a limited vocabulary it's certainly easy enough to store pre-recorded words on the microSD card and just play them back in sequence as necessary:

...
RAS.PlayWAV("EIGHT.WAV"); RAS.WaitForIdle();
RAS.PlayWAV("SIX.WAV"); RAS.WaitForIdle();
RAS.PlayWAV("SEVEN.WAV"); RAS.WaitForIdle();
// etc.

--
The Gadget Shield: accelerometer, RGB LED, IR transmit/receive, speaker, microphone, light sensor, potentiometer, pushbuttons

and of course just generate the filename from the digit in question e.g. sprintf(fname,"%d.wav", number);

I've been able to sample a Mic on an analog pin at 20khz. Would your results be much different?
My problem is where to store the data. The SD card and XBee are plenty fast serially, but...
SD card loses data when it has to allocate a cluster.
XBee causes hum on Mic while it is transmitting.

How does your board overcome the SD lost data?
A much larger than 2k buffer?

I've been able to sample a Mic on an analog pin at 20khz. Would your results be much different?

You had some kind of amplification on the mic, right? The A/D on the analog pins is a 10-bit A/D, and the Rugged Audio Shield has 12-bit A/D's so you get (theoretically) 12dB improvement in SNR. Plus you can sample at higher frequencies on our shield.

How does your board overcome the SD lost data?

Several things help:

  • Don't record too fast for your SD card (and different cards from different manufacturers vary in write speeds) -- use an appropriate sampling rate
  • Record mono instead of stereo if that's acceptable
  • Format the card using the EraseFilesystem method which properly aligns sectors
  • Pre-size the recording file using the PresizeFile method which pre-allocates all the clusters if you know about how much time you'll be recording

--
The Flexible MIDI Shield: MIDI IN/OUT, stacking headers, your choice of I/O pins

Thank you for your accurate answers. Pre sizing is a great solution for me. I average every 2 samples giving me 10k sample rate. I assume my processor would be completely free to run in loop while it's recording with your hardware?

Correct, the Arduino is completely free to do whatever it wants while recording is in process since it all happens on the shield. To stop recording you just call the Stop method.

--
The Basic Motor Driver: simple, inexpensive motor driver for 1 stepper motor or 2 DC motors

wow just found this, looks very nice

Is it possible to edit, manage, save, read the files on the SD Card with a Linux computer?

How fast is the shield? How long does it take in-between the command RAS.PlayWAV("SOMEFILE.WAV"); until it's starting to play? is there a lag appreciable? Is there a gap in-between two sounds played?
Is there a possibility for a auto-rec function? To start the recording when a specified threshold is reached? Would the shield be fast enough for this?

To avoid clicks, is it possible and necessary to fade-in and fade-out sounds? I was reading about the void OutputVolumeSet(uint8_t volume); function.
Would this be possible to do very fast?
Is the your shield always faster than the Arduino because it runs with 32 MHz?

Can you play only one or several files at the same time? I imagine only one, but what if they are very short and small?
And is it possible to run 2 or 3 Audio Shields with only one Arduino (Mega)?
Yes it should be possible as I can call different shields via SPI Slave Select. How long does it take to do void begin(uint8_t SSpin = 8); ? Can you switch fast in between multiple shields???

How does the Rugged Audio Shield sound? 12-bit? 16-bit? Something in-between? Hi-fi lo-fi?
Thank you!

Hello Guys, I am trying to use this board as a room sound recording activated by the change in the sound level. I have read the instruction but I haven't found something to allow to control the information entered through the mic input.

i appreciate your help...

Hi,

I'm also looking at being able to monitor the input for a certain threshold. The library doesn't include support for this I don't think so I'm looking into the firmware of the shield and writing my own code for the arduino.

hai.
I brought this shield last month ago and found that, the maximum file name that can be input is 12345678.WAV (8.3format).. How to modify the program to allow user enter large file name 1234567890.WAV (10.3 format).. I try to change RAS.ccp library but it gives nothing..

void RAS::_send_filename(uint8_t cmd, const char *str)
{
uint8_t buf[13]; ---------------->15

memset(buf, 0, sizeof(buf));
strncpy((char *)buf, str, 12);------------------>14
_send_cmd(cmd);
_spi_send_buf(buf, sizeof(buf));
_end_spi();
}

any idea?

What are you sending the longer names to? Just sending a longer name to the function is not sufficient. If the code that you are sending the name to expects a 8.3 format name, you will not be able to change that easily.

Hi Rugged Circuit,

I have some problem to solve and I need the sampling frequency at 22050Hz. Since we know that for Fs=22050 so meaning that 1s = 22050 data. So, I want to do some frame analysis and for the time being the recording is still runinng. For example:

While recording i want to frame the data to 1024 data only, then from x= 1024 i want to do a simple calculation, x.^2..

So, from the shield how can i start to program it? Any suggestion?

Thank You

Hi All

Recently I bought the Rugged Audio Shield, to combine it with my Arduino UNO.
I would like to load the file "RecordWAV.ino" which I found on

When I try to load the file using the Arduino software, I get a load of errors.

Rec_PlayBack:31: error: 'RAS' does not name a type
Rec_PlayBack.cpp: In function 'void setup()':
Rec_PlayBack:34: error: 'RAS' was not declared in this scope
Rec_PlayBack:43: error: 'SOURCE_MONO' was not declared in this scope
Rec_PlayBack:43: error: 'SOURCE_MIC' was not declared in this scope
Rec_PlayBack.cpp: In function 'void loop()':
Rec_PlayBack:53: error: 'RAS' was not declared in this scope

So I try to load it via the Arduino UNO. But the errors already pop up during compiling.
Do I need other software to load this file?
I feel pretty stupid. What do I do wrong? What should I read?

I don't have a lot of experience with Arduino, but I did make a nice 24Vdc/4KW bidirectional motor controller using a Arduino UNO.
So making a record and playback sampler shouldn't be so difficult I guess....

Any help is appreciated!
Cheer; nico.

At a guess, I would suspect you would need to install RAS.h and RAS.cpp into a RAS directory that is in your libraries directory. On my linux system that would be in ~/sketchpad/libraries.

Hi all,

I bought RC Audio Shield more then year ago and unfortunately have to say that I was rather disappointed about results.
I never used it since.

Here is a short excerpt from a mail I wrote to RC. just to say that the guys never updated their answer:

Hello guys! [...] I got big expectations about your Audio Shield. I just got hooked up by the very first line of your description: "playing audio files from a microSD card (16-bit mono/stereo WAV)". Now I realize that I was too euphoric about it. Because I marginalized the sentence 9 lines further: "12-bit audio input and output resolution". What is the use to put information about playback of 16-bit CD-quality files at the first, if the nominal 12-bit resolution will reduce the sound quality (by decreasing dynamic range / adding noise) anyway?.. Please don't say it is just about marketing. I like the build quality and features of your audio board. It feels sturdy and nice. But now I realize that the quality of audio playback just don't fit my needs. 16-bit audio? No way. So why to mention it at all?.. OK, let's assume it is all about noisy and cool 12-bit sound. Lo-Fi, so to say. Cool guys dig it. I started to put test WAVs on the micro SD. But even if I made neat fade-ins / fade-outs (means from- and to digital zero), the playback on RC Audio Shield always makes a loud, big and scary "bump" both at the beginning and at the end of respective audio file. Should it be like that?.. Please do say it should'nt. I was happy to think that RD Audio Shield will replace my cumbersome Akai S5000 Sampler for playback. But it seems I rather will be fine with Arduino / MIDI Shield (not tested it yet) + Sampler instead - too bad. :frowning: best, Girts
Hello Girts,
Thank you for your detailed feedback. We will use it to look into the "bumps" at the beginning and end of the sound, and to improve the design for the next revision.
Best regards,
--
Rugged Circuits Support
support@ruggedcircuits.com
http://www.ruggedcircuits.com

I fixed the "bump" at the beginning and end of playing a wav file by explicitly calling "stop" in the firmware. See pull request here: Stop the "pop" between audio tracks by jaredhobbs · Pull Request #1 · RuggedCircuits/Rugged-Audio-Shield-Firmware · GitHub

Hello everyone!
I am a newbie in the Arduino world, having lots of fun, but ran into a problem.
I am trying to combine a Rugged Audio Shield with an Arduino WiFi shield on top of an Arduino Uno.
I got the Audio shield to work by itself, I got the WiFi to work by itself, but when I plug in the 3 of them together, in no matter what order, I keep getting the message "WiFi shield not present" (not sure this is the exact message, but...).
Is there other ways to connect them, or at least how do I diagnose why the WiFi shield stops working when the Audio shield is present?

Appreciate any comments and suggestions!
h

how do I diagnose why the WiFi shield stops working when the Audio shield is present?

Both shields use SPI to talk to the Arduino, with different SS pins to define which slave the Arduino is talking to. What it comes down to is your code. Where is it?

Thanks for the reply Paul.
I am just trying to run one of the sample sketches that come with the WiFi library. Here's the code:
/*
Web client

This sketch connects to a website (http://www.google.com)
using a WiFi shield.

This example is written for a network using WPA encryption. For
WEP or WPA, change the Wifi.begin() call accordingly.

This example is written for a network using WPA encryption. For
WEP or WPA, change the Wifi.begin() call accordingly.

Circuit:

  • WiFi shield attached

created 13 July 2010
by dlf (Metodo2 srl)
modified 31 May 2012
by Tom Igoe
*/

#include <SPI.h>
#include <WiFi.h>

// char ssid[] = "yourNetwork"; // your network SSID (name)
char ssid[] = "radio1";
// char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP)
char pass[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
int keyIndex = 0; // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(173,194,73,105); // numeric IP for Google (no DNS)
//char server[] = "www.google.com"; // name address for Google (using DNS)

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
WiFiClient client;

void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while(true);
}

// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
// status = WiFi.begin(ssid, pass);
// Connect to WEP
status = WiFi.begin(ssid, keyIndex, pass);

// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to wifi");
printWifiStatus();

Serial.println("\nStarting connection to server...");
// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.println("connected to server");
// Make a HTTP request:
client.println("GET /search?q=arduino HTTP/1.1");
client.println("Host:www.google.com");
client.println("Connection: close");
client.println();
}
}

void loop() {
// if there are incoming bytes available
// from the server, read them and print them:
while (client.available()) {
char c = client.read();
Serial.write(c);
}

// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting from server.");
client.stop();

// do nothing forevermore:
while(true);
}
}

void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());

// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);

// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}