Interface Library for Madpulse RC Car
Dependents: Madpulse_Speed_Control_temp Madpulse_Speed_Control_Students
madpulse.cpp
- Committer:
- jdawkins
- Date:
- 2017-11-14
- Revision:
- 0:5e55308aa7a6
File content as of revision 0:5e55308aa7a6:
#include "mbed.h" #include "madpulse.h" #define DT 0.02 MadPulse::MadPulse(uint8_t id,Serial *port,BNO055 *imu, ServoIn *CH1,ServoIn *CH2, InterruptIn *irq, ServoOut *Steer, ServoOut *Throttle): id(id), _imu(imu), _port(port), _wheel_irq(irq), _CH1(CH1), _CH2(CH2), _Steer(Steer), _Throttle(Throttle) { ti.start(); //Start Local Timer _wheel_irq->rise(this, &MadPulse::wheelCallback); // Callback to Interrupt for Wheel Sensor if(_imu->check()) { printf("BNO055 connected\r\n"); _imu->setmode(OPERATION_MODE_CONFIG); _imu->SetExternalCrystal(1); _imu->setmode(OPERATION_MODE_NDOF); //Uses magnetometer _imu->set_angle_units(RADIANS); _imu->set_accel_units(MPERSPERS); _imu->set_anglerate_units(RAD_PER_SEC); _imu->setoutputformat(WINDOWS); _imu->set_mapping(2); // imu_LED = 1; // turns on IMU light when calibration is successful } // _port->attach(this,&MadPulse::rxCallback); }; void MadPulse::sampleData(){ getAccel(); getGyro(); getMag(); getEuler(); getSpeed(); //printf("Wheel Freq: %f\n\r",wheel_freq); } void MadPulse::getAccel(){ _imu->get_accel(); accel.x = _imu->accel.x; accel.y = _imu->accel.y; accel.z = _imu->accel.z; } void MadPulse::getGyro(){ _imu->get_gyro(); gyro.x = _imu->gyro.x; gyro.y = _imu->gyro.y; gyro.z = _imu->gyro.z; } void MadPulse::getMag(){ _imu->get_mag(); mag.x = _imu->mag.x; mag.y = _imu->mag.y; mag.z = _imu->mag.z; // printf("Mag:%.1f,%.1f,%.1f\n\r",_imu->mag.x,_imu->mag.y,_imu->mag.z); } void MadPulse::getEuler(){ _imu->get_angles(); euler.roll = _imu->euler.roll; euler.pitch = _imu->euler.pitch; euler.yaw = _imu->euler.yaw; } void MadPulse::getSpeed(){ float dt_loc = ti.read()-t_ws; if(dt_loc > 0.1){ wheel_freq = 0; } /* if( (dt < 0.05) && (dt > 0.002)) { // wheel_spd = (1/CTS_REV)/(dt_ws); // 0.036 is the wheel radius v = omega*r //wheel_freq = 1/dt_ws; } else { }*/ } void MadPulse::resetEnc(){ counts = 0; } void MadPulse::wheelCallback() { dt = ti.read()-t_ws; // if(dt < 0.0001){ if(dt < 0.0001){ wheel_freq = 1/dt_old; dt_old = dt_old; }else{ wheel_freq = 1/dt; dt_old = dt; } if(wheel_freq >200){ wheel_freq=wheel_freq_old; } wheel_freq_old = wheel_freq; /* if(dt > 0.1){ wheel_freq = 0; }*/ // Hall effect speed sensor callback wheel_LED = !wheel_LED; counts++; // Iterate tick counter dt_ws = ti.read()-t_ws; t_ws= ti.read(); } // end void he_callback void MadPulse::setSteer(float str){ str = saturateCmd(str); _Steer->write((int)((str*500.0)+1500.0)); // Write Steering Pulse } void MadPulse::setThrottle(float thr){ thr = saturateVal(thr,0.3,-0.3); _Throttle->write((int)((thr*500.0)+1500.0)); //Write Throttle Pulse } uint8_t MadPulse::sendMessage(Serial *obj,char* msg,uint8_t len) { int i; for(i=0; i<len; i++) { obj->printf("%c",msg[i]); } obj->printf("\r\n"); return i; } void MadPulse::rxCallback(){ char c = _port->getc(); // pc.printf("%s",c); if(c == 'H' || c == 'h') { _port->printf("Command List...\r\n"); _port->printf("d - set open loop duty cycle\r\n"); _port->printf("r - run open loop control with current duty cycle\r\n"); _port->printf("h - display this prompt and exit\r\n"); _port->printf("t - set duration of test\r\n\n\n"); _port->printf("Enter Command\r\n"); } else if(c == 'R' || c == 'r') { // auto_flag = 1; auto_LED = 1; } else if(c == 'S' || c == 's') { // auto_flag = 0; auto_LED = 0; } else { } } int MadPulse::parseMessage(char * msg) { if(!strncmp(msg, "$POS", 4)) { // int arg1; float arg2,arg3,arg4; sscanf(msg,"$POS,%f,%f,%f\n",&arg2,&arg3,&arg4); pos.x = arg2; pos.y = arg3; pos.z = arg4; // pc.printf("idm: %d n:%f e:%f d:%f",arg1,pos_n,pos_e,pos_d); return 1; } //emd of $CMD if(!strncmp(msg, "$RUN", 4)) { return 1; } if(!strncmp(msg, "$STOP", 4)) { return 1; } return 0; }