Aditya Mehrotra
/
Sensor_Training_BoardV2
main.cpp@6:12ff056ab2c1, 2022-01-19 (annotated)
- Committer:
- saloutos
- Date:
- Wed Jan 19 19:32:40 2022 +0000
- Revision:
- 6:12ff056ab2c1
- Parent:
- 5:e4e96d1b446f
added rezeroing of the ATI sensor ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adimmit | 0:63fac75e5afc | 1 | /* mbed Microcontroller Library |
adimmit | 0:63fac75e5afc | 2 | * Copyright (c) 2019 ARM Limited |
adimmit | 0:63fac75e5afc | 3 | * SPDX-License-Identifier: Apache-2.0 |
adimmit | 0:63fac75e5afc | 4 | */ |
adimmit | 0:63fac75e5afc | 5 | |
adimmit | 0:63fac75e5afc | 6 | #include "mbed.h" |
adimmit | 0:63fac75e5afc | 7 | #include "platform/mbed_thread.h" |
adimmit | 1:466049963f1f | 8 | #include "ltc_message.h" |
adimmit | 0:63fac75e5afc | 9 | #include <SPI.h> |
adimmit | 1:466049963f1f | 10 | #include "EthernetInterface.h" |
saloutos | 2:bdfce41aae53 | 11 | #include "bmp3.h" |
saloutos | 2:bdfce41aae53 | 12 | |
saloutos | 3:4dcadafb89a2 | 13 | /*---------------------- Initial setup ----------------------*/ |
saloutos | 3:4dcadafb89a2 | 14 | // Serial port |
saloutos | 3:4dcadafb89a2 | 15 | Serial pc(USBTX, USBRX); |
saloutos | 4:ab834eebd496 | 16 | // Ticker for logging from LTC at a fixed frequency |
saloutos | 4:ab834eebd496 | 17 | Ticker LTC_log; |
saloutos | 4:ab834eebd496 | 18 | // Ticker for logging from force sensor, sending ethernet message at a fixed frequency |
saloutos | 4:ab834eebd496 | 19 | Ticker eth_send; |
saloutos | 4:ab834eebd496 | 20 | bool LTC_ticker_activated = false; |
saloutos | 4:ab834eebd496 | 21 | bool eth_ticker_activated = false; |
saloutos | 4:ab834eebd496 | 22 | void log_LTC_data(){ |
saloutos | 4:ab834eebd496 | 23 | LTC_ticker_activated = true; |
saloutos | 3:4dcadafb89a2 | 24 | } |
saloutos | 4:ab834eebd496 | 25 | void send_eth_data(){ |
saloutos | 4:ab834eebd496 | 26 | eth_ticker_activated = true; |
saloutos | 4:ab834eebd496 | 27 | } |
adimmit | 0:63fac75e5afc | 28 | |
saloutos | 3:4dcadafb89a2 | 29 | /*---------------------- Ethernet setup ----------------------*/ |
saloutos | 5:e4e96d1b446f | 30 | const int SERVER_PORT = 11223; |
saloutos | 6:12ff056ab2c1 | 31 | const char* SERVER_ADDRESS = "192.168.1.200"; // Adress of the other Mbed (Mbed B) |
saloutos | 5:e4e96d1b446f | 32 | const int LOCAL_PORT = 11223; |
saloutos | 3:4dcadafb89a2 | 33 | const char* ip = "192.168.1.1"; // Mbed A = 1; Mbed B = 2 |
saloutos | 3:4dcadafb89a2 | 34 | const char* mask = "255.255.255.0"; |
saloutos | 3:4dcadafb89a2 | 35 | const char* gateway = "192.168.1.10"; |
saloutos | 3:4dcadafb89a2 | 36 | EthernetInterface eth; // network stack |
saloutos | 3:4dcadafb89a2 | 37 | SocketAddress local; // local address |
saloutos | 3:4dcadafb89a2 | 38 | SocketAddress client; // client address (connection to other board) |
saloutos | 3:4dcadafb89a2 | 39 | UDPSocket server; // UDP socket (peripheral on this board) |
saloutos | 3:4dcadafb89a2 | 40 | |
saloutos | 3:4dcadafb89a2 | 41 | // Messages to fill and send over ethernet |
saloutos | 3:4dcadafb89a2 | 42 | // buffer length is 6*6 + 11*8 + 14 = 138 |
saloutos | 3:4dcadafb89a2 | 43 | char send_buf[138]; |
saloutos | 3:4dcadafb89a2 | 44 | |
saloutos | 5:e4e96d1b446f | 45 | // timer to include dt in messages |
saloutos | 5:e4e96d1b446f | 46 | Timer msg_timer; |
saloutos | 5:e4e96d1b446f | 47 | |
saloutos | 5:e4e96d1b446f | 48 | |
saloutos | 3:4dcadafb89a2 | 49 | /*---------------------- IMU setup ----------------------*/ |
saloutos | 6:12ff056ab2c1 | 50 | // TODO: add this so that we can collect hand-held data |
saloutos | 6:12ff056ab2c1 | 51 | |
saloutos | 3:4dcadafb89a2 | 52 | |
saloutos | 3:4dcadafb89a2 | 53 | |
saloutos | 3:4dcadafb89a2 | 54 | /*---------------------- LTC chip setup ----------------------*/ |
adimmit | 0:63fac75e5afc | 55 | #define LTC_MOSI PB_2 |
adimmit | 0:63fac75e5afc | 56 | #define LTC_MISO PC_11 |
adimmit | 0:63fac75e5afc | 57 | #define LTC_CLK PC_10 |
adimmit | 0:63fac75e5afc | 58 | #define LTC_CS PA_15 |
adimmit | 0:63fac75e5afc | 59 | #define BSY PB_5 |
adimmit | 0:63fac75e5afc | 60 | #define CNV PB_6 |
adimmit | 0:63fac75e5afc | 61 | |
saloutos | 2:bdfce41aae53 | 62 | #define BUFF_SIZE 18 //24 // 24, 8-bit words will come through |
saloutos | 2:bdfce41aae53 | 63 | #define NUM_CHANNELS 6 //8 // 8 total channels |
adimmit | 1:466049963f1f | 64 | #define CH_SIZE 3 // 3 words / channel |
adimmit | 0:63fac75e5afc | 65 | |
saloutos | 3:4dcadafb89a2 | 66 | SPI LTC_chip(LTC_MOSI, LTC_MISO, LTC_CLK); |
adimmit | 0:63fac75e5afc | 67 | DigitalOut cs_LTC(LTC_CS); |
adimmit | 0:63fac75e5afc | 68 | DigitalIn bsy_LTC(BSY); |
adimmit | 0:63fac75e5afc | 69 | DigitalOut CNV_PIN(CNV); |
adimmit | 0:63fac75e5afc | 70 | |
saloutos | 2:bdfce41aae53 | 71 | float CONV_FACTOR = 0.00031294782f; //--> for -10.24 --> 10.24V |
saloutos | 3:4dcadafb89a2 | 72 | // receive and store data from LTC chip |
adimmit | 1:466049963f1f | 73 | uint8_t rx_buff[BUFF_SIZE]; //each is an 8-bit word |
adimmit | 1:466049963f1f | 74 | ltc_spi adc_data; |
saloutos | 3:4dcadafb89a2 | 75 | int16_t ati_data[6]; |
saloutos | 4:ab834eebd496 | 76 | float ati_filt[6]; |
saloutos | 6:12ff056ab2c1 | 77 | float FILT_COEF = 1.0f; //0.10f; |
adimmit | 0:63fac75e5afc | 78 | |
saloutos | 3:4dcadafb89a2 | 79 | // calibration matrix for ATI sensor |
saloutos | 3:4dcadafb89a2 | 80 | float Fxc[6] = {-0.1971322934773, -0.04349257334311, 2.298051028435, -80.35044049387, 1.362983909976, 78.23673392118}; |
saloutos | 3:4dcadafb89a2 | 81 | float Fyc[6] = {-0.855555082028, 90.04004739944, -0.2236363056212, -46.22515556189, 0.4634720862657, -45.33866366008}; |
saloutos | 3:4dcadafb89a2 | 82 | float Fzc[6] = {126.0118743229, -3.400673797001, 125.6239720415, -3.58428375801, 124.6128824882, -3.121863244239}; |
saloutos | 3:4dcadafb89a2 | 83 | float Mxc[6] = {-0.03257086475743, 1.078228404461, -4.281073433774, -0.4388170286617, 4.26206973335, 7 - 0.6391561102933}; // check that these rows are x,y,z too |
saloutos | 3:4dcadafb89a2 | 84 | float Myc[6] = {5.013689449541, -0.1348267445261, -2.487858919058, 1.036624778844, -2.465023328927, -0.8776820303935}; |
saloutos | 3:4dcadafb89a2 | 85 | float Mzc[6] = {0.03045090196646, -2.681788264229, 0.06994993822276, -2.787067635975, -0.04822780843519, -2.696991001959}; |
saloutos | 3:4dcadafb89a2 | 86 | // bias terms |
saloutos | 3:4dcadafb89a2 | 87 | float bias[6]; |
saloutos | 3:4dcadafb89a2 | 88 | // convert forces and torques |
saloutos | 3:4dcadafb89a2 | 89 | float ft_data[6]; |
saloutos | 3:4dcadafb89a2 | 90 | |
saloutos | 3:4dcadafb89a2 | 91 | // send 6 configuration words with the 6 channel numbers, still the default softspan 7 conversion |
saloutos | 3:4dcadafb89a2 | 92 | void config_LTC(){ |
saloutos | 3:4dcadafb89a2 | 93 | uint8_t discard; |
saloutos | 3:4dcadafb89a2 | 94 | cs_LTC=0; |
saloutos | 3:4dcadafb89a2 | 95 | // set sampling order for channels 0-5 |
saloutos | 3:4dcadafb89a2 | 96 | discard = LTC_chip.write(0b10000111); // byte is 7:V, 6:0, 5-3:ID, 2-0:mode |
saloutos | 3:4dcadafb89a2 | 97 | discard = LTC_chip.write(0b10001111); |
saloutos | 3:4dcadafb89a2 | 98 | discard = LTC_chip.write(0b10010111); |
saloutos | 3:4dcadafb89a2 | 99 | discard = LTC_chip.write(0b10011111); |
saloutos | 3:4dcadafb89a2 | 100 | discard = LTC_chip.write(0b10100111); |
saloutos | 3:4dcadafb89a2 | 101 | discard = LTC_chip.write(0b10101111); |
saloutos | 3:4dcadafb89a2 | 102 | cs_LTC=1; |
saloutos | 3:4dcadafb89a2 | 103 | } |
adimmit | 0:63fac75e5afc | 104 | |
saloutos | 3:4dcadafb89a2 | 105 | void read_LTC_data() { |
saloutos | 3:4dcadafb89a2 | 106 | |
saloutos | 3:4dcadafb89a2 | 107 | // right now, programmed LTC chip to only sample 6 channels, starting at channel 0 on next conversion (in config_LTC)...also changed number of channels variables |
saloutos | 3:4dcadafb89a2 | 108 | // TODO: could also decode channel ID from bits 4-6 of the info byte in message packet, assign to correct adc channel |
saloutos | 3:4dcadafb89a2 | 109 | // TODO: could also include next channel for sampling in each conversion message |
saloutos | 3:4dcadafb89a2 | 110 | |
saloutos | 3:4dcadafb89a2 | 111 | // sample from all channels |
saloutos | 3:4dcadafb89a2 | 112 | for (int i = 0; i<NUM_CHANNELS; i++) { |
saloutos | 3:4dcadafb89a2 | 113 | //request conversion |
saloutos | 3:4dcadafb89a2 | 114 | CNV_PIN=1; |
saloutos | 3:4dcadafb89a2 | 115 | wait_ns(60); // wait for 60ns |
saloutos | 3:4dcadafb89a2 | 116 | CNV_PIN=0; |
saloutos | 3:4dcadafb89a2 | 117 | //WAIT FOR BSY --> bsy_LTC |
saloutos | 3:4dcadafb89a2 | 118 | while(bsy_LTC==1){} |
saloutos | 3:4dcadafb89a2 | 119 | //debugging ONLY |
saloutos | 3:4dcadafb89a2 | 120 | wait_us(1); |
saloutos | 3:4dcadafb89a2 | 121 | //then ask for data |
saloutos | 3:4dcadafb89a2 | 122 | cs_LTC=0; |
saloutos | 3:4dcadafb89a2 | 123 | //read data |
saloutos | 3:4dcadafb89a2 | 124 | int bytecount = CH_SIZE*i; |
saloutos | 3:4dcadafb89a2 | 125 | while(bytecount < CH_SIZE*(1+i)){ |
saloutos | 3:4dcadafb89a2 | 126 | rx_buff[bytecount] = LTC_chip.write(0x00); |
saloutos | 3:4dcadafb89a2 | 127 | bytecount++; |
saloutos | 3:4dcadafb89a2 | 128 | } |
saloutos | 3:4dcadafb89a2 | 129 | cs_LTC=1; //lift CS |
saloutos | 3:4dcadafb89a2 | 130 | } |
saloutos | 3:4dcadafb89a2 | 131 | // fill adc data struct with received bytes |
saloutos | 3:4dcadafb89a2 | 132 | for(int i = 0; i < BUFF_SIZE; i++){ |
saloutos | 3:4dcadafb89a2 | 133 | ((uint8_t*)(&adc_data))[i] = rx_buff[i]; |
saloutos | 3:4dcadafb89a2 | 134 | } |
saloutos | 3:4dcadafb89a2 | 135 | // pull out voltage data here |
saloutos | 3:4dcadafb89a2 | 136 | ati_data[0] = adc_data.channel[0].cnv_upper<<8 | adc_data.channel[0].cnv_lower; |
saloutos | 3:4dcadafb89a2 | 137 | ati_data[1] = adc_data.channel[1].cnv_upper<<8 | adc_data.channel[1].cnv_lower; |
saloutos | 3:4dcadafb89a2 | 138 | ati_data[2] = adc_data.channel[2].cnv_upper<<8 | adc_data.channel[2].cnv_lower; |
saloutos | 3:4dcadafb89a2 | 139 | ati_data[3] = adc_data.channel[3].cnv_upper<<8 | adc_data.channel[3].cnv_lower; |
saloutos | 3:4dcadafb89a2 | 140 | ati_data[4] = adc_data.channel[4].cnv_upper<<8 | adc_data.channel[4].cnv_lower; |
saloutos | 3:4dcadafb89a2 | 141 | ati_data[5] = adc_data.channel[5].cnv_upper<<8 | adc_data.channel[5].cnv_lower; |
saloutos | 3:4dcadafb89a2 | 142 | } |
saloutos | 3:4dcadafb89a2 | 143 | |
saloutos | 4:ab834eebd496 | 144 | void filter_LTC_data(){ |
saloutos | 4:ab834eebd496 | 145 | // filter the incoming LTC data |
saloutos | 4:ab834eebd496 | 146 | for(int i=0; i<6; i++){ |
saloutos | 4:ab834eebd496 | 147 | ati_filt[i] = FILT_COEF*(float)ati_data[i] + (1.0-FILT_COEF)*ati_filt[i]; |
saloutos | 4:ab834eebd496 | 148 | } |
saloutos | 4:ab834eebd496 | 149 | } |
saloutos | 4:ab834eebd496 | 150 | |
saloutos | 3:4dcadafb89a2 | 151 | // convert integer readings to voltages to f/t values |
saloutos | 3:4dcadafb89a2 | 152 | void convert_LTC_data(){ |
saloutos | 3:4dcadafb89a2 | 153 | // dummy buffer to store converted ADC vals |
saloutos | 3:4dcadafb89a2 | 154 | float buff[6]; |
saloutos | 3:4dcadafb89a2 | 155 | for(int i=0; i<6; i++){ |
saloutos | 4:ab834eebd496 | 156 | //buff[i] = CONV_FACTOR*((float)ati_data[i]-bias[i]); // bias[] is in same units as msg[] // for non-filtered LTC data |
saloutos | 4:ab834eebd496 | 157 | buff[i] = CONV_FACTOR*(ati_filt[i]-bias[i]); // for filtered data |
saloutos | 3:4dcadafb89a2 | 158 | ft_data[i] = 0; // also zero out ft_data here |
saloutos | 3:4dcadafb89a2 | 159 | } |
saloutos | 3:4dcadafb89a2 | 160 | // convert each f/t value separately |
saloutos | 3:4dcadafb89a2 | 161 | for(int i=0; i<6; i++){ |
saloutos | 3:4dcadafb89a2 | 162 | ft_data[0] += Fxc[i]*buff[i]; |
saloutos | 3:4dcadafb89a2 | 163 | ft_data[1] += Fyc[i]*buff[i]; |
saloutos | 3:4dcadafb89a2 | 164 | ft_data[2] += Fzc[i]*buff[i]; |
saloutos | 3:4dcadafb89a2 | 165 | ft_data[3] += Mxc[i]*buff[i]; |
saloutos | 3:4dcadafb89a2 | 166 | ft_data[4] += Myc[i]*buff[i]; |
saloutos | 3:4dcadafb89a2 | 167 | ft_data[5] += Mzc[i]*buff[i]; |
saloutos | 3:4dcadafb89a2 | 168 | } |
saloutos | 3:4dcadafb89a2 | 169 | } |
saloutos | 2:bdfce41aae53 | 170 | |
saloutos | 2:bdfce41aae53 | 171 | |
saloutos | 3:4dcadafb89a2 | 172 | /*---------------------- Force sensor setup ----------------------*/ |
saloutos | 3:4dcadafb89a2 | 173 | #define SN_MOSI PC_3 |
saloutos | 3:4dcadafb89a2 | 174 | #define SN_MISO PC_2 |
saloutos | 3:4dcadafb89a2 | 175 | #define SN_CLK PB_10 |
saloutos | 3:4dcadafb89a2 | 176 | #define SN_CS PB_12 |
saloutos | 3:4dcadafb89a2 | 177 | #define SN_A PG_15 |
saloutos | 3:4dcadafb89a2 | 178 | #define SN_B PG_10 |
saloutos | 3:4dcadafb89a2 | 179 | #define SN_C PG_12 |
saloutos | 2:bdfce41aae53 | 180 | |
saloutos | 3:4dcadafb89a2 | 181 | SPI sn_spi(SN_MOSI, SN_MISO, SN_CLK); //Sensor SPI - mosi, miso, sclk |
saloutos | 3:4dcadafb89a2 | 182 | DigitalOut dec_enable(SN_CS); |
saloutos | 3:4dcadafb89a2 | 183 | DigitalOut dec_bit0(SN_A); |
saloutos | 3:4dcadafb89a2 | 184 | DigitalOut dec_bit1(SN_B); |
saloutos | 3:4dcadafb89a2 | 185 | DigitalOut dec_bit2(SN_C); |
saloutos | 2:bdfce41aae53 | 186 | |
saloutos | 3:4dcadafb89a2 | 187 | // structs for individual sensor devices |
saloutos | 2:bdfce41aae53 | 188 | struct bmp3_dev s1; // sets up dev as a 'bmp3_dev structure' w/ associated variables |
saloutos | 2:bdfce41aae53 | 189 | struct bmp3_dev s2; |
saloutos | 2:bdfce41aae53 | 190 | struct bmp3_dev s3; |
saloutos | 2:bdfce41aae53 | 191 | struct bmp3_dev s4; |
saloutos | 2:bdfce41aae53 | 192 | struct bmp3_dev s5; |
saloutos | 2:bdfce41aae53 | 193 | struct bmp3_dev s6; |
saloutos | 2:bdfce41aae53 | 194 | struct bmp3_dev s7; |
saloutos | 2:bdfce41aae53 | 195 | struct bmp3_dev s8; |
saloutos | 3:4dcadafb89a2 | 196 | // Structs for sensor data |
saloutos | 3:4dcadafb89a2 | 197 | struct bmp3_data sn_data1; |
saloutos | 3:4dcadafb89a2 | 198 | struct bmp3_data sn_data2; |
saloutos | 3:4dcadafb89a2 | 199 | struct bmp3_data sn_data3; |
saloutos | 3:4dcadafb89a2 | 200 | struct bmp3_data sn_data4; |
saloutos | 3:4dcadafb89a2 | 201 | struct bmp3_data sn_data5; |
saloutos | 3:4dcadafb89a2 | 202 | struct bmp3_data sn_data6; |
saloutos | 3:4dcadafb89a2 | 203 | struct bmp3_data sn_data7; |
saloutos | 3:4dcadafb89a2 | 204 | struct bmp3_data sn_data8; |
saloutos | 3:4dcadafb89a2 | 205 | // Store sensor output data (pressures) |
saloutos | 3:4dcadafb89a2 | 206 | int pr_data[8]; |
saloutos | 3:4dcadafb89a2 | 207 | // Configure data from sensor |
saloutos | 3:4dcadafb89a2 | 208 | uint8_t sensor_comp = uint8_t(1)| uint8_t(1<<1); // sensor_comp = BMP3_PRESS | BMP3_TEMP; |
saloutos | 3:4dcadafb89a2 | 209 | |
saloutos | 2:bdfce41aae53 | 210 | void writeLow(uint8_t pin){ // modified for just 2 sensors |
saloutos | 2:bdfce41aae53 | 211 | dec_enable = 0; |
saloutos | 2:bdfce41aae53 | 212 | if (pin == 1){ |
saloutos | 2:bdfce41aae53 | 213 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 214 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 215 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 216 | } |
saloutos | 2:bdfce41aae53 | 217 | else if (pin == 2){ |
saloutos | 2:bdfce41aae53 | 218 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 219 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 220 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 221 | } |
saloutos | 2:bdfce41aae53 | 222 | else if (pin == 3){ |
saloutos | 2:bdfce41aae53 | 223 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 224 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 225 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 226 | } |
saloutos | 2:bdfce41aae53 | 227 | else if (pin == 4){ |
saloutos | 2:bdfce41aae53 | 228 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 229 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 230 | dec_bit2 = 0; |
saloutos | 2:bdfce41aae53 | 231 | } |
saloutos | 2:bdfce41aae53 | 232 | else if (pin == 5){ |
saloutos | 2:bdfce41aae53 | 233 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 234 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 235 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 236 | } |
saloutos | 2:bdfce41aae53 | 237 | else if (pin == 6){ |
saloutos | 2:bdfce41aae53 | 238 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 239 | dec_bit1 = 0; |
saloutos | 2:bdfce41aae53 | 240 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 241 | } |
saloutos | 2:bdfce41aae53 | 242 | else if (pin == 7){ |
saloutos | 2:bdfce41aae53 | 243 | dec_bit0 = 0; |
saloutos | 2:bdfce41aae53 | 244 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 245 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 246 | } |
saloutos | 2:bdfce41aae53 | 247 | else if (pin == 8){ |
saloutos | 2:bdfce41aae53 | 248 | dec_bit0 = 1; |
saloutos | 2:bdfce41aae53 | 249 | dec_bit1 = 1; |
saloutos | 2:bdfce41aae53 | 250 | dec_bit2 = 1; |
saloutos | 2:bdfce41aae53 | 251 | } |
saloutos | 2:bdfce41aae53 | 252 | } |
saloutos | 2:bdfce41aae53 | 253 | |
saloutos | 2:bdfce41aae53 | 254 | void writeHigh(){ |
saloutos | 2:bdfce41aae53 | 255 | dec_enable = 1; // write all pins high by disabling the decoder |
saloutos | 2:bdfce41aae53 | 256 | } |
adimmit | 1:466049963f1f | 257 | |
saloutos | 2:bdfce41aae53 | 258 | // General Read and Write functions |
saloutos | 2:bdfce41aae53 | 259 | // read function: |0x80 done in library, dummy byte taken care of in library |
saloutos | 2:bdfce41aae53 | 260 | static int8_t user_spi_read(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { |
saloutos | 2:bdfce41aae53 | 261 | writeLow(cspin); |
saloutos | 2:bdfce41aae53 | 262 | sn_spi.write(reg_addr); // send read command to chip_id register (reg 0x00) |
saloutos | 2:bdfce41aae53 | 263 | for(int i = 0; i < len; i++){ |
saloutos | 2:bdfce41aae53 | 264 | *(reg_data+i) = sn_spi.write(0x00); // read in 2nd byte = chip_id |
saloutos | 2:bdfce41aae53 | 265 | } |
saloutos | 2:bdfce41aae53 | 266 | writeHigh(); |
saloutos | 2:bdfce41aae53 | 267 | return 0; |
saloutos | 2:bdfce41aae53 | 268 | } |
saloutos | 2:bdfce41aae53 | 269 | |
saloutos | 2:bdfce41aae53 | 270 | static int8_t user_spi_write(uint8_t cspin, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { |
saloutos | 2:bdfce41aae53 | 271 | writeLow(cspin); |
saloutos | 2:bdfce41aae53 | 272 | sn_spi.write(reg_addr); |
saloutos | 2:bdfce41aae53 | 273 | if (len>1) { |
saloutos | 2:bdfce41aae53 | 274 | for(int i = 0; i < len-1; i++){ |
saloutos | 2:bdfce41aae53 | 275 | sn_spi.write(*(reg_data+i)); // send alternating register address and register bytes in multi write |
saloutos | 2:bdfce41aae53 | 276 | } |
saloutos | 2:bdfce41aae53 | 277 | } |
saloutos | 2:bdfce41aae53 | 278 | else{ |
saloutos | 2:bdfce41aae53 | 279 | sn_spi.write(reg_data[0]); |
saloutos | 2:bdfce41aae53 | 280 | } |
saloutos | 2:bdfce41aae53 | 281 | writeHigh(); |
saloutos | 2:bdfce41aae53 | 282 | return 0; |
saloutos | 2:bdfce41aae53 | 283 | } |
saloutos | 2:bdfce41aae53 | 284 | |
saloutos | 2:bdfce41aae53 | 285 | void user_delay_ms(uint32_t msec){ //delay in milliseconds |
saloutos | 2:bdfce41aae53 | 286 | wait_ms(msec); |
saloutos | 2:bdfce41aae53 | 287 | } |
saloutos | 2:bdfce41aae53 | 288 | |
saloutos | 3:4dcadafb89a2 | 289 | void config_bmp_dev(struct bmp3_dev *dev){ |
saloutos | 2:bdfce41aae53 | 290 | int8_t rslt=0;//BMP3_OK; // get error with rslt = BMP3_OK; |
saloutos | 2:bdfce41aae53 | 291 | |
saloutos | 2:bdfce41aae53 | 292 | dev -> intf = BMP3_SPI_INTF; |
saloutos | 2:bdfce41aae53 | 293 | dev -> read = &user_spi_read; // what to set here??? should be pointer to read function? &spi_read |
saloutos | 2:bdfce41aae53 | 294 | dev -> write = &user_spi_write;// what to set here??? should be pointer to write function? &spi_write |
saloutos | 2:bdfce41aae53 | 295 | dev -> delay_ms = &user_delay_ms;// what to set here??? delay in ms |
saloutos | 2:bdfce41aae53 | 296 | rslt = bmp3_init(dev); |
saloutos | 2:bdfce41aae53 | 297 | pc.printf("* initialize sensor result = 0x%x *\r\n", rslt); |
saloutos | 2:bdfce41aae53 | 298 | wait(0.25); |
saloutos | 2:bdfce41aae53 | 299 | |
saloutos | 2:bdfce41aae53 | 300 | // ***** Configuring settings of sensor |
saloutos | 2:bdfce41aae53 | 301 | // Normal Mode - bmp3_set_op_mode |
saloutos | 2:bdfce41aae53 | 302 | // Temp En, Press En |
saloutos | 2:bdfce41aae53 | 303 | // OSR = no oversampling temp, press |
saloutos | 2:bdfce41aae53 | 304 | // ODR = 200Hz temp, press |
saloutos | 2:bdfce41aae53 | 305 | // IRR = no IRR filter |
saloutos | 2:bdfce41aae53 | 306 | // ^^^all 4 above = bmp3_set_sensor_settings |
saloutos | 2:bdfce41aae53 | 307 | |
saloutos | 2:bdfce41aae53 | 308 | // Set sensor settings (press en, temp en, OSR, ODR, IRR) |
saloutos | 2:bdfce41aae53 | 309 | dev -> settings.press_en = 0x01; // BMP3_ENABLE |
saloutos | 2:bdfce41aae53 | 310 | dev -> settings.temp_en = 0x01; //BMP3_ENABLE |
saloutos | 2:bdfce41aae53 | 311 | dev -> settings.odr_filter.press_os = 0x00; //BMP3_NO_OVERSAMPLING |
saloutos | 2:bdfce41aae53 | 312 | dev -> settings.odr_filter.temp_os = 0x00; //BMP3_NO_OVERSAMPLING |
saloutos | 2:bdfce41aae53 | 313 | dev -> settings.odr_filter.odr = 0x00; //BMP3_ODR_200_HZ |
saloutos | 2:bdfce41aae53 | 314 | dev -> settings.odr_filter.iir_filter = 0x00; //BMP3_IIR_Filter_disable |
saloutos | 2:bdfce41aae53 | 315 | |
saloutos | 2:bdfce41aae53 | 316 | uint16_t settings_sel; |
saloutos | 2:bdfce41aae53 | 317 | //settings_sel = BMP3_PRESS_EN_SEL | BMP3_TEMP_EN_SEL | BMP3_PRESS_OS_SEL | BMP3_TEMP_OS_SEL | BMP3_IIR_FILTER_SEL | BMP3_ODR_SEL; |
saloutos | 2:bdfce41aae53 | 318 | settings_sel = uint16_t(1 << 1) | uint16_t(1 << 2) | uint16_t(1 << 4) | uint16_t(1 << 5) | uint16_t(1 << 6) | uint16_t(1 << 7); |
saloutos | 2:bdfce41aae53 | 319 | //settings_sel = uint16_t(1 << 1) | uint16_t(1 << 2); |
saloutos | 2:bdfce41aae53 | 320 | rslt = bmp3_set_sensor_settings(settings_sel, dev); |
saloutos | 2:bdfce41aae53 | 321 | |
saloutos | 2:bdfce41aae53 | 322 | // Set operating (power) mode |
saloutos | 2:bdfce41aae53 | 323 | dev -> settings.op_mode = 0x03; /// normal mode = 0x03 |
saloutos | 2:bdfce41aae53 | 324 | rslt = bmp3_set_op_mode(dev); |
saloutos | 2:bdfce41aae53 | 325 | |
saloutos | 2:bdfce41aae53 | 326 | // Check settings |
saloutos | 2:bdfce41aae53 | 327 | rslt = bmp3_get_sensor_settings(dev); |
saloutos | 2:bdfce41aae53 | 328 | } |
saloutos | 2:bdfce41aae53 | 329 | |
saloutos | 3:4dcadafb89a2 | 330 | void read_bmp_data(){ |
saloutos | 3:4dcadafb89a2 | 331 | // read data from sensors |
saloutos | 5:e4e96d1b446f | 332 | bmp3_get_sensor_data(sensor_comp, &sn_data1, &s1); |
saloutos | 3:4dcadafb89a2 | 333 | bmp3_get_sensor_data(sensor_comp, &sn_data2, &s2); |
saloutos | 3:4dcadafb89a2 | 334 | bmp3_get_sensor_data(sensor_comp, &sn_data3, &s3); |
saloutos | 3:4dcadafb89a2 | 335 | bmp3_get_sensor_data(sensor_comp, &sn_data4, &s4); |
saloutos | 3:4dcadafb89a2 | 336 | bmp3_get_sensor_data(sensor_comp, &sn_data5, &s5); |
saloutos | 3:4dcadafb89a2 | 337 | bmp3_get_sensor_data(sensor_comp, &sn_data6, &s6); |
saloutos | 3:4dcadafb89a2 | 338 | bmp3_get_sensor_data(sensor_comp, &sn_data7, &s7); |
saloutos | 3:4dcadafb89a2 | 339 | bmp3_get_sensor_data(sensor_comp, &sn_data8, &s8); |
saloutos | 3:4dcadafb89a2 | 340 | } |
saloutos | 2:bdfce41aae53 | 341 | |
saloutos | 2:bdfce41aae53 | 342 | |
saloutos | 5:e4e96d1b446f | 343 | /*---------------------- Neural Network Evaluation ----------------------*/ |
saloutos | 5:e4e96d1b446f | 344 | |
saloutos | 5:e4e96d1b446f | 345 | // TODO: add this to test fingertip sensor |
saloutos | 5:e4e96d1b446f | 346 | /* |
saloutos | 5:e4e96d1b446f | 347 | // sensor data |
saloutos | 5:e4e96d1b446f | 348 | uint16_t sense_data_raw[8]; |
saloutos | 5:e4e96d1b446f | 349 | float sense_data_decode[5]; |
saloutos | 5:e4e96d1b446f | 350 | |
saloutos | 5:e4e96d1b446f | 351 | // internal layers to be evaluated on-line |
saloutos | 5:e4e96d1b446f | 352 | float l1[12]; |
saloutos | 5:e4e96d1b446f | 353 | float l2[25]; |
saloutos | 5:e4e96d1b446f | 354 | |
saloutos | 5:e4e96d1b446f | 355 | // weights and biases for NN (constant)...add more digits here to improve prediction accuracy? |
saloutos | 5:e4e96d1b446f | 356 | const float b1[12] = {}; |
saloutos | 5:e4e96d1b446f | 357 | const float b2[25] = {}; |
saloutos | 5:e4e96d1b446f | 358 | const float b3[5] = {}; |
saloutos | 5:e4e96d1b446f | 359 | const float w1[8][12] = { { }, { }, { }, { }, { }, { }, { }, { } }; |
saloutos | 5:e4e96d1b446f | 360 | const float w2[12][25] = {{ }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { } }; |
saloutos | 5:e4e96d1b446f | 361 | const float w3[25][5] = { { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, |
saloutos | 5:e4e96d1b446f | 362 | { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { } }; |
saloutos | 5:e4e96d1b446f | 363 | |
saloutos | 5:e4e96d1b446f | 364 | // values for scaling sensor readings and NN outputs |
saloutos | 5:e4e96d1b446f | 365 | const float minims[] = { -79.14952894807573f, -59.34503867427718f, -190.91288f, -0.7863755477785648f, -0.7863755477785648f, -831.0f, -997.0f, -974.0f, -986.0f, -998.0f, -964.0f, -136.0f, -881.0f}; |
saloutos | 5:e4e96d1b446f | 366 | const float maxims[] = { 145.75214841512442f, 147.80758667427716f, 194.5331016f, 1.5781267096532723f, 1.5765908199115173f, 4079.0f, 3156.0f, 3734.0f, 4001.0f, 3463.0f, 3463.0f, 2621.0f, 3370.0f}; |
saloutos | 5:e4e96d1b446f | 367 | const float maxS = 4079.0; |
saloutos | 5:e4e96d1b446f | 368 | float in_vec[8]; |
saloutos | 5:e4e96d1b446f | 369 | float out_vec[5]; |
saloutos | 5:e4e96d1b446f | 370 | int out_vec_pr[5]; |
saloutos | 5:e4e96d1b446f | 371 | uint16_t offsets[8]; |
saloutos | 5:e4e96d1b446f | 372 | |
saloutos | 5:e4e96d1b446f | 373 | // sensor workflow from before |
saloutos | 5:e4e96d1b446f | 374 | //// get sensor data |
saloutos | 5:e4e96d1b446f | 375 | //readSensor(sense_data_raw); |
saloutos | 5:e4e96d1b446f | 376 | // |
saloutos | 5:e4e96d1b446f | 377 | //// scale sensor data |
saloutos | 5:e4e96d1b446f | 378 | //for (int i=0; i<8; i++){ |
saloutos | 5:e4e96d1b446f | 379 | // in_vec[i] = 0.0f; |
saloutos | 5:e4e96d1b446f | 380 | // in_vec[i] = (((float)(sense_data_raw[i]-offsets[i])) + abs(minims[i+5])) / maxS; |
saloutos | 5:e4e96d1b446f | 381 | //} |
saloutos | 5:e4e96d1b446f | 382 | // |
saloutos | 5:e4e96d1b446f | 383 | //// evaluate NN |
saloutos | 5:e4e96d1b446f | 384 | //decodeSensor(in_vec,sense_data_decode); |
saloutos | 5:e4e96d1b446f | 385 | // |
saloutos | 5:e4e96d1b446f | 386 | //// post-process, re-scale decoded data |
saloutos | 5:e4e96d1b446f | 387 | //for (int i=0; i<5; i++) { |
saloutos | 5:e4e96d1b446f | 388 | // out_vec[i] = 0.0f; |
saloutos | 5:e4e96d1b446f | 389 | // out_vec[i] = (sense_data_decode[i]*maxims[i]) - abs(minims[i]); |
saloutos | 5:e4e96d1b446f | 390 | // out_vec_pr[i] = (int)(out_vec[i]*100.0f); |
saloutos | 5:e4e96d1b446f | 391 | //} |
saloutos | 5:e4e96d1b446f | 392 | |
saloutos | 5:e4e96d1b446f | 393 | |
saloutos | 5:e4e96d1b446f | 394 | void calibrateSensor(uint16_t* offsets){ // not sure if this is still necessary? |
saloutos | 5:e4e96d1b446f | 395 | // calculate sensor offsets |
saloutos | 5:e4e96d1b446f | 396 | float temp_offsets[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; |
saloutos | 5:e4e96d1b446f | 397 | int samps = 10; |
saloutos | 5:e4e96d1b446f | 398 | for (int i=0; i<samps; i++){ |
saloutos | 5:e4e96d1b446f | 399 | for (int j=0; j<8; j++){ |
saloutos | 5:e4e96d1b446f | 400 | temp_offsets[j] += (float)spi3.binary(j); |
saloutos | 5:e4e96d1b446f | 401 | } |
saloutos | 5:e4e96d1b446f | 402 | wait_ms(1); |
saloutos | 5:e4e96d1b446f | 403 | } |
saloutos | 5:e4e96d1b446f | 404 | for (int i=0; i<8; i++){ |
saloutos | 5:e4e96d1b446f | 405 | temp_offsets[i] = temp_offsets[i]/((float)samps); // get overall offset |
saloutos | 5:e4e96d1b446f | 406 | offsets[i] = (uint16_t)temp_offsets[i]; // convert to int |
saloutos | 5:e4e96d1b446f | 407 | } |
saloutos | 5:e4e96d1b446f | 408 | } |
saloutos | 5:e4e96d1b446f | 409 | |
saloutos | 5:e4e96d1b446f | 410 | void decodeSensor(float input[8], float* output) { |
saloutos | 5:e4e96d1b446f | 411 | // decode sensor data here....521*4 operations (multiply,add,activation,add) |
saloutos | 5:e4e96d1b446f | 412 | |
saloutos | 5:e4e96d1b446f | 413 | // TODO: do normalization here? would need to change input[8] to raw sensor data for function input |
saloutos | 5:e4e96d1b446f | 414 | |
saloutos | 5:e4e96d1b446f | 415 | |
saloutos | 5:e4e96d1b446f | 416 | // reset values |
saloutos | 5:e4e96d1b446f | 417 | for (int i = 0; i<12; i++){ |
saloutos | 5:e4e96d1b446f | 418 | l1[i] = 0.0f; |
saloutos | 5:e4e96d1b446f | 419 | } |
saloutos | 5:e4e96d1b446f | 420 | for (int i = 0; i<25; i++){ |
saloutos | 5:e4e96d1b446f | 421 | l2[i] = 0.0f; |
saloutos | 5:e4e96d1b446f | 422 | } |
saloutos | 5:e4e96d1b446f | 423 | for (int i = 0; i<5; i++){ |
saloutos | 5:e4e96d1b446f | 424 | output[i] = 0.0f; |
saloutos | 5:e4e96d1b446f | 425 | } |
saloutos | 5:e4e96d1b446f | 426 | |
saloutos | 5:e4e96d1b446f | 427 | // layer 1 |
saloutos | 5:e4e96d1b446f | 428 | for(int i = 0; i<12; i++){ // for each node in the next layer |
saloutos | 5:e4e96d1b446f | 429 | for(int j = 0; j<8; j++){ // add contribution of node in prev. layer |
saloutos | 5:e4e96d1b446f | 430 | l1[i] += (w1[j][i]*input[j]); |
saloutos | 5:e4e96d1b446f | 431 | } |
saloutos | 5:e4e96d1b446f | 432 | l1[i] += b1[i]; // add bias |
saloutos | 5:e4e96d1b446f | 433 | l1[i] = fmaxf(0.0f, l1[i]); // relu activation |
saloutos | 5:e4e96d1b446f | 434 | } |
saloutos | 5:e4e96d1b446f | 435 | |
saloutos | 5:e4e96d1b446f | 436 | // layer 2 |
saloutos | 5:e4e96d1b446f | 437 | for(int i = 0; i<25; i++){ // for each node in the next layer |
saloutos | 5:e4e96d1b446f | 438 | for(int j = 0; j<12; j++){ // add contribution of node in prev. layer |
saloutos | 5:e4e96d1b446f | 439 | l2[i] += (w2[j][i]*l1[j]); |
saloutos | 5:e4e96d1b446f | 440 | } |
saloutos | 5:e4e96d1b446f | 441 | l2[i] += b2[i]; // add bias |
saloutos | 5:e4e96d1b446f | 442 | if (l2[i]<0.0f) { // elu activation |
saloutos | 5:e4e96d1b446f | 443 | l2[i] = exp(l2[i]) - 1.0f; // alpha implicitly set to 1.0 here |
saloutos | 5:e4e96d1b446f | 444 | } |
saloutos | 5:e4e96d1b446f | 445 | } |
saloutos | 5:e4e96d1b446f | 446 | |
saloutos | 5:e4e96d1b446f | 447 | // layer 3 |
saloutos | 5:e4e96d1b446f | 448 | for(int i = 0; i<5; i++){ // for each node in the next layer |
saloutos | 5:e4e96d1b446f | 449 | for(int j = 0; j<25; j++){ // add contribution of node in prev. layer |
saloutos | 5:e4e96d1b446f | 450 | output[i] += w3[j][i]*l2[j]; |
saloutos | 5:e4e96d1b446f | 451 | |
saloutos | 5:e4e96d1b446f | 452 | } |
saloutos | 5:e4e96d1b446f | 453 | output[i] += b3[i];// add bias |
saloutos | 5:e4e96d1b446f | 454 | output[i] = 1.0f/(1.0f + exp(-output[i])); // sigmoid activation |
saloutos | 5:e4e96d1b446f | 455 | } |
saloutos | 5:e4e96d1b446f | 456 | |
saloutos | 5:e4e96d1b446f | 457 | // TODO: undo normalization here |
saloutos | 5:e4e96d1b446f | 458 | |
saloutos | 5:e4e96d1b446f | 459 | } |
saloutos | 5:e4e96d1b446f | 460 | */ |
saloutos | 5:e4e96d1b446f | 461 | |
saloutos | 5:e4e96d1b446f | 462 | |
saloutos | 2:bdfce41aae53 | 463 | |
saloutos | 3:4dcadafb89a2 | 464 | /*---------------------- Main function ----------------------*/ |
adimmit | 0:63fac75e5afc | 465 | int main() |
adimmit | 0:63fac75e5afc | 466 | { |
adimmit | 0:63fac75e5afc | 467 | // Initialise the digital pin LED1 as an output |
adimmit | 0:63fac75e5afc | 468 | DigitalOut led(LED1); |
adimmit | 0:63fac75e5afc | 469 | CNV_PIN=0; |
adimmit | 0:63fac75e5afc | 470 | |
saloutos | 3:4dcadafb89a2 | 471 | // Set up serial port |
adimmit | 0:63fac75e5afc | 472 | pc.baud(115200); |
saloutos | 5:e4e96d1b446f | 473 | pc.printf("Initializing.\n\r"); |
adimmit | 0:63fac75e5afc | 474 | |
saloutos | 3:4dcadafb89a2 | 475 | // Set up LTC chip |
saloutos | 3:4dcadafb89a2 | 476 | LTC_chip.format(8, 0); |
saloutos | 3:4dcadafb89a2 | 477 | LTC_chip.frequency(10000); //10MHz? //60Mhz clock frequency |
saloutos | 2:bdfce41aae53 | 478 | wait_ms(1); |
saloutos | 3:4dcadafb89a2 | 479 | config_LTC(); // programs sample order |
saloutos | 2:bdfce41aae53 | 480 | wait_ms(1); |
adimmit | 1:466049963f1f | 481 | |
saloutos | 3:4dcadafb89a2 | 482 | // Set up ethernet |
saloutos | 3:4dcadafb89a2 | 483 | eth.set_network(ip, mask, gateway); |
saloutos | 3:4dcadafb89a2 | 484 | eth.connect(); |
saloutos | 3:4dcadafb89a2 | 485 | wait_ms(1); |
saloutos | 3:4dcadafb89a2 | 486 | client.set_port(SERVER_PORT); |
saloutos | 3:4dcadafb89a2 | 487 | client.set_ip_address(SERVER_ADDRESS); |
saloutos | 3:4dcadafb89a2 | 488 | local.set_port(LOCAL_PORT); |
saloutos | 3:4dcadafb89a2 | 489 | local.set_ip_address(ip); |
saloutos | 3:4dcadafb89a2 | 490 | int code = server.open(ð); |
saloutos | 3:4dcadafb89a2 | 491 | if(code!=0) { pc.printf("Error from opening server = %d\n\r",code); } |
saloutos | 3:4dcadafb89a2 | 492 | code = server.bind(local); |
saloutos | 3:4dcadafb89a2 | 493 | if(code!=0) { pc.printf("Error from binding socket = %d\n\r",code); } |
adimmit | 1:466049963f1f | 494 | |
saloutos | 3:4dcadafb89a2 | 495 | // Set up force sensor and decoder |
saloutos | 2:bdfce41aae53 | 496 | dec_enable = 1; |
saloutos | 3:4dcadafb89a2 | 497 | // Initialize bmp device 1 |
saloutos | 2:bdfce41aae53 | 498 | s1.dev_id = 1; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 499 | config_bmp_dev(&s1); |
saloutos | 3:4dcadafb89a2 | 500 | //Initialize bmp device 2 |
saloutos | 2:bdfce41aae53 | 501 | s2.dev_id = 2; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 502 | config_bmp_dev(&s2); |
saloutos | 3:4dcadafb89a2 | 503 | //Initialize bmp device 3 |
saloutos | 2:bdfce41aae53 | 504 | s3.dev_id = 3; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 505 | config_bmp_dev(&s3); |
saloutos | 3:4dcadafb89a2 | 506 | //Initialize bmp device 4 |
saloutos | 2:bdfce41aae53 | 507 | s4.dev_id = 4; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 508 | config_bmp_dev(&s4); |
saloutos | 3:4dcadafb89a2 | 509 | //Initialize bmp device 5 |
saloutos | 2:bdfce41aae53 | 510 | s5.dev_id = 5; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 511 | config_bmp_dev(&s5); |
saloutos | 3:4dcadafb89a2 | 512 | //Initialize bmp device 6 |
saloutos | 2:bdfce41aae53 | 513 | s6.dev_id = 6; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 514 | config_bmp_dev(&s6); |
saloutos | 3:4dcadafb89a2 | 515 | //Initialize bmp device 7 |
saloutos | 2:bdfce41aae53 | 516 | s7.dev_id = 7; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 517 | config_bmp_dev(&s7); |
saloutos | 3:4dcadafb89a2 | 518 | //Initialize bmp device 8 |
saloutos | 2:bdfce41aae53 | 519 | s8.dev_id = 8; // tells which cs pin associated with device |
saloutos | 3:4dcadafb89a2 | 520 | config_bmp_dev(&s8); |
saloutos | 2:bdfce41aae53 | 521 | |
saloutos | 3:4dcadafb89a2 | 522 | // Calculate bias voltages for ATI sensor |
saloutos | 3:4dcadafb89a2 | 523 | for(int i=0; i<100; i++){ // read 100 times and take average |
saloutos | 3:4dcadafb89a2 | 524 | read_LTC_data(); |
saloutos | 2:bdfce41aae53 | 525 | for(int j=0; j<6; j++){ |
saloutos | 3:4dcadafb89a2 | 526 | bias[j] += 0.01*(float)ati_data[j]; |
saloutos | 2:bdfce41aae53 | 527 | } |
saloutos | 3:4dcadafb89a2 | 528 | wait_ms(1); |
saloutos | 2:bdfce41aae53 | 529 | } |
saloutos | 3:4dcadafb89a2 | 530 | pc.printf("ATI sensor is calibrated with biases of: %.2f, %.2f, %.2f, %.2f, %.2f, %.2f \n\r", bias[0],bias[1],bias[2],bias[3],bias[4],bias[5]); |
saloutos | 6:12ff056ab2c1 | 531 | |
saloutos | 5:e4e96d1b446f | 532 | // TODO: Add calibration for force sensor? Only necessary if the force sensor neural network is being evaluated online |
saloutos | 5:e4e96d1b446f | 533 | //calibrateSensor(offsets); |
saloutos | 5:e4e96d1b446f | 534 | |
saloutos | 5:e4e96d1b446f | 535 | |
saloutos | 4:ab834eebd496 | 536 | // Attach sampling and sending interrupts |
saloutos | 5:e4e96d1b446f | 537 | pc.printf("Beginning to sample.\n\r"); |
saloutos | 5:e4e96d1b446f | 538 | LTC_log.attach_us(&log_LTC_data,1000); // 1kHz // 1000us = 1ms (10000 = 10 ms = 100 Hz) |
saloutos | 5:e4e96d1b446f | 539 | eth_send.attach_us(&send_eth_data,10000); // 100Hz |
saloutos | 5:e4e96d1b446f | 540 | msg_timer.start(); |
adimmit | 1:466049963f1f | 541 | |
adimmit | 0:63fac75e5afc | 542 | while (true) { |
adimmit | 1:466049963f1f | 543 | |
saloutos | 6:12ff056ab2c1 | 544 | /*if(LTC_ticker_activated == true) { |
saloutos | 4:ab834eebd496 | 545 | // Clear flag |
saloutos | 4:ab834eebd496 | 546 | LTC_ticker_activated = false; |
saloutos | 5:e4e96d1b446f | 547 | // Sample from LTC chip, filter data |
saloutos | 4:ab834eebd496 | 548 | read_LTC_data(); |
saloutos | 4:ab834eebd496 | 549 | filter_LTC_data(); |
saloutos | 4:ab834eebd496 | 550 | } |
saloutos | 4:ab834eebd496 | 551 | |
saloutos | 4:ab834eebd496 | 552 | if(eth_ticker_activated == true) { |
saloutos | 4:ab834eebd496 | 553 | // Clear flag |
saloutos | 4:ab834eebd496 | 554 | eth_ticker_activated = false; |
saloutos | 2:bdfce41aae53 | 555 | |
saloutos | 5:e4e96d1b446f | 556 | convert_LTC_data(); // TODO: maybe remove this eventually, if we convert the data after sending over ethernet |
saloutos | 3:4dcadafb89a2 | 557 | // Print received data |
saloutos | 3:4dcadafb89a2 | 558 | //pc.printf("%6d,%6d,%6d,%6d,%6d,%6d\n\r", ati_data[0],ati_data[1],ati_data[2],ati_data[3],ati_data[4],ati_data[5]); |
saloutos | 4:ab834eebd496 | 559 | // Print converted LTC data |
saloutos | 5:e4e96d1b446f | 560 | // pc.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f, ", ft_data[0],ft_data[1],ft_data[2],ft_data[3],ft_data[4],ft_data[5]); |
saloutos | 2:bdfce41aae53 | 561 | |
saloutos | 3:4dcadafb89a2 | 562 | // Sample from force sensor |
saloutos | 3:4dcadafb89a2 | 563 | read_bmp_data(); |
saloutos | 3:4dcadafb89a2 | 564 | // Convert to relative pressures |
saloutos | 3:4dcadafb89a2 | 565 | pr_data[0] = int(sn_data1.pressure)-100000; // pressure is returned in Pa, could subtract actual sea level pressure here |
saloutos | 3:4dcadafb89a2 | 566 | pr_data[1] = int(sn_data2.pressure)-100000; |
saloutos | 3:4dcadafb89a2 | 567 | pr_data[2] = int(sn_data3.pressure)-100000; |
saloutos | 3:4dcadafb89a2 | 568 | pr_data[3] = int(sn_data4.pressure)-100000; |
saloutos | 3:4dcadafb89a2 | 569 | pr_data[4] = int(sn_data5.pressure)-100000; |
saloutos | 3:4dcadafb89a2 | 570 | pr_data[5] = int(sn_data6.pressure)-100000; |
saloutos | 3:4dcadafb89a2 | 571 | pr_data[6] = int(sn_data7.pressure)-100000; |
saloutos | 3:4dcadafb89a2 | 572 | pr_data[7] = int(sn_data8.pressure)-100000; |
saloutos | 3:4dcadafb89a2 | 573 | // Print received data |
saloutos | 5:e4e96d1b446f | 574 | // pc.printf("%d,%d,%d,%d,%d,%d,%d,%d\n\r", pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]); |
saloutos | 2:bdfce41aae53 | 575 | |
saloutos | 3:4dcadafb89a2 | 576 | // Pack and send the ethernet message |
saloutos | 6:12ff056ab2c1 | 577 | //sprintf(send_buf, "%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d\n", msg_timer.read(),ft_data[0],ft_data[1],ft_data[2], pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]); |
saloutos | 6:12ff056ab2c1 | 578 | // sprintf(send_buf, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", ati_data[0],ati_data[1],ati_data[2],ati_data[3],ati_data[4],ati_data[5], pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]); |
saloutos | 6:12ff056ab2c1 | 579 | //server.sendto(client, send_buf, sizeof(send_buf)); // send message, look for '\n' character when decoding the string |
saloutos | 6:12ff056ab2c1 | 580 | |
saloutos | 6:12ff056ab2c1 | 581 | }*/ |
saloutos | 6:12ff056ab2c1 | 582 | |
saloutos | 6:12ff056ab2c1 | 583 | // Receive a message from server (Mbed B) |
saloutos | 6:12ff056ab2c1 | 584 | char buf[256]; |
saloutos | 6:12ff056ab2c1 | 585 | int n = server.recvfrom(&client, buf, 256); // could also use server.recv(buf, 256)? |
saloutos | 6:12ff056ab2c1 | 586 | buf[n] = '\0'; |
saloutos | 6:12ff056ab2c1 | 587 | //pc.printf("Received message back from server: '%s'\n\r", buf); |
saloutos | 6:12ff056ab2c1 | 588 | |
saloutos | 6:12ff056ab2c1 | 589 | if (buf[0]=='z') { // re-zero ATI sensor |
saloutos | 6:12ff056ab2c1 | 590 | for(int i=0; i<100; i++){ // read 100 times and take average |
saloutos | 6:12ff056ab2c1 | 591 | read_LTC_data(); |
saloutos | 6:12ff056ab2c1 | 592 | for(int j=0; j<6; j++){ |
saloutos | 6:12ff056ab2c1 | 593 | bias[j] += 0.01*(float)ati_data[j]; |
saloutos | 6:12ff056ab2c1 | 594 | } |
saloutos | 6:12ff056ab2c1 | 595 | wait_ms(1); |
saloutos | 6:12ff056ab2c1 | 596 | } |
saloutos | 6:12ff056ab2c1 | 597 | } |
saloutos | 6:12ff056ab2c1 | 598 | |
saloutos | 6:12ff056ab2c1 | 599 | if (buf[0]=='r') { |
saloutos | 6:12ff056ab2c1 | 600 | read_LTC_data(); |
saloutos | 6:12ff056ab2c1 | 601 | filter_LTC_data(); |
saloutos | 6:12ff056ab2c1 | 602 | convert_LTC_data(); |
saloutos | 6:12ff056ab2c1 | 603 | read_bmp_data(); |
saloutos | 6:12ff056ab2c1 | 604 | pr_data[0] = int(sn_data1.pressure)-100000; // pressure is returned in Pa, could subtract actual sea level pressure here |
saloutos | 6:12ff056ab2c1 | 605 | pr_data[1] = int(sn_data2.pressure)-100000; |
saloutos | 6:12ff056ab2c1 | 606 | pr_data[2] = int(sn_data3.pressure)-100000; |
saloutos | 6:12ff056ab2c1 | 607 | pr_data[3] = int(sn_data4.pressure)-100000; |
saloutos | 6:12ff056ab2c1 | 608 | pr_data[4] = int(sn_data5.pressure)-100000; |
saloutos | 6:12ff056ab2c1 | 609 | pr_data[5] = int(sn_data6.pressure)-100000; |
saloutos | 6:12ff056ab2c1 | 610 | pr_data[6] = int(sn_data7.pressure)-100000; |
saloutos | 6:12ff056ab2c1 | 611 | pr_data[7] = int(sn_data8.pressure)-100000; |
saloutos | 5:e4e96d1b446f | 612 | sprintf(send_buf, "%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d\n", msg_timer.read(),ft_data[0],ft_data[1],ft_data[2], pr_data[0],pr_data[1],pr_data[2],pr_data[3],pr_data[4],pr_data[5],pr_data[6],pr_data[7]); |
saloutos | 3:4dcadafb89a2 | 613 | server.sendto(client, send_buf, sizeof(send_buf)); // send message, look for '\n' character when decoding the string |
saloutos | 6:12ff056ab2c1 | 614 | } |
adimmit | 1:466049963f1f | 615 | |
adimmit | 0:63fac75e5afc | 616 | } |
saloutos | 3:4dcadafb89a2 | 617 | |
saloutos | 3:4dcadafb89a2 | 618 | // Terminate connection (if you want) |
saloutos | 3:4dcadafb89a2 | 619 | server.close(); |
saloutos | 3:4dcadafb89a2 | 620 | eth.disconnect(); |
adimmit | 1:466049963f1f | 621 | |
adimmit | 0:63fac75e5afc | 622 | } |