Version 3 is with update to the test rig with a linear actuator

Dependencies:   SPTE_10Bar_5V mbed AS5048 SDFileSystem MODSERIAL PinDetect LCM101 LinearActuator

Committer:
surajgiri
Date:
Wed Aug 12 12:05:58 2020 +0000
Revision:
11:fc82dd22a527
Parent:
10:77fcbad99a31
with benchmark v1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
megrootens 0:3855d4588f76 1 #ifndef _BENCH02_H_
megrootens 0:3855d4588f76 2 #define _BENCH02_H_
cnckiwi31 5:63063a9fa51c 3 #include "MODSERIAL.h"
megrootens 0:3855d4588f76 4
megrootens 0:3855d4588f76 5 #include "mbed.h"
cnckiwi31 5:63063a9fa51c 6 #include <string>
cnckiwi31 5:63063a9fa51c 7
cnckiwi31 5:63063a9fa51c 8 #include "SDFileSystem.h"
cnckiwi31 5:63063a9fa51c 9 #include "constants.h"
cnckiwi31 5:63063a9fa51c 10
megrootens 0:3855d4588f76 11 #include "as5048.h"
megrootens 0:3855d4588f76 12 #include "lcm101.h"
cnckiwi31 4:1cdce6c6c94e 13 #include "SPTEPressureSensor.h"
cnckiwi31 5:63063a9fa51c 14 #include "Valve.h"
surajgiri 11:fc82dd22a527 15 #include "LinearActuator.h"
megrootens 0:3855d4588f76 16
megrootens 0:3855d4588f76 17 /**
cnckiwi31 6:02507d7a6f51 18 * Class to read out sensory information from the second test bench:
cnckiwi31 6:02507d7a6f51 19 * the knee joint angle as measured by an AMS AS5048 absolute rotary sensor
cnckiwi31 6:02507d7a6f51 20 * the vertical force applied externally at the hip joint
cnckiwi31 6:02507d7a6f51 21 * the pressure (for example of an actuator used in the device under test).
cnckiwi31 6:02507d7a6f51 22 * Additionally, an on /off valve can pressurise the actuator on the leg
megrootens 0:3855d4588f76 23 */
megrootens 0:3855d4588f76 24 class Bench {
megrootens 0:3855d4588f76 25 public:
megrootens 0:3855d4588f76 26
megrootens 0:3855d4588f76 27 static const float kCutOffDegrees = 180.0f;
megrootens 0:3855d4588f76 28 static const float kCutOffRadians = 3.14159265359f;
megrootens 0:3855d4588f76 29
megrootens 0:3855d4588f76 30 enum Joint {
megrootens 0:3855d4588f76 31 TOES,
megrootens 0:3855d4588f76 32 ANKLE,
megrootens 0:3855d4588f76 33 KNEE,
megrootens 0:3855d4588f76 34 HIP
megrootens 0:3855d4588f76 35 };
cnckiwi31 5:63063a9fa51c 36
cnckiwi31 10:77fcbad99a31 37 enum DACChannel {
cnckiwi31 10:77fcbad99a31 38 A,
cnckiwi31 10:77fcbad99a31 39 B
cnckiwi31 10:77fcbad99a31 40 };
cnckiwi31 10:77fcbad99a31 41
cnckiwi31 5:63063a9fa51c 42 // constructor
cnckiwi31 5:63063a9fa51c 43 Bench(PinName mosi = AS5048_MOSI, PinName miso = AS5048_MISO, PinName sck = AS5048_SCLK, PinName cs = AS5048_CS,
cnckiwi31 5:63063a9fa51c 44 bool use5kN = sensors::use5kN,PinName p_lcm101 = LCM101,
surajgiri 11:fc82dd22a527 45 PinName p_spte0 = SPTE_0, PinName p_spte1 = SPTE_1,PinName p_valve = VALVE_PIN,PinName p_laDir = LINACT_DIR_PIN, PinName p_laPwm = LINACT_PWM_PIN,
cnckiwi31 5:63063a9fa51c 46 PinName sd_mosi = SD_MOSI, PinName sd_miso = SD_MISO, PinName sd_sck = SD_SCK, PinName sd_cs = SD_CS,
surajgiri 11:fc82dd22a527 47 PinName tx = USBTX, PinName rx = USBRX);
megrootens 0:3855d4588f76 48
cnckiwi31 5:63063a9fa51c 49
cnckiwi31 5:63063a9fa51c 50 //setup
cnckiwi31 5:63063a9fa51c 51 void initialise();
megrootens 0:3855d4588f76 52
cnckiwi31 5:63063a9fa51c 53 void setLoggingFrequency(float logHertz);
cnckiwi31 5:63063a9fa51c 54 void setExtraColumns(string extraColumnNames[], int numCols);
cnckiwi31 5:63063a9fa51c 55 void setExtraData(float data[]);
cnckiwi31 5:63063a9fa51c 56 void update();
megrootens 0:3855d4588f76 57
cnckiwi31 5:63063a9fa51c 58 bool isLogging();//indicates if we are now datalogging
cnckiwi31 5:63063a9fa51c 59 void stopLogging();//halts the data logging if we are now datalogging
surajgiri 11:fc82dd22a527 60 void StopLogging(); //halts the data logging if we are now datalogging
surajgiri 11:fc82dd22a527 61 void StartLogging(const char * fname_append = "data"); //starts datalogging
surajgiri 11:fc82dd22a527 62 void RestartLogging(const char * fname_append = "data");//restart datalogging
surajgiri 11:fc82dd22a527 63 void LogData();
cnckiwi31 5:63063a9fa51c 64
cnckiwi31 5:63063a9fa51c 65 //reading angle sensors
cnckiwi31 5:63063a9fa51c 66 As5048* get_as5048();
cnckiwi31 5:63063a9fa51c 67
megrootens 0:3855d4588f76 68 float getDegrees(int i_joint);
megrootens 0:3855d4588f76 69 float getDegrees(Joint joint);
megrootens 0:3855d4588f76 70
megrootens 0:3855d4588f76 71 float getRadians(int i_joint);
megrootens 0:3855d4588f76 72 float getRadians(Joint joint);
megrootens 0:3855d4588f76 73
megrootens 0:3855d4588f76 74 const char* getJointName(int i_joint);
megrootens 0:3855d4588f76 75 const char* getJointName(Joint joint);
megrootens 0:3855d4588f76 76
cnckiwi31 5:63063a9fa51c 77 //reading and calibrating force and pressure sensors
megrootens 0:3855d4588f76 78 float getForce();
cnckiwi31 4:1cdce6c6c94e 79 void nullForce();
cnckiwi31 4:1cdce6c6c94e 80
cnckiwi31 4:1cdce6c6c94e 81 float getPressure0();
cnckiwi31 4:1cdce6c6c94e 82 void nullPressure0();
cnckiwi31 4:1cdce6c6c94e 83 float getPressure1();
cnckiwi31 4:1cdce6c6c94e 84 void nullPressure1();
megrootens 0:3855d4588f76 85
cnckiwi31 10:77fcbad99a31 86 //MAX5322 DACs (two channels per DAC)
cnckiwi31 10:77fcbad99a31 87 void setDACA(DACChannel ch, unsigned int bitValue);
cnckiwi31 10:77fcbad99a31 88 void setDACB(DACChannel ch, unsigned int bitValue);
cnckiwi31 10:77fcbad99a31 89
cnckiwi31 5:63063a9fa51c 90 //controlling valve
cnckiwi31 5:63063a9fa51c 91 bool getValve();
cnckiwi31 5:63063a9fa51c 92 void setValve(bool pressurise);
cnckiwi31 5:63063a9fa51c 93
surajgiri 11:fc82dd22a527 94 // controlling linear actuator
surajgiri 11:fc82dd22a527 95 void setDir(bool dir);
surajgiri 11:fc82dd22a527 96 bool getDir();
surajgiri 11:fc82dd22a527 97 void setPWM(int pwm);
surajgiri 11:fc82dd22a527 98
cnckiwi31 8:bc467f5fe7c3 99 /** Object for printing/receiving data to the PC the test rig is connected
cnckiwi31 8:bc467f5fe7c3 100 * to. Note that it uses the MODSERIAL.h class.
cnckiwi31 8:bc467f5fe7c3 101 */
cnckiwi31 5:63063a9fa51c 102 MODSERIAL pc;
cnckiwi31 5:63063a9fa51c 103
cnckiwi31 5:63063a9fa51c 104 void pausePrint();
cnckiwi31 5:63063a9fa51c 105 void resumePrint();
cnckiwi31 5:63063a9fa51c 106
cnckiwi31 5:63063a9fa51c 107 private:
cnckiwi31 5:63063a9fa51c 108 //timing
cnckiwi31 5:63063a9fa51c 109 int loggingUS; //microseconds between recording data logging
cnckiwi31 5:63063a9fa51c 110 float loggingHz;// Hz of data logging
cnckiwi31 5:63063a9fa51c 111
cnckiwi31 5:63063a9fa51c 112 Ticker tick_update, tick_serial, tick_logging; //for the updating of sensor values, printing of serial data and logging of data
cnckiwi31 5:63063a9fa51c 113 Timer timer;
surajgiri 11:fc82dd22a527 114 Timer keyIntT;//timer to debounce keypresses
surajgiri 11:fc82dd22a527 115 int keyIntOffset;//for setting initial value of keyIntT
cnckiwi31 5:63063a9fa51c 116 int firstReadMS; //first timer value read
cnckiwi31 5:63063a9fa51c 117 bool startedLogging; //in the middle of a logging cycle
cnckiwi31 5:63063a9fa51c 118
cnckiwi31 5:63063a9fa51c 119 bool is_logging;
cnckiwi31 5:63063a9fa51c 120 bool is_printing;
cnckiwi31 5:63063a9fa51c 121 bool was_printing; //if printing is paused true if is_printing was true
surajgiri 11:fc82dd22a527 122 char k; //value from keyboard
surajgiri 11:fc82dd22a527 123
cnckiwi31 5:63063a9fa51c 124 //joint angle
cnckiwi31 5:63063a9fa51c 125 As5048 as5048_;
cnckiwi31 5:63063a9fa51c 126
cnckiwi31 5:63063a9fa51c 127 //load cells
cnckiwi31 5:63063a9fa51c 128 Lcm101 loadCell5kN;
cnckiwi31 5:63063a9fa51c 129 Lcm101 loadCell1kN;
cnckiwi31 5:63063a9fa51c 130 bool use5kN;//determine which load cell is used
cnckiwi31 5:63063a9fa51c 131
cnckiwi31 5:63063a9fa51c 132 //pressure sensors
cnckiwi31 5:63063a9fa51c 133 SPTEPressureSensor spte0;
cnckiwi31 5:63063a9fa51c 134 SPTEPressureSensor spte1;
cnckiwi31 5:63063a9fa51c 135
cnckiwi31 5:63063a9fa51c 136 //valve
cnckiwi31 5:63063a9fa51c 137 ValveDigital valveFesto;
cnckiwi31 5:63063a9fa51c 138
surajgiri 11:fc82dd22a527 139 //linear actuator
surajgiri 11:fc82dd22a527 140 LinearActuator LinAct;
surajgiri 11:fc82dd22a527 141
cnckiwi31 5:63063a9fa51c 142 //SD card
cnckiwi31 5:63063a9fa51c 143 SDFileSystem sd;
cnckiwi31 5:63063a9fa51c 144 FILE * fp_data;
cnckiwi31 5:63063a9fa51c 145 int fname_prepend;//file number
cnckiwi31 5:63063a9fa51c 146 bool sd_card_present;//card detected
cnckiwi31 5:63063a9fa51c 147
cnckiwi31 5:63063a9fa51c 148 static const int maxCols = 5;
cnckiwi31 5:63063a9fa51c 149 int usedExtraCols; //number of extra columns useds
cnckiwi31 5:63063a9fa51c 150 string extraColNames[maxCols];//names of extra columns (up to maxCols allowed with 15 characters)
cnckiwi31 5:63063a9fa51c 151 float extraColValues[maxCols];//value held in extra columns for current time step
cnckiwi31 5:63063a9fa51c 152
cnckiwi31 5:63063a9fa51c 153 void InitSdCard();
surajgiri 11:fc82dd22a527 154
surajgiri 11:fc82dd22a527 155 //for toggling logging or printing
surajgiri 11:fc82dd22a527 156 void ToggleState(MODSERIAL_IRQ_INFO *q);
surajgiri 11:fc82dd22a527 157
cnckiwi31 5:63063a9fa51c 158 void ToggleLogging();
cnckiwi31 5:63063a9fa51c 159
cnckiwi31 5:63063a9fa51c 160 // serial printing
cnckiwi31 5:63063a9fa51c 161 void TogglePrinting();
cnckiwi31 5:63063a9fa51c 162 void PrintStatus();
cnckiwi31 5:63063a9fa51c 163 void PrintMenu();
cnckiwi31 5:63063a9fa51c 164 };
megrootens 0:3855d4588f76 165 #endif