Estimating ball impact with more microphones

Dependencies:   SmartSwitch TMRh20 mbed

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?

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 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 }