Estimating ball impact with more microphones
Dependencies: SmartSwitch TMRh20 mbed
main.cpp@0:7f49ac69d623, 2016-03-17 (annotated)
- Committer:
- gume
- Date:
- Thu Mar 17 11:15:02 2016 +0000
- Revision:
- 0:7f49ac69d623
- Child:
- 1:2b938172cef5
- Initial commit. Full functionality, RF is working. Not tested with real microphones.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gume | 0:7f49ac69d623 | 1 | #include "mbed.h" |
gume | 0:7f49ac69d623 | 2 | #include "DeafNode.h" |
gume | 0:7f49ac69d623 | 3 | |
gume | 0:7f49ac69d623 | 4 | AnalogIn adc0(A0); |
gume | 0:7f49ac69d623 | 5 | AnalogIn adc1(A1); |
gume | 0:7f49ac69d623 | 6 | AnalogIn adc2(A2); |
gume | 0:7f49ac69d623 | 7 | AnalogIn adc3(A3); |
gume | 0:7f49ac69d623 | 8 | |
gume | 0:7f49ac69d623 | 9 | DigitalOut led(PA_8); |
gume | 0:7f49ac69d623 | 10 | DeafNode *deafNode; |
gume | 0:7f49ac69d623 | 11 | Serial pc(USBTX, USBRX); |
gume | 0:7f49ac69d623 | 12 | |
gume | 0:7f49ac69d623 | 13 | #define SAMPLE_SIZE 240 |
gume | 0:7f49ac69d623 | 14 | #define PRESAMPLE_SIZE 10 |
gume | 0:7f49ac69d623 | 15 | // Buffers to store the samples of the 4 channels |
gume | 0:7f49ac69d623 | 16 | uint8_t buffer0[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 17 | uint8_t buffer1[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 18 | uint8_t buffer2[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 19 | uint8_t buffer3[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 20 | |
gume | 0:7f49ac69d623 | 21 | int sample_start; |
gume | 0:7f49ac69d623 | 22 | int sample_size; |
gume | 0:7f49ac69d623 | 23 | int sample_pointer; |
gume | 0:7f49ac69d623 | 24 | |
gume | 0:7f49ac69d623 | 25 | #define DCVAL 118 |
gume | 0:7f49ac69d623 | 26 | #define THRESHOLD 34 |
gume | 0:7f49ac69d623 | 27 | |
gume | 0:7f49ac69d623 | 28 | uint8_t datapacket[32]; |
gume | 0:7f49ac69d623 | 29 | |
gume | 0:7f49ac69d623 | 30 | volatile unsigned int TickCount; |
gume | 0:7f49ac69d623 | 31 | extern "C" void SysTick_Handler (void) |
gume | 0:7f49ac69d623 | 32 | { |
gume | 0:7f49ac69d623 | 33 | TickCount+= 1; |
gume | 0:7f49ac69d623 | 34 | } |
gume | 0:7f49ac69d623 | 35 | |
gume | 0:7f49ac69d623 | 36 | void readMics() |
gume | 0:7f49ac69d623 | 37 | { |
gume | 0:7f49ac69d623 | 38 | buffer0[sample_pointer] = adc0.read_u16() >> 8; |
gume | 0:7f49ac69d623 | 39 | buffer1[sample_pointer] = adc1.read_u16() >> 8; |
gume | 0:7f49ac69d623 | 40 | buffer2[sample_pointer] = adc2.read_u16() >> 8; |
gume | 0:7f49ac69d623 | 41 | buffer3[sample_pointer] = adc3.read_u16() >> 8; |
gume | 0:7f49ac69d623 | 42 | } |
gume | 0:7f49ac69d623 | 43 | |
gume | 0:7f49ac69d623 | 44 | bool checkThreshold() |
gume | 0:7f49ac69d623 | 45 | { |
gume | 0:7f49ac69d623 | 46 | bool threshold = false; |
gume | 0:7f49ac69d623 | 47 | |
gume | 0:7f49ac69d623 | 48 | if (buffer0[sample_pointer] > DCVAL + THRESHOLD || buffer0[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 49 | else if (buffer1[sample_pointer] > DCVAL + THRESHOLD || buffer1[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 50 | else if (buffer2[sample_pointer] > DCVAL + THRESHOLD || buffer2[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 51 | else if (buffer3[sample_pointer] > DCVAL + THRESHOLD || buffer3[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 52 | |
gume | 0:7f49ac69d623 | 53 | return threshold; |
gume | 0:7f49ac69d623 | 54 | } |
gume | 0:7f49ac69d623 | 55 | |
gume | 0:7f49ac69d623 | 56 | void sendSamples(uint8_t id, uint8_t *samples, int length, int pointer) |
gume | 0:7f49ac69d623 | 57 | { |
gume | 0:7f49ac69d623 | 58 | datapacket[0] = id; |
gume | 0:7f49ac69d623 | 59 | int c = 0; |
gume | 0:7f49ac69d623 | 60 | while (c < length) { |
gume | 0:7f49ac69d623 | 61 | int j; |
gume | 0:7f49ac69d623 | 62 | for (j = 0; j < 24; j++) { |
gume | 0:7f49ac69d623 | 63 | datapacket[1 + j] = samples[pointer]; |
gume | 0:7f49ac69d623 | 64 | pointer++; |
gume | 0:7f49ac69d623 | 65 | if (pointer > length) pointer = 0; |
gume | 0:7f49ac69d623 | 66 | c++; |
gume | 0:7f49ac69d623 | 67 | if (c > length) break; |
gume | 0:7f49ac69d623 | 68 | } |
gume | 0:7f49ac69d623 | 69 | deafNode->sendData(0, datapacket, j + 1); |
gume | 0:7f49ac69d623 | 70 | } |
gume | 0:7f49ac69d623 | 71 | } |
gume | 0:7f49ac69d623 | 72 | |
gume | 0:7f49ac69d623 | 73 | int main() |
gume | 0:7f49ac69d623 | 74 | { |
gume | 0:7f49ac69d623 | 75 | SysTick_Config(SystemCoreClock / 1000); // Systick in ms |
gume | 0:7f49ac69d623 | 76 | |
gume | 0:7f49ac69d623 | 77 | pc.baud(115200); |
gume | 0:7f49ac69d623 | 78 | pc.printf("Node started (%d MHz).\n", SystemCoreClock / 1000000); |
gume | 0:7f49ac69d623 | 79 | |
gume | 0:7f49ac69d623 | 80 | NodeConfig nc; |
gume | 0:7f49ac69d623 | 81 | nc.address = 0x4D31; |
gume | 0:7f49ac69d623 | 82 | nc.netprefix = 0x424D45L; |
gume | 0:7f49ac69d623 | 83 | nc.radioCE = D7; |
gume | 0:7f49ac69d623 | 84 | nc.radioCS = D8; |
gume | 0:7f49ac69d623 | 85 | nc.spi_sck = SPI_SCK; |
gume | 0:7f49ac69d623 | 86 | nc.spi_miso = SPI_MISO; |
gume | 0:7f49ac69d623 | 87 | nc.spi_mosi = SPI_MOSI; |
gume | 0:7f49ac69d623 | 88 | nc.radioChannel = 96; |
gume | 0:7f49ac69d623 | 89 | nc.radioSpeed = RF24_2MBPS; |
gume | 0:7f49ac69d623 | 90 | |
gume | 0:7f49ac69d623 | 91 | deafNode = new DeafNode(&nc); |
gume | 0:7f49ac69d623 | 92 | deafNode->setup(); |
gume | 0:7f49ac69d623 | 93 | |
gume | 0:7f49ac69d623 | 94 | sample_start = 0; |
gume | 0:7f49ac69d623 | 95 | sample_size = 0; |
gume | 0:7f49ac69d623 | 96 | sample_pointer = 0; |
gume | 0:7f49ac69d623 | 97 | |
gume | 0:7f49ac69d623 | 98 | bool action = false; |
gume | 0:7f49ac69d623 | 99 | |
gume | 0:7f49ac69d623 | 100 | while(1) { |
gume | 0:7f49ac69d623 | 101 | |
gume | 0:7f49ac69d623 | 102 | readMics(); |
gume | 0:7f49ac69d623 | 103 | pc.puts("."); |
gume | 0:7f49ac69d623 | 104 | |
gume | 0:7f49ac69d623 | 105 | if (!action) { |
gume | 0:7f49ac69d623 | 106 | // Not in action, just listening |
gume | 0:7f49ac69d623 | 107 | if (checkThreshold()) { |
gume | 0:7f49ac69d623 | 108 | pc.puts("\nThreshold reached!\n"); |
gume | 0:7f49ac69d623 | 109 | action = true; |
gume | 0:7f49ac69d623 | 110 | if (sample_size > PRESAMPLE_SIZE) { |
gume | 0:7f49ac69d623 | 111 | sample_size = PRESAMPLE_SIZE; |
gume | 0:7f49ac69d623 | 112 | } |
gume | 0:7f49ac69d623 | 113 | sample_start = sample_pointer - sample_size; |
gume | 0:7f49ac69d623 | 114 | } |
gume | 0:7f49ac69d623 | 115 | sample_pointer++; |
gume | 0:7f49ac69d623 | 116 | if (sample_pointer > SAMPLE_SIZE) sample_pointer = 0; |
gume | 0:7f49ac69d623 | 117 | if (sample_size < SAMPLE_SIZE) sample_size++; |
gume | 0:7f49ac69d623 | 118 | } else { |
gume | 0:7f49ac69d623 | 119 | // In action, collecting |
gume | 0:7f49ac69d623 | 120 | sample_pointer++; |
gume | 0:7f49ac69d623 | 121 | if (sample_pointer > SAMPLE_SIZE) sample_pointer = 0; |
gume | 0:7f49ac69d623 | 122 | sample_size++; |
gume | 0:7f49ac69d623 | 123 | if (sample_size == SAMPLE_SIZE) { |
gume | 0:7f49ac69d623 | 124 | // Stop collecting, send samples |
gume | 0:7f49ac69d623 | 125 | action = false; |
gume | 0:7f49ac69d623 | 126 | printf("\nSending samples.\n"); |
gume | 0:7f49ac69d623 | 127 | sendSamples(0, buffer0, SAMPLE_SIZE, sample_pointer); |
gume | 0:7f49ac69d623 | 128 | sendSamples(1, buffer1, SAMPLE_SIZE, sample_pointer); |
gume | 0:7f49ac69d623 | 129 | sendSamples(2, buffer2, SAMPLE_SIZE, sample_pointer); |
gume | 0:7f49ac69d623 | 130 | sendSamples(3, buffer3, SAMPLE_SIZE, sample_pointer); |
gume | 0:7f49ac69d623 | 131 | sample_size = 0; |
gume | 0:7f49ac69d623 | 132 | sample_pointer = 0; |
gume | 0:7f49ac69d623 | 133 | } |
gume | 0:7f49ac69d623 | 134 | } |
gume | 0:7f49ac69d623 | 135 | } |
gume | 0:7f49ac69d623 | 136 | } |