BT control
robot.h
- Committer:
- Throwbot
- Date:
- 2014-05-20
- Revision:
- 0:603c28b75dc1
File content as of revision 0:603c28b75dc1:
#ifndef ROBOT_H #define ROBOT_H #include "mbed.h" #include "MPU6050.h" #include "nRF24L01P.h" #define BaudRate_bt 9600 //Baud rate of 9600 #define tx_bt PTA2 //Bluetooth connection pins #define rx_bt PTA1 //Bluetooth connection pins #define tx_mpu PTE0 //MPU connection pins #define rx_mpu PTE1 //MPU connection pins #define mpu_bandwidth MPU6050_BW_20 //set the MPU low pass filter bandwidth to 20hz #define LED PTE3 //status LED pin #define CURRENTSENSOR_PIN PTC2 #define VOLTAGESENSOR_PIN PTB0 #define CURRENT_R1 180 //160.0 //values of the current sensor opamp resistors #define CURRENT_R2 10 #define CURRENT_R3 80 #define CURRENT_R4 84.7 #define VREF3_3 3.3 //digital logic voltage #define VREF5 5.0 //5v voltage //NOTE: 5v voltage is consistent when using new batts, but not using old blue batts #define irL PTB1 #define irC PTB3 #define irR PTB2 #define MOT_PWMA_PIN PTA4 //Motor control pins #define MOT_PWMB_PIN PTA5 #define MOT_STBY_PIN PTA15 #define MOT_AIN1_PIN PTA14 #define MOT_AIN2_PIN PTA13 #define MOT_BIN1_PIN PTA16 #define MOT_BIN2_PIN PTA17 #define M_PI 3.14159265359 //PI #define gyroCorrect 3720 //divide raw gyro data by this to get result in RAD/SECOND (if gyroRange is 500 rad/s) //Correct direction of motors. If number = 1, forward. If number = 0, backwards (for if motors are wired backwards) #define MOTOR_R_DIRECTION 1 #define MOTOR_L_DIRECTION 1 #define MOTOR_INTERVAL 20 //defines the interval (in milliseconds) between when motor can be set //NOTE: Can't make this less than 20ms, because that is the PWM frequency //Key bindings for remote control robot - for the future try to use arrow keys instead of 'asdw' #define ctrl_forward 'i' //forward #define ctrl_backward 'k' //back #define ctrl_left 'j' //turn left #define ctrl_right 'l' //turn right #define ctrl_calibrate 'c' //re-calibrate the accelerometer and gyro #define ctrl_turn_angle_cw 'o' // turn angle #define ctrl_turn_angle_ccw 'p' // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's // "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019) // only handles 4 byte transfers in the ATMega code. #define TRANSFER_SIZE 4 class Robot { public: /** * Constructor - does nothing atm */ Robot(); /** * MOTOR CONTROLS */ void motor_control(int Lspeed, int Rspeed); //Input speed for motors. Integer between 0 and 100 void stop(); //stop motors void set_direction(double angle); //set angle for the robot to face (from origin) void set_direction_deg(double angle); void set_speed(int Speed ); //set speed for robot to travel at void auto_enable(bool x); /** * MPU CONTROLS */ /** * UPDATE (this must be called repeatedly so the robot will sample accelerometer to find position) */ void update(); //print variable decides which values to print void remote_ctrl(char c,int desired_speed, int desired_angle); //print = 0: nothing //print = 1: Accelerometer and gyro //print = 2: Current and voltage // calibrate the gyro and accelerometer // void calibrate(); /** * Status: find the distance, orientation, battery values, etc of the robot */ //void distanceTravelled(double x[3]) //void orientation(something quaternion? on xy plane?) double getCurrent(); //Get the current drawn by the robot double getCurrent(int n); //get the current, averaged over n samples double getVoltage(); //get the battery voltage (ask connor for completed function) void getIMU(float *adata, float *gdata); double irReadL(); double irReadC(); double irReadR(); double return_rotation(); int isMPU(); //Wireless connections Serial bt; //bluetooth connection nRF24L01P rf24; //RF network connection //RF24 network functions// void rf24_power(int status); //power on or off the RF network char rf24_read(); int rf24_write(char letter); //write a letter to RF int rf24_write(char* buffer, int length); //write int acc[3]; int gyr[3]; //-------------------PRIVATE VARIABLES AND FUNCTIONS-----------------------------------------------// private: //commands for remote control robot MPU6050 mpu; //MPU connection DigitalOut myled; //(PTE3) Processor LED (1 = off, 0 = on) DigitalOut btSwitch; AnalogIn currentSensor; AnalogIn irSensorL; AnalogIn irSensorC; AnalogIn irSensorR; AnalogIn voltageSensor; double dx; //distance travelled in x direction double dy; //distance travelled in y direction double dz; //distance travelled in z direction (zero?) double origin; //location of robot origin (or can be set if robot starting location is known. double target_angle; //direction that we want the robot to face (radians) int accdata[3]; //data from accelerometer (raw) int gyrodata[3]; //data from gyro (raw) //double gyroCorrect; //= 3720; //divide by this to get gyro data in RAD/SECOND. This is above as a #DEFINE int gyroOffset[3]; //Correction value for each gyroscope to zero the values. int accOffset[3]; //correction value for each accelerometer int speed; //set the speed of robot /**Angle is always measured in clockwise direction, looking down from the top**/ /*Angle is measured in RADIANS*/ double rz; //Direction robot is facing double Irz; //integral of the rotation offset from target. (Optionally) Used for PID control of direction double angle_origin; //Angle of origin (can be changed later, or set if robot starts at known angle) bool AUTO_ORIENT; //if this flag is 1, the robot automatically orients itself to selected direction bool REMOTE_CONTROL; //if this flag is 1, the robot will be controlled over bluetooth /////////// Motor control variables /////////// PwmOut PWMA;//(MOT_PWMA_PIN); PwmOut PWMB;//(MOT_PWMB_PIN); DigitalOut AIN1;//(MOT_AIN1_PIN); DigitalOut AIN2;//(MOT_AIN2_PIN); DigitalOut BIN1;//(MOT_BIN1_PIN); DigitalOut BIN2;//(MOT_BIN2_PIN); DigitalOut STBY;//(MOT_STBY_PIN); double timeNext; //next time that the motor is allowed to be updated bool MPU_OK; Timer tt; //timer double time; //time of current iteration double timePrev; //time of previous iteration }; #endif