Clemens Valens
/
touchpad
mbed with Nintendo DS touchpad, accelerometer & touchpad.
main.cpp@0:0a76ae27065b, 2010-05-05 (annotated)
- Committer:
- Clemo
- Date:
- Wed May 05 12:10:15 2010 +0000
- Revision:
- 0:0a76ae27065b
Who changed what in which revision?
User | Revision | Line number | New 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 | } |