Estimating ball impact with more microphones

Dependencies:   SmartSwitch TMRh20 mbed

Committer:
gume
Date:
Thu Mar 24 14:10:13 2016 +0000
Revision:
5:ed147c3ecb57
Parent:
4:6efe063cdbb2
- Chnaged to 960 samples

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 5:ed147c3ecb57 9 //AnalogIn adc5(A5);
gume 5:ed147c3ecb57 10 //AnalogIn adc5(D0);
gume 0:7f49ac69d623 11
gume 4:6efe063cdbb2 12 DigitalOut led(D3);
gume 0:7f49ac69d623 13 DeafNode *deafNode;
gume 0:7f49ac69d623 14 Serial pc(USBTX, USBRX);
gume 0:7f49ac69d623 15
gume 5:ed147c3ecb57 16 #define SAMPLE_SIZE 960
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 5:ed147c3ecb57 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 4:6efe063cdbb2 49 buffer4[sample_pointer] = adc4.read_u16() >> 8;
gume 5:ed147c3ecb57 50 // buffer5[sample_pointer] = adc5.read_u16() >> 8;
gume 4:6efe063cdbb2 51
gume 4:6efe063cdbb2 52 //buffer0[sample_pointer] = 120;
gume 4:6efe063cdbb2 53 //buffer1[sample_pointer] = 121;
gume 4:6efe063cdbb2 54 //buffer2[sample_pointer] = 122;
gume 4:6efe063cdbb2 55 //buffer3[sample_pointer] = 123;
gume 4:6efe063cdbb2 56 //buffer4[sample_pointer] = 124;
gume 4:6efe063cdbb2 57 //buffer5[sample_pointer] = 125;
gume 0:7f49ac69d623 58 }
gume 0:7f49ac69d623 59
gume 0:7f49ac69d623 60 bool checkThreshold()
gume 0:7f49ac69d623 61 {
gume 0:7f49ac69d623 62 bool threshold = false;
gume 0:7f49ac69d623 63
gume 0:7f49ac69d623 64 if (buffer0[sample_pointer] > DCVAL + THRESHOLD || buffer0[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 65 else if (buffer1[sample_pointer] > DCVAL + THRESHOLD || buffer1[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 66 else if (buffer2[sample_pointer] > DCVAL + THRESHOLD || buffer2[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 67 else if (buffer3[sample_pointer] > DCVAL + THRESHOLD || buffer3[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 3:f76bcafbbdd0 68 else if (buffer4[sample_pointer] > DCVAL + THRESHOLD || buffer4[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 5:ed147c3ecb57 69 // else if (buffer5[sample_pointer] > DCVAL + THRESHOLD || buffer5[sample_pointer] < DCVAL - THRESHOLD) threshold = true;
gume 0:7f49ac69d623 70
gume 0:7f49ac69d623 71 return threshold;
gume 0:7f49ac69d623 72 }
gume 0:7f49ac69d623 73
gume 4:6efe063cdbb2 74 void sendSamples(uint8_t sid, uint8_t mid, uint8_t *samples, int length, int pointer)
gume 0:7f49ac69d623 75 {
gume 3:f76bcafbbdd0 76 // 0-1 bytes: type ID
gume 2:5d075b76930a 77 datapacket[0] = 0x00;
gume 3:f76bcafbbdd0 78 datapacket[1] = 0x11;
gume 4:6efe063cdbb2 79 datapacket[2] = sid << 4 | mid & 0x0f;
gume 2:5d075b76930a 80
gume 0:7f49ac69d623 81 int c = 0;
gume 0:7f49ac69d623 82 while (c < length) {
gume 0:7f49ac69d623 83 int j;
gume 3:f76bcafbbdd0 84 // 2-3 bytes: 4 bit sample ID, 12 bit offset (in 20 bytes)
gume 4:6efe063cdbb2 85
gume 4:6efe063cdbb2 86 datapacket[3] = (c / 20);
gume 2:5d075b76930a 87 for (j = 0; j < 20; j++) {
gume 2:5d075b76930a 88 datapacket[4 + j] = samples[pointer];
gume 0:7f49ac69d623 89 pointer++;
gume 2:5d075b76930a 90 if (pointer >= SAMPLE_SIZE) pointer = 0;
gume 0:7f49ac69d623 91 c++;
gume 0:7f49ac69d623 92 if (c > length) break;
gume 0:7f49ac69d623 93 }
gume 2:5d075b76930a 94 deafNode->sendData(0, datapacket, j + 4);
gume 0:7f49ac69d623 95 }
gume 0:7f49ac69d623 96 }
gume 0:7f49ac69d623 97
gume 0:7f49ac69d623 98 int main()
gume 0:7f49ac69d623 99 {
gume 4:6efe063cdbb2 100 led = 0;
gume 0:7f49ac69d623 101 SysTick_Config(SystemCoreClock / 1000); // Systick in ms
gume 0:7f49ac69d623 102
gume 0:7f49ac69d623 103 pc.baud(115200);
gume 0:7f49ac69d623 104 pc.printf("Node started (%d MHz).\n", SystemCoreClock / 1000000);
gume 0:7f49ac69d623 105
gume 0:7f49ac69d623 106 NodeConfig nc;
gume 0:7f49ac69d623 107 nc.address = 0x4D31;
gume 0:7f49ac69d623 108 nc.netprefix = 0x424D45L;
gume 4:6efe063cdbb2 109 nc.radioCE = D9;
gume 3:f76bcafbbdd0 110 nc.radioCS = D10;
gume 0:7f49ac69d623 111 nc.spi_sck = SPI_SCK;
gume 0:7f49ac69d623 112 nc.spi_miso = SPI_MISO;
gume 0:7f49ac69d623 113 nc.spi_mosi = SPI_MOSI;
gume 0:7f49ac69d623 114 nc.radioChannel = 96;
gume 0:7f49ac69d623 115 nc.radioSpeed = RF24_2MBPS;
gume 0:7f49ac69d623 116
gume 0:7f49ac69d623 117 deafNode = new DeafNode(&nc);
gume 0:7f49ac69d623 118 deafNode->setup();
gume 0:7f49ac69d623 119
gume 4:6efe063cdbb2 120 if (deafNode->isRadioWorking()) {
gume 4:6efe063cdbb2 121 pc.printf("Radio is working.\n");
gume 4:6efe063cdbb2 122 led = 1;
gume 4:6efe063cdbb2 123 }
gume 3:f76bcafbbdd0 124 sid = 0;
gume 0:7f49ac69d623 125 sample_start = 0;
gume 0:7f49ac69d623 126 sample_size = 0;
gume 0:7f49ac69d623 127 sample_pointer = 0;
gume 0:7f49ac69d623 128
gume 0:7f49ac69d623 129 bool action = false;
gume 0:7f49ac69d623 130
gume 0:7f49ac69d623 131 while(1) {
gume 0:7f49ac69d623 132
gume 0:7f49ac69d623 133 readMics();
gume 1:2b938172cef5 134 //pc.puts(".");
gume 0:7f49ac69d623 135
gume 0:7f49ac69d623 136 if (!action) {
gume 0:7f49ac69d623 137 // Not in action, just listening
gume 0:7f49ac69d623 138 if (checkThreshold()) {
gume 1:2b938172cef5 139 //pc.puts("\nThreshold reached!\n");
gume 0:7f49ac69d623 140 action = true;
gume 0:7f49ac69d623 141 if (sample_size > PRESAMPLE_SIZE) {
gume 0:7f49ac69d623 142 sample_size = PRESAMPLE_SIZE;
gume 0:7f49ac69d623 143 }
gume 0:7f49ac69d623 144 sample_start = sample_pointer - sample_size;
gume 1:2b938172cef5 145 if (sample_start < 0) sample_start += SAMPLE_SIZE;
gume 0:7f49ac69d623 146 }
gume 0:7f49ac69d623 147 sample_pointer++;
gume 2:5d075b76930a 148 if (sample_pointer >= SAMPLE_SIZE) sample_pointer = 0;
gume 0:7f49ac69d623 149 if (sample_size < SAMPLE_SIZE) sample_size++;
gume 0:7f49ac69d623 150 } else {
gume 0:7f49ac69d623 151 // In action, collecting
gume 0:7f49ac69d623 152 sample_pointer++;
gume 2:5d075b76930a 153 if (sample_pointer >= SAMPLE_SIZE) sample_pointer = 0;
gume 0:7f49ac69d623 154 sample_size++;
gume 0:7f49ac69d623 155 if (sample_size == SAMPLE_SIZE) {
gume 0:7f49ac69d623 156 // Stop collecting, send samples
gume 0:7f49ac69d623 157 action = false;
gume 2:5d075b76930a 158 for (int r = 1; r <= 2; r++) {
gume 4:6efe063cdbb2 159 sendSamples(sid, 0, buffer0, SAMPLE_SIZE, sample_start);
gume 4:6efe063cdbb2 160 sendSamples(sid, 1, buffer1, SAMPLE_SIZE, sample_start);
gume 4:6efe063cdbb2 161 sendSamples(sid, 2, buffer2, SAMPLE_SIZE, sample_start);
gume 4:6efe063cdbb2 162 sendSamples(sid, 3, buffer3, SAMPLE_SIZE, sample_start);
gume 4:6efe063cdbb2 163 sendSamples(sid, 4, buffer4, SAMPLE_SIZE, sample_start);
gume 5:ed147c3ecb57 164 // sendSamples(sid, 5, buffer5, SAMPLE_SIZE, sample_start);
gume 2:5d075b76930a 165 printf("\nSamples were sent (%d).\n", r);
gume 2:5d075b76930a 166 }
gume 3:f76bcafbbdd0 167 sid++;
gume 0:7f49ac69d623 168 sample_size = 0;
gume 0:7f49ac69d623 169 sample_pointer = 0;
gume 0:7f49ac69d623 170 }
gume 0:7f49ac69d623 171 }
gume 0:7f49ac69d623 172 }
gume 0:7f49ac69d623 173 }