This uses a ribbon controller and a pressure sensor to control an onboard DDS generating tones

Dependencies:   mbed

Committer:
zarquin
Date:
Mon May 09 03:43:21 2011 +0000
Revision:
0:88f7ab41bdce
Version 0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zarquin 0:88f7ab41bdce 1 #include "mbed.h"
zarquin 0:88f7ab41bdce 2
zarquin 0:88f7ab41bdce 3 DigitalOut myled(LED1);
zarquin 0:88f7ab41bdce 4
zarquin 0:88f7ab41bdce 5 DigitalIn pushButton(p23);
zarquin 0:88f7ab41bdce 6 DigitalIn rotaryA(p21);
zarquin 0:88f7ab41bdce 7 DigitalIn rotaryB(p22);
zarquin 0:88f7ab41bdce 8
zarquin 0:88f7ab41bdce 9 AnalogIn pressure(p20);
zarquin 0:88f7ab41bdce 10 AnalogIn pos1(p17);
zarquin 0:88f7ab41bdce 11 AnalogIn top(p16);
zarquin 0:88f7ab41bdce 12 AnalogIn bottom(p15);
zarquin 0:88f7ab41bdce 13
zarquin 0:88f7ab41bdce 14 float wiper_f;
zarquin 0:88f7ab41bdce 15 float top_f;
zarquin 0:88f7ab41bdce 16 float bottom_f;
zarquin 0:88f7ab41bdce 17 float vol_f;
zarquin 0:88f7ab41bdce 18 float tmp_f;
zarquin 0:88f7ab41bdce 19 int tmp_i;
zarquin 0:88f7ab41bdce 20
zarquin 0:88f7ab41bdce 21 float pressureAvg[4];
zarquin 0:88f7ab41bdce 22 float wiperAvg[4];
zarquin 0:88f7ab41bdce 23
zarquin 0:88f7ab41bdce 24 AnalogOut signal(p18);
zarquin 0:88f7ab41bdce 25
zarquin 0:88f7ab41bdce 26 Ticker sampleClock;
zarquin 0:88f7ab41bdce 27 // 16 entry sinewave table.
zarquin 0:88f7ab41bdce 28 char sineWave[]={127,175,216,244,255,244,216,175,127,78,37,9,0,9,36,78};
zarquin 0:88f7ab41bdce 29
zarquin 0:88f7ab41bdce 30 char sawWave[]={0,16,31,47,64,79,95,111,127,143,159,175,191,207,223,255};
zarquin 0:88f7ab41bdce 31
zarquin 0:88f7ab41bdce 32 unsigned int counter;
zarquin 0:88f7ab41bdce 33 unsigned int counterSum;
zarquin 0:88f7ab41bdce 34 unsigned int counterLimit = 2147483647; //31 bits 2^31 - 1
zarquin 0:88f7ab41bdce 35
zarquin 0:88f7ab41bdce 36 char temp;
zarquin 0:88f7ab41bdce 37
zarquin 0:88f7ab41bdce 38 float byteToFloat(char in){
zarquin 0:88f7ab41bdce 39 float i = in;
zarquin 0:88f7ab41bdce 40 return (i/255.0)*0.5;
zarquin 0:88f7ab41bdce 41 }
zarquin 0:88f7ab41bdce 42
zarquin 0:88f7ab41bdce 43 void sample2(){
zarquin 0:88f7ab41bdce 44
zarquin 0:88f7ab41bdce 45
zarquin 0:88f7ab41bdce 46
zarquin 0:88f7ab41bdce 47 }
zarquin 0:88f7ab41bdce 48
zarquin 0:88f7ab41bdce 49 void sample(){
zarquin 0:88f7ab41bdce 50
zarquin 0:88f7ab41bdce 51 //useing a 31 bit counter.
zarquin 0:88f7ab41bdce 52 counter = counter + counterSum;
zarquin 0:88f7ab41bdce 53 if(counter > counterLimit){
zarquin 0:88f7ab41bdce 54 //wrap the counting.
zarquin 0:88f7ab41bdce 55 counter = counter - counterLimit;
zarquin 0:88f7ab41bdce 56 }
zarquin 0:88f7ab41bdce 57
zarquin 0:88f7ab41bdce 58 //Fout = CounterSum*Fclk/MaxCount
zarquin 0:88f7ab41bdce 59
zarquin 0:88f7ab41bdce 60 temp = counter>>27; //shift the top 4 bits down.
zarquin 0:88f7ab41bdce 61 //float x = temp;
zarquin 0:88f7ab41bdce 62 //signal.write(x/16.0);
zarquin 0:88f7ab41bdce 63
zarquin 0:88f7ab41bdce 64 //write the output out
zarquin 0:88f7ab41bdce 65 signal.write(vol_f*byteToFloat(sineWave[temp]) +0.5);
zarquin 0:88f7ab41bdce 66 }
zarquin 0:88f7ab41bdce 67
zarquin 0:88f7ab41bdce 68 int read_encoder()
zarquin 0:88f7ab41bdce 69 {
zarquin 0:88f7ab41bdce 70 int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
zarquin 0:88f7ab41bdce 71 static char old_AB = 0;
zarquin 0:88f7ab41bdce 72 /**/
zarquin 0:88f7ab41bdce 73 old_AB <<= 2;
zarquin 0:88f7ab41bdce 74 char x = rotaryA.read();
zarquin 0:88f7ab41bdce 75 x<<=1;
zarquin 0:88f7ab41bdce 76 x = x+rotaryB.read(); //remember previous state
zarquin 0:88f7ab41bdce 77 old_AB |= ( x & 0x03 ); //add current state
zarquin 0:88f7ab41bdce 78 return ( enc_states[( old_AB & 0x0f )]);
zarquin 0:88f7ab41bdce 79 }
zarquin 0:88f7ab41bdce 80
zarquin 0:88f7ab41bdce 81 int main() {
zarquin 0:88f7ab41bdce 82
zarquin 0:88f7ab41bdce 83 //setup variables.
zarquin 0:88f7ab41bdce 84 tmp_i = 0;
zarquin 0:88f7ab41bdce 85 counter = 0;
zarquin 0:88f7ab41bdce 86 counterSum = 302365697;
zarquin 0:88f7ab41bdce 87 counterSum = 18897856;
zarquin 0:88f7ab41bdce 88 //counterSum = 1181116;
zarquin 0:88f7ab41bdce 89 //18897856.1
zarquin 0:88f7ab41bdce 90
zarquin 0:88f7ab41bdce 91 vol_f = 0.0;
zarquin 0:88f7ab41bdce 92
zarquin 0:88f7ab41bdce 93 //hook up sample() to the ticker. run the counter at 50kHz
zarquin 0:88f7ab41bdce 94 sampleClock.attach_us(sample,20);
zarquin 0:88f7ab41bdce 95
zarquin 0:88f7ab41bdce 96 while(1){
zarquin 0:88f7ab41bdce 97 wiper_f = pos1.read();
zarquin 0:88f7ab41bdce 98 bottom_f = bottom.read();
zarquin 0:88f7ab41bdce 99
zarquin 0:88f7ab41bdce 100 if(wiper_f >= bottom_f){
zarquin 0:88f7ab41bdce 101 // wiper is being pressed, play a note
zarquin 0:88f7ab41bdce 102 top_f = top.read();
zarquin 0:88f7ab41bdce 103
zarquin 0:88f7ab41bdce 104 tmp_f = 1.0 - (wiper_f - bottom_f)/(top_f - bottom_f);
zarquin 0:88f7ab41bdce 105
zarquin 0:88f7ab41bdce 106 vol_f = 1.0 - pressure.read();
zarquin 0:88f7ab41bdce 107 //ribbon is about 3 octaves worth.
zarquin 0:88f7ab41bdce 108 //if the top is 440Hz = 18897856.1
zarquin 0:88f7ab41bdce 109 //44Hz = 1889785.61
zarquin 0:88f7ab41bdce 110 //55Hz is 2362232.013 //low A
zarquin 0:88f7ab41bdce 111 tmp_i = (int)(16535624*tmp_f);
zarquin 0:88f7ab41bdce 112
zarquin 0:88f7ab41bdce 113 counterSum = 2362232+ tmp_i;
zarquin 0:88f7ab41bdce 114
zarquin 0:88f7ab41bdce 115 }else{
zarquin 0:88f7ab41bdce 116 vol_f = 0.0;
zarquin 0:88f7ab41bdce 117 }
zarquin 0:88f7ab41bdce 118
zarquin 0:88f7ab41bdce 119
zarquin 0:88f7ab41bdce 120 }
zarquin 0:88f7ab41bdce 121 }