Basic DRV2605 driver demo
Dependencies: DRV2605 MPR121 mbed
main.cpp@0:4f0a06335fbe, 2015-10-21 (annotated)
- Committer:
- electromotivated
- Date:
- Wed Oct 21 01:09:14 2015 +0000
- Revision:
- 0:4f0a06335fbe
v1 upload;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
electromotivated | 0:4f0a06335fbe | 1 | /* |
electromotivated | 0:4f0a06335fbe | 2 | Bryce Williams |
electromotivated | 0:4f0a06335fbe | 3 | 10/19/2015 |
electromotivated | 0:4f0a06335fbe | 4 | |
electromotivated | 0:4f0a06335fbe | 5 | Basic Demo of the TI DRV2605L Haptics Driver Breakout. |
electromotivated | 0:4f0a06335fbe | 6 | This code uses the MPR121 Library and modified version |
electromotivated | 0:4f0a06335fbe | 7 | of Dr. Jim Hamblen's Hello World Example for the MPR121 |
electromotivated | 0:4f0a06335fbe | 8 | for Capacitive Touch Keypad for user input. |
electromotivated | 0:4f0a06335fbe | 9 | |
electromotivated | 0:4f0a06335fbe | 10 | The user and touch keys 3,7,11,2,6,10, 1,5,9,and 0. |
electromotivated | 0:4f0a06335fbe | 11 | Each Key will toggle through about 10 effects each, |
electromotivated | 0:4f0a06335fbe | 12 | (key 11 toggles between 12 or 13 of the effects). |
electromotivated | 0:4f0a06335fbe | 13 | Effects are the ROM Library Haptics effects internal to |
electromotivated | 0:4f0a06335fbe | 14 | the DRV2605L Haptics Driver. |
electromotivated | 0:4f0a06335fbe | 15 | */ |
electromotivated | 0:4f0a06335fbe | 16 | |
electromotivated | 0:4f0a06335fbe | 17 | #include "mbed.h" |
electromotivated | 0:4f0a06335fbe | 18 | #include "DRV2605.h" |
electromotivated | 0:4f0a06335fbe | 19 | #include "mpr121.h" |
electromotivated | 0:4f0a06335fbe | 20 | |
electromotivated | 0:4f0a06335fbe | 21 | DRV2605 haptics(p9, p10); |
electromotivated | 0:4f0a06335fbe | 22 | DigitalOut led1(LED1); |
electromotivated | 0:4f0a06335fbe | 23 | DigitalOut led2(LED2); |
electromotivated | 0:4f0a06335fbe | 24 | DigitalOut led3(LED3); |
electromotivated | 0:4f0a06335fbe | 25 | DigitalOut led4(LED4); |
electromotivated | 0:4f0a06335fbe | 26 | // Setup the i2c bus on pins 28 and 27 |
electromotivated | 0:4f0a06335fbe | 27 | I2C i2c(p28, p27); |
electromotivated | 0:4f0a06335fbe | 28 | // Create the interrupt receiver object on pin 26 |
electromotivated | 0:4f0a06335fbe | 29 | InterruptIn interrupt(p26); |
electromotivated | 0:4f0a06335fbe | 30 | |
electromotivated | 0:4f0a06335fbe | 31 | // Setup the Mpr121 Cap Touch Driver: |
electromotivated | 0:4f0a06335fbe | 32 | // constructor(i2c object, i2c address of the mpr121) |
electromotivated | 0:4f0a06335fbe | 33 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
electromotivated | 0:4f0a06335fbe | 34 | |
electromotivated | 0:4f0a06335fbe | 35 | void fallInterrupt() { |
electromotivated | 0:4f0a06335fbe | 36 | int key_code=0; |
electromotivated | 0:4f0a06335fbe | 37 | int i=0; |
electromotivated | 0:4f0a06335fbe | 38 | int value=mpr121.read(0x00); |
electromotivated | 0:4f0a06335fbe | 39 | value +=mpr121.read(0x01)<<8; |
electromotivated | 0:4f0a06335fbe | 40 | // LED demo mod by J. Hamblen |
electromotivated | 0:4f0a06335fbe | 41 | printf("MPR value: %x \r\n", value); |
electromotivated | 0:4f0a06335fbe | 42 | i=0; |
electromotivated | 0:4f0a06335fbe | 43 | // puts key number out to LEDs for demo |
electromotivated | 0:4f0a06335fbe | 44 | for (i=0; i<12; i++) { |
electromotivated | 0:4f0a06335fbe | 45 | if (((value>>i)&0x01)==1) key_code=i+1; |
electromotivated | 0:4f0a06335fbe | 46 | } |
electromotivated | 0:4f0a06335fbe | 47 | led4=key_code & 0x01; |
electromotivated | 0:4f0a06335fbe | 48 | led3=(key_code>>1) & 0x01; |
electromotivated | 0:4f0a06335fbe | 49 | led2=(key_code>>2) & 0x01; |
electromotivated | 0:4f0a06335fbe | 50 | led1=(key_code>>3) & 0x01; |
electromotivated | 0:4f0a06335fbe | 51 | |
electromotivated | 0:4f0a06335fbe | 52 | // Evaluate Keypad from Left-to-Right Top-to-Bottom like reading |
electromotivated | 0:4f0a06335fbe | 53 | // Each Key sequences through decimal indexes ending with |
electromotivated | 0:4f0a06335fbe | 54 | // corresponding positions... i.e. |
electromotivated | 0:4f0a06335fbe | 55 | // Key 3 (value = 800) sequences 3, 13, 23, ... 123 |
electromotivated | 0:4f0a06335fbe | 56 | // Key 5 (value = 40) sequences 5, 15, 25,... 115 |
electromotivated | 0:4f0a06335fbe | 57 | // Key 11(value = 10) and 12 (value = 100) are free for custom |
electromotivated | 0:4f0a06335fbe | 58 | // implementation |
electromotivated | 0:4f0a06335fbe | 59 | switch(value){ |
electromotivated | 0:4f0a06335fbe | 60 | static int e1 = 1, e2 = 2, e3 = 3, e4 = 4, e5 = 5, e6 = 6, |
electromotivated | 0:4f0a06335fbe | 61 | e7 = 7, e8 = 8, e9 = 9, e10 = 10; |
electromotivated | 0:4f0a06335fbe | 62 | case 0x8: |
electromotivated | 0:4f0a06335fbe | 63 | printf("Playing %i\n", e1); |
electromotivated | 0:4f0a06335fbe | 64 | haptics.play_waveform(e1); |
electromotivated | 0:4f0a06335fbe | 65 | e1+=10; |
electromotivated | 0:4f0a06335fbe | 66 | if(e1 > 121) e1 = 1; |
electromotivated | 0:4f0a06335fbe | 67 | break; |
electromotivated | 0:4f0a06335fbe | 68 | case 0x80: |
electromotivated | 0:4f0a06335fbe | 69 | printf("Playing %i\n", e2); |
electromotivated | 0:4f0a06335fbe | 70 | haptics.play_waveform(e2); |
electromotivated | 0:4f0a06335fbe | 71 | e2+=10; |
electromotivated | 0:4f0a06335fbe | 72 | if(e2 > 122) e2 = 2; |
electromotivated | 0:4f0a06335fbe | 73 | break; |
electromotivated | 0:4f0a06335fbe | 74 | case 0x800: |
electromotivated | 0:4f0a06335fbe | 75 | printf("Playing %i\n", e3); |
electromotivated | 0:4f0a06335fbe | 76 | haptics.play_waveform(e3); |
electromotivated | 0:4f0a06335fbe | 77 | e3+=10; |
electromotivated | 0:4f0a06335fbe | 78 | if(e3 > 123) e3 = 3; |
electromotivated | 0:4f0a06335fbe | 79 | break; |
electromotivated | 0:4f0a06335fbe | 80 | case 0x4: |
electromotivated | 0:4f0a06335fbe | 81 | printf("Playing %i\n", e4); |
electromotivated | 0:4f0a06335fbe | 82 | haptics.play_waveform(e4); |
electromotivated | 0:4f0a06335fbe | 83 | e4+=10; |
electromotivated | 0:4f0a06335fbe | 84 | if(e4 > 114) e4 = 4; |
electromotivated | 0:4f0a06335fbe | 85 | break; |
electromotivated | 0:4f0a06335fbe | 86 | case 0x40: |
electromotivated | 0:4f0a06335fbe | 87 | printf("Playing %i\n", e5); |
electromotivated | 0:4f0a06335fbe | 88 | haptics.play_waveform(e5); |
electromotivated | 0:4f0a06335fbe | 89 | e5+=10; |
electromotivated | 0:4f0a06335fbe | 90 | if(e5 > 115) e5 = 5; |
electromotivated | 0:4f0a06335fbe | 91 | break; |
electromotivated | 0:4f0a06335fbe | 92 | case 0x400: |
electromotivated | 0:4f0a06335fbe | 93 | printf("Playing %i\n", e6); |
electromotivated | 0:4f0a06335fbe | 94 | haptics.play_waveform(e6); |
electromotivated | 0:4f0a06335fbe | 95 | e6+=10; |
electromotivated | 0:4f0a06335fbe | 96 | if(e6 > 116) e6 = 6; |
electromotivated | 0:4f0a06335fbe | 97 | break; |
electromotivated | 0:4f0a06335fbe | 98 | case 0x2: |
electromotivated | 0:4f0a06335fbe | 99 | printf("Playing %i\n", e7); |
electromotivated | 0:4f0a06335fbe | 100 | haptics.play_waveform(e7); |
electromotivated | 0:4f0a06335fbe | 101 | e7+=10; |
electromotivated | 0:4f0a06335fbe | 102 | if(e7 > 117) e7 = 7; |
electromotivated | 0:4f0a06335fbe | 103 | break; |
electromotivated | 0:4f0a06335fbe | 104 | case 0x20: |
electromotivated | 0:4f0a06335fbe | 105 | printf("Playing %i\n", e8); |
electromotivated | 0:4f0a06335fbe | 106 | haptics.play_waveform(e8); |
electromotivated | 0:4f0a06335fbe | 107 | e8+=10; |
electromotivated | 0:4f0a06335fbe | 108 | if(e8 > 118) e8 = 8; |
electromotivated | 0:4f0a06335fbe | 109 | break; |
electromotivated | 0:4f0a06335fbe | 110 | case 0x200: |
electromotivated | 0:4f0a06335fbe | 111 | printf("Playing %i\n", e9); |
electromotivated | 0:4f0a06335fbe | 112 | haptics.play_waveform(e9); |
electromotivated | 0:4f0a06335fbe | 113 | e9+=10; |
electromotivated | 0:4f0a06335fbe | 114 | if(e9 > 119) e9 = 9; |
electromotivated | 0:4f0a06335fbe | 115 | break; |
electromotivated | 0:4f0a06335fbe | 116 | case 0x1: |
electromotivated | 0:4f0a06335fbe | 117 | printf("Playing %i\n", e10); |
electromotivated | 0:4f0a06335fbe | 118 | haptics.play_waveform(e10); |
electromotivated | 0:4f0a06335fbe | 119 | e10+=10; |
electromotivated | 0:4f0a06335fbe | 120 | if(e10 > 120) e10 = 10; |
electromotivated | 0:4f0a06335fbe | 121 | break; |
electromotivated | 0:4f0a06335fbe | 122 | case 0x10: |
electromotivated | 0:4f0a06335fbe | 123 | break; |
electromotivated | 0:4f0a06335fbe | 124 | case 0x100: |
electromotivated | 0:4f0a06335fbe | 125 | break; |
electromotivated | 0:4f0a06335fbe | 126 | } |
electromotivated | 0:4f0a06335fbe | 127 | } |
electromotivated | 0:4f0a06335fbe | 128 | |
electromotivated | 0:4f0a06335fbe | 129 | int main() { |
electromotivated | 0:4f0a06335fbe | 130 | // Set up Interrupts for MPR121 Cap Touch Driver/ Keypad |
electromotivated | 0:4f0a06335fbe | 131 | interrupt.fall(&fallInterrupt); |
electromotivated | 0:4f0a06335fbe | 132 | interrupt.mode(PullUp); |
electromotivated | 0:4f0a06335fbe | 133 | |
electromotivated | 0:4f0a06335fbe | 134 | // Daignostics Routine |
electromotivated | 0:4f0a06335fbe | 135 | printf("Diagnostics Result: %X\n", haptics.diagnostics()); |
electromotivated | 0:4f0a06335fbe | 136 | |
electromotivated | 0:4f0a06335fbe | 137 | // Initialization Procedure as outlined in Section 9.3 of Device Datasheet |
electromotivated | 0:4f0a06335fbe | 138 | printf("Calibration Result: %X\n",haptics.init(3.3)); |
electromotivated | 0:4f0a06335fbe | 139 | |
electromotivated | 0:4f0a06335fbe | 140 | // Daignostics Routine |
electromotivated | 0:4f0a06335fbe | 141 | printf("Diagnostics Result: %X\n", haptics.diagnostics()); |
electromotivated | 0:4f0a06335fbe | 142 | |
electromotivated | 0:4f0a06335fbe | 143 | // Play sequence of library waveforms as outlined in Section 9.3.2.1 of Device Datasheet |
electromotivated | 0:4f0a06335fbe | 144 | haptics.load_waveform_sequence(123,21,43,18,94,48,112,36); |
electromotivated | 0:4f0a06335fbe | 145 | haptics.play(); |
electromotivated | 0:4f0a06335fbe | 146 | while(haptics.i2cReadByte(GO)); // Wait for playback to complete |
electromotivated | 0:4f0a06335fbe | 147 | |
electromotivated | 0:4f0a06335fbe | 148 | wait(2); |
electromotivated | 0:4f0a06335fbe | 149 | |
electromotivated | 0:4f0a06335fbe | 150 | haptics.load_waveform_sequence(55,65); |
electromotivated | 0:4f0a06335fbe | 151 | haptics.play(); |
electromotivated | 0:4f0a06335fbe | 152 | while(haptics.i2cReadByte(GO)); // Wait for playback to complete |
electromotivated | 0:4f0a06335fbe | 153 | |
electromotivated | 0:4f0a06335fbe | 154 | wait(2); |
electromotivated | 0:4f0a06335fbe | 155 | |
electromotivated | 0:4f0a06335fbe | 156 | // Play a waveform corresponding to touch-keypad press |
electromotivated | 0:4f0a06335fbe | 157 | while(1); |
electromotivated | 0:4f0a06335fbe | 158 | } |