Demo of MPR121 I2C Capacitive Touch Sensors (using piano key .wav files)

/media/uploads/jhawkins38/20141020_192450-1.jpg

Description

This device uses two sparkfun MPR121 I2C capacitive touch keypad with the mbed's I2C interface to play a unique wav file for every touch sensor that is pressed on the keypad. The devices uses a sparkfun 3.5mm audio jack to play the wav files over speakers for a better quality sound. The touch sensors are set up using the MPR121 class file and use the mbed's I2C interface. The mbed has two pairs of pins on either side for I2C interface. Check the mbed pin out for the locations of the I2C pins. Each touch sensor represents an electrode with a capacitance level that changes when an object comes into contact with it. The program uses the waveplayer library to play .wav files for the corresponding capacitance levels that the mbed reads in from its I2C ports. The waveplayer class uses the analog out (p18) to play the files through the speakers. The waveplayer class was altered to include pass a playPtr as an argument for the play function, which controls the playback of the wav file through the touchpad interrupts. The .wav files are accessed from an sdcard using the sparkfun micro SD breakout. The micro SD breakout uses the mbed's SPI interface to allow the mbed to read and write files to the sdcard. The music files used in this demo were found at this site http://theremin.music.uiowa.edu/MISpiano.html and converted to wav files, but there are plenty of usable .wav files available online. Each wav file was converted with the from stereo to mono and resampled at 16000 Hz with a sample format of 16-bit PCM using the audacity program. A uLCD-144-G2 is also used here to testing purposes, but is not necessary for the demo.

Components

MPR 121 I2C Capacitive Touch Sensor

/media/uploads/jhawkins38/touchpad.jpg

/media/uploads/jhawkins38/wired.jpg

/media/uploads/jhawkins38/mb.jpg

http://developer.mbed.org/users/4180_1/notebook/mpr121-i2c-capacitive-touch-sensor/

SD Card Detect

/media/uploads/jhawkins38/sd.jpg

http://developer.mbed.org/cookbook/SD-Card-File-System

Speaker Audio Jack

/media/uploads/jhawkins38/speaker.jpg

http://developer.mbed.org/users/4180_1/notebook/using-a-speaker-for-audio-output/

uLCD-144-G2

/media/uploads/jhawkins38/ulcd.jpg

http://developer.mbed.org/users/4180_1/notebook/ulcd-144-g2-128-by-128-color-lcd/

Demo

Code

Import programBeat_Demo_full_full

Demo of MP121 I2C touch sensors (playing piano keys)

Demo of MPR121 I2C Touch sensors using piano .wav files

#include <mbed.h>
#include <mpr121.h>
#include "uLCD_4DGL.h"
#include "Speaker.h"
#include "SDFileSystem.h"
#include "wave_player.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

SDFileSystem sd(p5, p6, p7, p8,"sd"); //SD card

uLCD_4DGL uLCD(p13,p14,p11);

AnalogOut DACout(p18);
wave_player waver(&DACout);


// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p26);
InterruptIn pardon(p25);
// Setup the i2c bus on pins 9 and 10
I2C i2c(p9, p10);
I2C i2c2(p28, p27);
// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
Mpr121 pad(&i2c2, Mpr121::ADD_VSS);

//Speaker mySpeaker(p21);

int key_code;
int Past_code;
int Past_code2;
bool PlayPtr;
 
// Key hit/release interrupt routine for 1st touchpad
void fallInterrupt() {
  key_code=77;
  Past_code=77;
  int value=mpr121.read(0x00);
  value +=mpr121.read(0x01)<<8;
  
  
  // puts key number out to LEDs for demo
  for(int i=0; i<12; i++) 
  {
    
    if(((value>>i)&0x01) == 1)
    {
        key_code = i;
    }
    
  }
  
 uLCD.locate(1,2);
 uLCD.printf("%2D",key_code);
    uLCD.cls();
  uLCD.printf("\n%2D\n", key_code);
  uLCD.printf("\n%2D\n", Past_code);
  if(key_code != Past_code)
  {
      PlayPtr = false;
  }
  else
  {
      PlayPtr = true;
  }
  Past_code = key_code;
  
  
}

//sets up interrupts for 2nd toucpad
void fallInterrupt2() {
  key_code=77;
  Past_code2=77;
  int value2=pad.read(0x00);
  value2 +=pad.read(0x01)<<8;
  
  // puts key number out to LEDs for demo
  for(int j=0; j<12; j++) 
  {
    
    if(((value2>>j)&0x01) == 1)
    {
        key_code= j +12;
        
    }
  }
  
    if(key_code != Past_code2)
    {
      PlayPtr = false;
    }
    else
    {
      PlayPtr = true;
    }
    Past_code2 = key_code;

  
  uLCD.locate(1,3);
  uLCD.printf("%2D",key_code);
  
  
}
 
int main() {
  pardon.fall(&fallInterrupt2);
  pardon.mode(PullUp);
  interrupt.fall(&fallInterrupt);
  interrupt.mode(PullUp);
  
  FILE *wave_file;
  
  while(1)
  {
      switch(key_code) //uses a case statement for each individual touch sensor
      {
        case 0:
            //mySpeaker.PlayNote(969.0, 0.5, 0.5);
            wave_file = fopen("/sd/piano_G.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 1:
            //mySpeaker.PlayNote(200.0, 0.1, 0.1);
            wave_file = fopen("/sd/piano_F_sharp.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            led1 = 1;
            break;
        case 2:
            //mySpeaker.PlayNote(300.0, 0.1, 0.1);
            wave_file = fopen("/sd/piano_B.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 3:
            //mySpeaker.PlayNote(500.0, 0.15, 0.1);
            wave_file = fopen("/sd/piano_A_sharp.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 4:
            //mySpeaker.PlayNote(700.0, 0.15, 0.1);
            wave_file = fopen("/sd/Gb3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 5:
            //mySpeaker.PlayNote(600.0, 0.15, 0.1);
            wave_file = fopen("/sd/G3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 6:
            //mySpeaker.PlayNote(969.0, 0.5, 0.5);
            wave_file = fopen("/sd/F3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 7:
            //mySpeaker.PlayNote(161.0, 0.25, 0.01);
            wave_file = fopen("/sd/Eb4.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 8:
            //mySpeaker.PlayNote(869.0, 0.5, 0.5);
            wave_file = fopen("/sd/Eb3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 9:
            //mySpeaker.PlayNote(769.0, 0.5, 0.5);
            wave_file = fopen("/sd/E3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 10:
            //mySpeaker.PlayNote(669.0, 0.5, 0.5);
            wave_file = fopen("/sd/Db4.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 11:
            //mySpeaker.PlayNote(469.0, 0.5, 0.5);
            wave_file = fopen("/sd/Db3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 12:
            //mySpeaker.PlayNote(969.0, 0.5, 0.5);
            wave_file = fopen("/sd/D4.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 13:
            //mySpeaker.PlayNote(200.0, 0.1, 0.1);
            wave_file = fopen("/sd/Db3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            led1 = 1;
            uLCD.printf("Hey");
            break;
        case 14:
            //mySpeaker.PlayNote(300.0, 0.1, 0.1);
            wave_file = fopen("/sd/C4.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 15:
            //mySpeaker.PlayNote(500.0, 0.15, 0.1);
            wave_file = fopen("/sd/C3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 16:
            //mySpeaker.PlayNote(700.0, 0.15, 0.1);
            wave_file = fopen("/sd/Bb3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 17:
            //mySpeaker.PlayNote(600.0, 0.15, 0.1);
            wave_file = fopen("/sd/Bb2.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 18:
            //mySpeaker.PlayNote(969.0, 0.5, 0.5);
            wave_file = fopen("/sd/B3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 19:
            //mySpeaker.PlayNote(161.0, 0.25, 0.01);
            wave_file = fopen("/sd/B2.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 20:
            //mySpeaker.PlayNote(869.0, 0.5, 0.5);
            wave_file = fopen("/sd/Ab3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 21:
            //mySpeaker.PlayNote(769.0, 0.5, 0.5);
            wave_file = fopen("/sd/A3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 22:
            //mySpeaker.PlayNote(669.0, 0.5, 0.5);
            wave_file = fopen("/sd/C3.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
        case 23:
            //mySpeaker.PlayNote(469.0, 0.5, 0.5);
            wave_file = fopen("/sd/C4.wav","r");
            waver.play(wave_file, &PlayPtr);
            fclose(wave_file);
            break;
      }
  }
}


Please log in to post comments.