mbed with Nintendo DS touchpad, accelerometer & touchpad.

Dependencies:   mbed

Committer:
Clemo
Date:
Wed May 05 12:10:15 2010 +0000
Revision:
0:0a76ae27065b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Clemo 0:0a76ae27065b 1 /*
Clemo 0:0a76ae27065b 2 mbed touchpad & accelerometer experiments.
Clemo 0:0a76ae27065b 3
Clemo 0:0a76ae27065b 4 CPV, 14/09/2009
Clemo 0:0a76ae27065b 5 */
Clemo 0:0a76ae27065b 6
Clemo 0:0a76ae27065b 7 #include "mbed.h"
Clemo 0:0a76ae27065b 8 #include "touchpad.h"
Clemo 0:0a76ae27065b 9 #include "accelerometer.h"
Clemo 0:0a76ae27065b 10 #include "my_pwm_out.h"
Clemo 0:0a76ae27065b 11
Clemo 0:0a76ae27065b 12
Clemo 0:0a76ae27065b 13 // Pin definitions.
Clemo 0:0a76ae27065b 14 #define ACC0 p20
Clemo 0:0a76ae27065b 15 #define ACC1 p19
Clemo 0:0a76ae27065b 16 #define X0 p18
Clemo 0:0a76ae27065b 17 #define Y0 p17
Clemo 0:0a76ae27065b 18 #define X1 p16
Clemo 0:0a76ae27065b 19 #define Y1 p15
Clemo 0:0a76ae27065b 20
Clemo 0:0a76ae27065b 21
Clemo 0:0a76ae27065b 22 // Some global objects.
Clemo 0:0a76ae27065b 23 DigitalOut led1(LED1);
Clemo 0:0a76ae27065b 24 Ticker timer1; // Sample clock.
Clemo 0:0a76ae27065b 25 Ticker timer2; // "keyboard" scan clock.
Clemo 0:0a76ae27065b 26 Ticker timer3; // LED clock.
Clemo 0:0a76ae27065b 27 Touchpad tp(X0,X1,Y0,Y1);
Clemo 0:0a76ae27065b 28 Accelerometer2D acc(ACC0,ACC1,10);
Clemo 0:0a76ae27065b 29 MyPwmOut buzzer(p21); // Subclassed from PwmOut.
Clemo 0:0a76ae27065b 30
Clemo 0:0a76ae27065b 31
Clemo 0:0a76ae27065b 32 float DutyCycle = 0.0; // No sound.
Clemo 0:0a76ae27065b 33 int Period = 1136; // in us => 880 Hz.
Clemo 0:0a76ae27065b 34 int FlagUpdateSound = 0;
Clemo 0:0a76ae27065b 35
Clemo 0:0a76ae27065b 36 // Periods in us.
Clemo 0:0a76ae27065b 37 const int freq[4][6] =
Clemo 0:0a76ae27065b 38 {
Clemo 0:0a76ae27065b 39 { 1607, 1517, 1432, 1351, 1276, 1204 },
Clemo 0:0a76ae27065b 40 { 1136, 1073, 1012, 956, 902, 851 },
Clemo 0:0a76ae27065b 41 { 804, 758, 716, 676, 638, 602 },
Clemo 0:0a76ae27065b 42 { 568, 536, 506, 478, 451, 426 },
Clemo 0:0a76ae27065b 43 };
Clemo 0:0a76ae27065b 44
Clemo 0:0a76ae27065b 45
Clemo 0:0a76ae27065b 46 void sample(void)
Clemo 0:0a76ae27065b 47 {
Clemo 0:0a76ae27065b 48 tp.tick();
Clemo 0:0a76ae27065b 49 acc.tick();
Clemo 0:0a76ae27065b 50 }
Clemo 0:0a76ae27065b 51
Clemo 0:0a76ae27065b 52
Clemo 0:0a76ae27065b 53 void scan_keyboard(void)
Clemo 0:0a76ae27065b 54 {
Clemo 0:0a76ae27065b 55 if (tp.hotspot()>0)
Clemo 0:0a76ae27065b 56 {
Clemo 0:0a76ae27065b 57 int x = tp.get_hotspot_x();
Clemo 0:0a76ae27065b 58 int y = tp.get_hotspot_y();
Clemo 0:0a76ae27065b 59 Period = freq[y][x]*(1.0+acc.read(0)/64000.0);
Clemo 0:0a76ae27065b 60 DutyCycle = 0.5 + acc.read(1)/32000.0;
Clemo 0:0a76ae27065b 61 FlagUpdateSound = 1;
Clemo 0:0a76ae27065b 62 }
Clemo 0:0a76ae27065b 63 else
Clemo 0:0a76ae27065b 64 {
Clemo 0:0a76ae27065b 65 if (DutyCycle!=0.0)
Clemo 0:0a76ae27065b 66 {
Clemo 0:0a76ae27065b 67 DutyCycle = 0.0;
Clemo 0:0a76ae27065b 68 FlagUpdateSound = 1;
Clemo 0:0a76ae27065b 69 }
Clemo 0:0a76ae27065b 70 }
Clemo 0:0a76ae27065b 71 }
Clemo 0:0a76ae27065b 72
Clemo 0:0a76ae27065b 73
Clemo 0:0a76ae27065b 74 void toggle_led(void)
Clemo 0:0a76ae27065b 75 {
Clemo 0:0a76ae27065b 76 if (led1==1) led1 = 0;
Clemo 0:0a76ae27065b 77 else led1 = 1;
Clemo 0:0a76ae27065b 78 }
Clemo 0:0a76ae27065b 79
Clemo 0:0a76ae27065b 80
Clemo 0:0a76ae27065b 81 int main()
Clemo 0:0a76ae27065b 82 {
Clemo 0:0a76ae27065b 83 printf("\n");
Clemo 0:0a76ae27065b 84 printf("-=o Touch, Shake & Whine o=-\n");
Clemo 0:0a76ae27065b 85 printf("\n");
Clemo 0:0a76ae27065b 86 printf("mbed touchpad & 2D accelerometer demo\n");
Clemo 0:0a76ae27065b 87 printf("\n");
Clemo 0:0a76ae27065b 88 printf("A buzzer is driven by a PWM signal to generate musical notes.\n");
Clemo 0:0a76ae27065b 89 printf("A touchpad is used as a keypad, divided in a 6 by 4 matrix.\n");
Clemo 0:0a76ae27065b 90 printf("The position on the touchpad determines the note played by the\n");
Clemo 0:0a76ae27065b 91 printf("buzzer. A 2-axis accelerometer is used to modulate the frequency\n");
Clemo 0:0a76ae27065b 92 printf("and the duty-cycle of the PWM signal.\n");
Clemo 0:0a76ae27065b 93 printf("A blinking LED shows that the system is running.\n");
Clemo 0:0a76ae27065b 94 printf("\n");
Clemo 0:0a76ae27065b 95 printf("Touch & shake the circuit to make it whine.\n");
Clemo 0:0a76ae27065b 96 printf("\n");
Clemo 0:0a76ae27065b 97 printf("Demonstrates:\n");
Clemo 0:0a76ae27065b 98 printf("- the use of a resistive touchpad\n");
Clemo 0:0a76ae27065b 99 printf("- the use of a 2D accelerometer\n");
Clemo 0:0a76ae27065b 100 printf("- the use of PWM for smooth frequency generation\n");
Clemo 0:0a76ae27065b 101 printf("- on-the-fly pin function switching\n");
Clemo 0:0a76ae27065b 102 printf("- mbed \"base\" class extension\n");
Clemo 0:0a76ae27065b 103 printf("\n");
Clemo 0:0a76ae27065b 104 printf("CPV, 14/09/2009\n");
Clemo 0:0a76ae27065b 105 printf("\n");
Clemo 0:0a76ae27065b 106 printf(" -end-\n\n");
Clemo 0:0a76ae27065b 107
Clemo 0:0a76ae27065b 108 led1 = 1; // LED on.
Clemo 0:0a76ae27065b 109
Clemo 0:0a76ae27065b 110 timer1.attach_us(&sample,1000); // Sample every 1 ms.
Clemo 0:0a76ae27065b 111 timer2.attach_us(&scan_keyboard,10000); // Scan the touchpad every 10 ms.
Clemo 0:0a76ae27065b 112 timer3.attach_us(&toggle_led,500000); // Toggle the LED every 500 ms.
Clemo 0:0a76ae27065b 113
Clemo 0:0a76ae27065b 114 while (1)
Clemo 0:0a76ae27065b 115 {
Clemo 0:0a76ae27065b 116 if (FlagUpdateSound==1)
Clemo 0:0a76ae27065b 117 {
Clemo 0:0a76ae27065b 118 // Only update period & duty-cycle when new data is available.
Clemo 0:0a76ae27065b 119 FlagUpdateSound = 0;
Clemo 0:0a76ae27065b 120 buzzer.set(Period/1000000.0,DutyCycle);
Clemo 0:0a76ae27065b 121 }
Clemo 0:0a76ae27065b 122 }
Clemo 0:0a76ae27065b 123 }