test
Dependencies: BSP_DISCO_F429ZI LCD_DISCO_F429ZI Motor PID TS_DISCO_F429ZI mbed
main.cpp
- Committer:
- levkovigor
- Date:
- 2017-09-26
- Revision:
- 0:4a219a0d6583
File content as of revision 0:4a219a0d6583:
#include "mbed.h" #include "TS_DISCO_F429ZI.h" #include "LCD_DISCO_F429ZI.h" #include "Motor.h" #include "PID.h" LCD_DISCO_F429ZI lcd; TS_DISCO_F429ZI ts; PwmOut right_sk(PE_5); PwmOut left_sk(PE_6); DigitalOut right_en(PE_4); //Enable DigitalOut right_fr(PE_3); //Direction DigitalOut right_bk(PE_2); //Break DigitalOut left_en(PD_2); //Enable DigitalOut left_fr(PD_4); //Direction DigitalOut left_bk(PD_5); //Break //Serial pc(PG_14, PG_9, 115200); // tx, rx //Serial pc(PC_12, PD_2, 115200); // tx, rx DigitalOut led1(LED1); char buffer[20]; char buffer2[20]; class Counter { public: Counter(PinName pin) : _interrupt(pin) { // create the InterruptIn on the pin specified to Counter _interrupt.fall(this, &Counter::increment); // attach increment function of this counter instance } void increment() { _count++; } long read() { return _count; } void zero(){ _count = 0; } private: InterruptIn _interrupt; volatile long _count; }; Counter counterLeft(PC_13); Counter counterRight(PC_12); Motor leftMotor(PE_5, PB_3, PB_3); //pwm, inB, inA Motor rightMotor(PE_6, PB_4, PB_4); //pwm, inA, inB PID leftPid(0.4, 0.1, 0.0, 0.01); //Kc, Ti, Td PID rightPid(0.4, 0.1, 0.0, 0.01); //Kc, Ti, Td //------------------------------- int main() { TS_StateTypeDef TS_State; uint16_t x, y; uint8_t text[30]; uint8_t status; BSP_LCD_SetFont(&Font20); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE); lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"DEMO", CENTER_MODE); wait(1); status = ts.Init(lcd.GetXSize(), lcd.GetYSize()); if (status != TS_OK) { lcd.Clear(LCD_COLOR_RED); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE); lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"INIT FAIL", CENTER_MODE); } else { lcd.Clear(LCD_COLOR_GREEN); lcd.SetBackColor(LCD_COLOR_GREEN); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE); lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"INIT OK", CENTER_MODE); } wait(1); lcd.Clear(LCD_COLOR_BLUE); lcd.SetBackColor(LCD_COLOR_BLUE); lcd.SetTextColor(LCD_COLOR_WHITE); /* do1 = 0; do2 = 1; do3 = 1; //do1 = 0; pwm1.period(1.0/10000); // 4 second period pwm1.write(0.50f); // 50% duty cycle, relative to period while(1) { ts.GetState(&TS_State); if (TS_State.TouchDetected) { x = TS_State.X; y = TS_State.Y; sprintf((char*)text, "x=%d y=%d ", x, y); lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); if (x <= 120) { do2 = 0;} else { do2 = 1;} float k = float(y)/320.00f; pwm1.write(k); } sprintf((char*)text, "c=%d ", counter.read()); lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE); } */ //right_en = 0; //left_en = 0; right_bk = 1; right_en = 0; //right_fr = 1; //right_sk.period(0.00005); //right_sk.write(0.50f); left_bk = 1; left_en = 0; //left_fr = 1; //left_sk.period(0.00005); //left_sk.write(0.50f); leftMotor.period(0.00005); //Set motor PWM periods to 20KHz. rightMotor.period(0.00005); //Input and output limits have been determined //empirically with the specific motors being used. //Change appropriately for different motors. //Input units: counts per second. //Output units: PwmOut duty cycle as %. //Default limits are for moving forward. leftPid.setInputLimits(0, 1500); leftPid.setOutputLimits(0.2, 0.9); leftPid.setMode(AUTO_MODE); rightPid.setInputLimits(0, 1500); rightPid.setOutputLimits(0.2, 0.9); rightPid.setMode(AUTO_MODE); long leftPulses = 0; //How far the left wheel has travelled. long leftPrevPulses = 0; //The previous reading of how far the left wheel //has travelled. float leftVelocity = 0.0; //The velocity of the left wheel in pulses per //second. long rightPulses = 0; //How far the right wheel has travelled. long rightPrevPulses = 0; //The previous reading of how far the right wheel //has travelled. float rightVelocity = 0.0; //The velocity of the right wheel in pulses per //second. long distance = 3000; //Number of pulses to travel. //while(1){ right_bk = 1; left_bk = 1; leftPulses = 0; //How far the left wheel has travelled. leftPrevPulses = 0; //The previous reading of how far the left wheel //has travelled. leftVelocity = 0.0; //The velocity of the left wheel in pulses per //second. rightPulses = 0; //How far the right wheel has travelled. rightPrevPulses = 0; //The previous reading of how far the right wheel //has travelled. rightVelocity = 0.0; //The velocity of the right wheel in pulses per counterLeft.zero(); counterRight.zero(); distance = 3000; //Number of pulses to travel. right_fr = 1; left_fr = 0; //wait(5); //Wait a few seconds before we start moving. //Velocity to mantain in pulses per second. leftPid.setSetPoint(1000); rightPid.setSetPoint(1000); while ((leftPulses < distance) || (rightPulses < distance)) { //Get the current pulse count and subtract the previous one to //calculate the current velocity in counts per second. leftPulses = counterLeft.read(); leftVelocity = (leftPulses - leftPrevPulses) / 0.01; leftPrevPulses = leftPulses; //Use the absolute value of velocity as the PID controller works //in the % (unsigned) domain and will get confused with -ve values. leftPid.setProcessValue(fabs(leftVelocity)); leftMotor.speed(leftPid.compute()); rightPulses = counterRight.read(); rightVelocity = (rightPulses - rightPrevPulses) / 0.01; rightPrevPulses = rightPulses; rightPid.setProcessValue(fabs(rightVelocity)); rightMotor.speed(rightPid.compute()); wait(0.01); sprintf((char*)text, "left=%d ", leftPulses); lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); sprintf((char*)text, "right=%d ", rightPulses); lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE); } leftMotor.brake(); rightMotor.brake(); right_bk = 0; left_bk = 0; /* right_bk = 1; left_bk = 1; leftPulses = 0; //How far the left wheel has travelled. leftPrevPulses = 0; //The previous reading of how far the left wheel //has travelled. leftVelocity = 0.0; //The velocity of the left wheel in pulses per //second. rightPulses = 0; //How far the right wheel has travelled. rightPrevPulses = 0; //The previous reading of how far the right wheel //has travelled. rightVelocity = 0.0; //The velocity of the right wheel in pulses per counterLeft.zero(); counterRight.zero(); distance = 30000; //Number of pulses to travel. right_fr = 1; left_fr = 1; //wait(5); //Wait a few seconds before we start moving. //Velocity to mantain in pulses per second. leftPid.setSetPoint(100000); rightPid.setSetPoint(100000); while ((leftPulses < distance) || (rightPulses < distance)) { //Get the current pulse count and subtract the previous one to //calculate the current velocity in counts per second. leftPulses = counterLeft.read(); leftVelocity = (leftPulses - leftPrevPulses) / 0.01; leftPrevPulses = leftPulses; //Use the absolute value of velocity as the PID controller works //in the % (unsigned) domain and will get confused with -ve values. leftPid.setProcessValue(fabs(leftVelocity)); leftMotor.speed(leftPid.compute()); rightPulses = counterRight.read(); rightVelocity = (rightPulses - rightPrevPulses) / 0.01; rightPrevPulses = rightPulses; rightPid.setProcessValue(fabs(rightVelocity)); rightMotor.speed(rightPid.compute()); wait(0.01); sprintf((char*)text, "left=%d ", leftPulses); lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); sprintf((char*)text, "right=%d ", rightPulses); lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE); } leftMotor.brake(); rightMotor.brake(); right_bk = 0; left_bk = 0; */ //} /* while(1){ sprintf((char*)text, "left=%d ", counterLeft.read()); lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); sprintf((char*)text, "right=%d ", counterRight.read()); lcd.DisplayStringAt(0, LINE(1), (uint8_t *)&text, LEFT_MODE); }*/ //lcd.Clear(LCD_COLOR_BLUE); //lcd.SetBackColor(LCD_COLOR_BLUE); //lcd.SetTextColor(LCD_COLOR_WHITE); //wait(0.3); //led = 0.5f; // shorthand for led.write() //led.pulsewidth(2); // alternative to led.write, set duty cycle time in seconds /*gyro.GetXYZ(GyroBuffer); int ret = snprintf(buffer2, sizeof buffer2, " %.1f ", GyroBuffer[0]); lcd.DisplayStringAt(0, LINE(3), (uint8_t *)buffer2, CENTER_MODE); ret = snprintf(buffer2, sizeof buffer2, " %.1f ", GyroBuffer[1]); lcd.DisplayStringAt(0, LINE(4), (uint8_t *)buffer2, CENTER_MODE); ret = snprintf(buffer2, sizeof buffer2, " %.1f ", GyroBuffer[2]); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)buffer2, CENTER_MODE);*/ //wait(1); //pc.printf("Hello World!\n"); // while(1) { /* if (pc.readable()) { pc.scanf("%s", &buffer); pc.printf("%s\r\n", &buffer); } */ //} }