Estimating ball impact with more microphones

Dependencies:   SmartSwitch TMRh20 mbed

Committer:
gume
Date:
Tue Mar 22 08:26:09 2016 +0000
Revision:
3:f76bcafbbdd0
Parent:
2:5d075b76930a
Child:
4:6efe063cdbb2
- Change to 6 mics; - New type ID: 17; - New header format: 16 bit type ID, 4 bit Sample ID, 12 bit offset

Who changed what in which revision?

UserRevisionLine numberNew 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 3:f76bcafbbdd0 8 AnalogIn adc4(A4);
gume 3:f76bcafbbdd0 9 AnalogIn adc5(A5);
gume 3:f76bcafbbdd0 10
gume 0:7f49ac69d623 11
gume 0:7f49ac69d623 12 DigitalOut led(PA_8);
gume 0:7f49ac69d623 13 DeafNode *deafNode;
gume 0:7f49ac69d623 14 Serial pc(USBTX, USBRX);
gume 0:7f49ac69d623 15
gume 3:f76bcafbbdd0 16 #define SAMPLE_SIZE 480
gume 1:2b938172cef5 17 #define PRESAMPLE_SIZE 60
gume 3:f76bcafbbdd0 18 // Buffers to store the samples of the 6 channels
gume 0:7f49ac69d623 19 uint8_t buffer0[SAMPLE_SIZE];
gume 0:7f49ac69d623 20 uint8_t buffer1[SAMPLE_SIZE];
gume 0:7f49ac69d623 21 uint8_t buffer2[SAMPLE_SIZE];
gume 0:7f49ac69d623 22 uint8_t buffer3[SAMPLE_SIZE];
gume 3:f76bcafbbdd0 23 uint8_t buffer4[SAMPLE_SIZE];
gume 3:f76bcafbbdd0 24 uint8_t buffer5[SAMPLE_SIZE];
gume 0:7f49ac69d623 25
gume 3:f76bcafbbdd0 26
gume 3:f76bcafbbdd0 27 uint8_t sid;
gume 0:7f49ac69d623 28 int sample_start;
gume 0:7f49ac69d623 29 int sample_size;
gume 0:7f49ac69d623 30 int sample_pointer;
gume 0:7f49ac69d623 31
gume 0:7f49ac69d623 32 #define DCVAL 118
gume 0:7f49ac69d623 33 #define THRESHOLD 34
gume 0:7f49ac69d623 34
gume 0:7f49ac69d623 35 uint8_t datapacket[32];
gume 0:7f49ac69d623 36
gume 0:7f49ac69d623 37 volatile unsigned int TickCount;
gume 0:7f49ac69d623 38 extern "C" void SysTick_Handler (void)
gume 0:7f49ac69d623 39 {
gume 0:7f49ac69d623 40 TickCount+= 1;
gume 0:7f49ac69d623 41 }
gume 0:7f49ac69d623 42
gume 0:7f49ac69d623 43 void readMics()
gume 0:7f49ac69d623 44 {
gume 0:7f49ac69d623 45 buffer0[sample_pointer] = adc0.read_u16() >> 8;
gume 0:7f49ac69d623 46 buffer1[sample_pointer] = adc1.read_u16() >> 8;
gume 0:7f49ac69d623 47 buffer2[sample_pointer] = adc2.read_u16() >> 8;
gume 0:7f49ac69d623 48 buffer3[sample_pointer] = adc3.read_u16() >> 8;
gume 3:f76bcafbbdd0 49 buffer4[sample_pointer] = adc3.read_u16() >> 8;
gume 3:f76bcafbbdd0 50 buffer5[sample_pointer] = adc3.read_u16() >> 8;
gume 0:7f49ac69d623 51 }
gume 0:7f49ac69d623 52
gume 0:7f49ac69d623 53 bool checkThreshold()
gume 0:7f49ac69d623 54 {
gume 0:7f49ac69d623 55 bool threshold = false;
gume 0:7f49ac69d623 56
gume 0:7f49ac69d623 57 if (buffer0[sample_pointer] > DCVAL + THRESHOLD || buffer0[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 58 else if (buffer1[sample_pointer] > DCVAL + THRESHOLD || buffer1[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 59 else if (buffer2[sample_pointer] > DCVAL + THRESHOLD || buffer2[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 60 else if (buffer3[sample_pointer] > DCVAL + THRESHOLD || buffer3[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 3:f76bcafbbdd0 61 else if (buffer4[sample_pointer] > DCVAL + THRESHOLD || buffer4[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 3:f76bcafbbdd0 62 else if (buffer5[sample_pointer] > DCVAL + THRESHOLD || buffer5[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 63
gume 0:7f49ac69d623 64 return threshold;
gume 0:7f49ac69d623 65 }
gume 0:7f49ac69d623 66
gume 0:7f49ac69d623 67 void sendSamples(uint8_t id, uint8_t *samples, int length, int pointer)
gume 0:7f49ac69d623 68 {
gume 3:f76bcafbbdd0 69 // 0-1 bytes: type ID
gume 2:5d075b76930a 70 datapacket[0] = 0x00;
gume 3:f76bcafbbdd0 71 datapacket[1] = 0x11;
gume 2:5d075b76930a 72
gume 0:7f49ac69d623 73 int c = 0;
gume 0:7f49ac69d623 74 while (c < length) {
gume 0:7f49ac69d623 75 int j;
gume 3:f76bcafbbdd0 76 // 2-3 bytes: 4 bit sample ID, 12 bit offset (in 20 bytes)
gume 3:f76bcafbbdd0 77 datapacket[2] = id << 4 | (((c / 20) >> 8) & 0x0f);
gume 3:f76bcafbbdd0 78 datapacket[3] = (c / 20) & 0xff;
gume 2:5d075b76930a 79 for (j = 0; j < 20; j++) {
gume 2:5d075b76930a 80 datapacket[4 + j] = samples[pointer];
gume 0:7f49ac69d623 81 pointer++;
gume 2:5d075b76930a 82 if (pointer >= SAMPLE_SIZE) pointer = 0;
gume 0:7f49ac69d623 83 c++;
gume 0:7f49ac69d623 84 if (c > length) break;
gume 0:7f49ac69d623 85 }
gume 2:5d075b76930a 86 deafNode->sendData(0, datapacket, j + 4);
gume 0:7f49ac69d623 87 }
gume 0:7f49ac69d623 88 }
gume 0:7f49ac69d623 89
gume 0:7f49ac69d623 90 int main()
gume 0:7f49ac69d623 91 {
gume 0:7f49ac69d623 92 SysTick_Config(SystemCoreClock / 1000); // Systick in ms
gume 0:7f49ac69d623 93
gume 0:7f49ac69d623 94 pc.baud(115200);
gume 0:7f49ac69d623 95 pc.printf("Node started (%d MHz).\n", SystemCoreClock / 1000000);
gume 0:7f49ac69d623 96
gume 0:7f49ac69d623 97 NodeConfig nc;
gume 0:7f49ac69d623 98 nc.address = 0x4D31;
gume 0:7f49ac69d623 99 nc.netprefix = 0x424D45L;
gume 0:7f49ac69d623 100 nc.radioCE = D7;
gume 3:f76bcafbbdd0 101 nc.radioCS = D10;
gume 0:7f49ac69d623 102 nc.spi_sck = SPI_SCK;
gume 0:7f49ac69d623 103 nc.spi_miso = SPI_MISO;
gume 0:7f49ac69d623 104 nc.spi_mosi = SPI_MOSI;
gume 0:7f49ac69d623 105 nc.radioChannel = 96;
gume 0:7f49ac69d623 106 nc.radioSpeed = RF24_2MBPS;
gume 0:7f49ac69d623 107
gume 0:7f49ac69d623 108 deafNode = new DeafNode(&nc);
gume 0:7f49ac69d623 109 deafNode->setup();
gume 0:7f49ac69d623 110
gume 3:f76bcafbbdd0 111 sid = 0;
gume 0:7f49ac69d623 112 sample_start = 0;
gume 0:7f49ac69d623 113 sample_size = 0;
gume 0:7f49ac69d623 114 sample_pointer = 0;
gume 0:7f49ac69d623 115
gume 0:7f49ac69d623 116 bool action = false;
gume 0:7f49ac69d623 117
gume 0:7f49ac69d623 118 while(1) {
gume 0:7f49ac69d623 119
gume 0:7f49ac69d623 120 readMics();
gume 1:2b938172cef5 121 //pc.puts(".");
gume 0:7f49ac69d623 122
gume 0:7f49ac69d623 123 if (!action) {
gume 0:7f49ac69d623 124 // Not in action, just listening
gume 0:7f49ac69d623 125 if (checkThreshold()) {
gume 1:2b938172cef5 126 //pc.puts("\nThreshold reached!\n");
gume 0:7f49ac69d623 127 action = true;
gume 0:7f49ac69d623 128 if (sample_size > PRESAMPLE_SIZE) {
gume 0:7f49ac69d623 129 sample_size = PRESAMPLE_SIZE;
gume 0:7f49ac69d623 130 }
gume 0:7f49ac69d623 131 sample_start = sample_pointer - sample_size;
gume 1:2b938172cef5 132 if (sample_start < 0) sample_start += SAMPLE_SIZE;
gume 0:7f49ac69d623 133 }
gume 0:7f49ac69d623 134 sample_pointer++;
gume 2:5d075b76930a 135 if (sample_pointer >= SAMPLE_SIZE) sample_pointer = 0;
gume 0:7f49ac69d623 136 if (sample_size < SAMPLE_SIZE) sample_size++;
gume 0:7f49ac69d623 137 } else {
gume 0:7f49ac69d623 138 // In action, collecting
gume 0:7f49ac69d623 139 sample_pointer++;
gume 2:5d075b76930a 140 if (sample_pointer >= SAMPLE_SIZE) sample_pointer = 0;
gume 0:7f49ac69d623 141 sample_size++;
gume 0:7f49ac69d623 142 if (sample_size == SAMPLE_SIZE) {
gume 0:7f49ac69d623 143 // Stop collecting, send samples
gume 0:7f49ac69d623 144 action = false;
gume 2:5d075b76930a 145 for (int r = 1; r <= 2; r++) {
gume 3:f76bcafbbdd0 146 sendSamples(sid, buffer0, SAMPLE_SIZE, sample_start);
gume 3:f76bcafbbdd0 147 sendSamples(sid, buffer1, SAMPLE_SIZE, sample_start);
gume 3:f76bcafbbdd0 148 sendSamples(sid, buffer2, SAMPLE_SIZE, sample_start);
gume 3:f76bcafbbdd0 149 sendSamples(sid, buffer3, SAMPLE_SIZE, sample_start);
gume 3:f76bcafbbdd0 150 sendSamples(sid, buffer4, SAMPLE_SIZE, sample_start);
gume 3:f76bcafbbdd0 151 sendSamples(sid, buffer5, SAMPLE_SIZE, sample_start);
gume 2:5d075b76930a 152 printf("\nSamples were sent (%d).\n", r);
gume 2:5d075b76930a 153 }
gume 3:f76bcafbbdd0 154 sid++;
gume 0:7f49ac69d623 155 sample_size = 0;
gume 0:7f49ac69d623 156 sample_pointer = 0;
gume 0:7f49ac69d623 157 }
gume 0:7f49ac69d623 158 }
gume 0:7f49ac69d623 159 }
gume 0:7f49ac69d623 160 }