The VMusic2 audio player is an affordable and simple solution to playback audio in a controlled way. You put MP3 files on an USB flash disk and then issue commands to the player via serial communication. All modules from the Interaction Workshop have updated firmware. If you buy your own, make sure you upgrade the firmware before using it.
Preparing the USB flash drive
The VMusic2 module can be quite picky with the USB flash drive. Make sure it is formatted as FAT32 and that filenames are plain (8.3 notation always safest: myfile01.mp3)
Connecting the module
Issuing commands over serial
From Arduino, Serial.println(“command”) doesn't work properly. It is best and safest to split the command and CR (carriage return) over two calls:
Serial.print("V3A"); // send the VMusic2 command Serial.print(13, BYTE); // send the CR in raw byte
VMUSIC COMMANDS: *** make sure you issue a CR after the command *** VPF·file Plays a single file eg: "VPF 1.mp3" VRF·file Repeatedly plays a single file VST Stops playback V3A Plays all MP3 files VRA Repeatedly plays all MP3 files VRR Repeatedly plays random MP3 files VSF Skip forward one track VSB Skip back one track VSD Skip forward one whole directory VP Pause playback VF Fast forward 5 seconds VB Rewind 5 seconds VRD·byte Reads command register VWR·byte+word Writes command register VSV·byte Sets playback volume
Advanced stuff
The regular Arduino has only one hardware serial port (Pins 0 and 1). The Arduino Mega offers 4 serial ports. Note that with the use of a library (NewSoftSerial, AFSoftSerial, SoftwareSerial), digital pins can be used as software serial port.
#include <NewSoftSerial.h> NewSoftSerial mySerial(2, 3); // soft serial: RX on pin 2, TX on pin 3 void setup() { Serial.begin(57600); Serial.println("Goodnight moon!"); // set the data rate for the NewSoftSerial port mySerial.begin(9600); mySerial.println("Hello, world?"); } void loop() // run over and over again { if (mySerial.available()) { Serial.print((char)mySerial.read()); } if (Serial.available()) { mySerial.print((char)Serial.read()); } }
The module provides a bidirectional serial communication, so you can get playback time and status, list of files, etc. Check the documentation and online for exploring these areas.
The wonderful world of wireless definitely needs more than one hour to master. This is a highly condensed introduction, edges might be rough for now. If you are interested in the topic, please continue exploring on your own and ask questions. I'll try to help as much as I can.
The fundamental goal of this introduction is to replace the physical wired Serial communication (USB cable) with a wireless one. Graphically it looks like this:
To put it simply (not 100% accurate, but close enough)
ZigBee High level communication protocol for wireless personal area network (WPAN). Similar to Bluetooth but with a focus on low power XBee Commercial product name from Digi (formally Maxstream) Series 1 (called 802.15.4) and Series 2.5 are not compatible (watch out we have both in the iWorkshop) 802.15.4 Standard at the base of wireless personal area network (WPAN), used in ZigBee and others
Have a working Arduino + Processing wired combo. Arduino sends a sensor value over serial in a packet format like 1:255* that Processing can read and decode.
Arduino Sketch
int analogValue = 0; // variable to hold the analog value void setup() { // open the serial port at 9600 (or 19200 bps for Xbee) Serial.begin(19200); } void loop() { // read the analog input on pin 0: analogValue = analogRead(0); // print out the packet in the format id:value* Serial.print("1:"); Serial.print(analogValue); Serial.println("*"); // delay 30 milliseconds before the next reading: delay(30); }
Processing Sketch: xbee_base_station_simple.zip
Configure XBee Series 1 node and base station using X-CTU software (simple) or AT commands (challenging). Remember to use your own PAN ID to avoid conflict with others.
Enjoy!