From f3928650a53e2c23428e5afce84aedb0c39421a5 Mon Sep 17 00:00:00 2001 From: Blboun3 <62328614+Blboun3@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:43:21 +0100 Subject: [PATCH] 0.4.2 - 'HELGA' (#67) Updated run_short() to run_short_side() Added gyro Done calculations with gyro to EC driving straight TODO: problems with battery --- app | Bin 228344 -> 229208 bytes app.cpp | 93 +++++++++++++++++++++++++++++++++----------------------- 2 files changed, 55 insertions(+), 38 deletions(-) diff --git a/app b/app index 500a454a5477ce8bfa82441ba069f6e02fe731bf..77395294bd47d26809b7bb8ef23ac5505e5b7f13 100644 GIT binary patch delta 51008 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 Z&*M0;ad@8h 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 diff --git a/app.cpp b/app.cpp index 1a59ab2..5118245 100644 --- a/app.cpp +++ b/app.cpp @@ -8,8 +8,11 @@ /* Change notes: -0.4.0 - 'HELGA' (#50) -Fixed +0.4.2 - 'HELGA' (#64) +Updated run_short() to run_short_side() +Added gyro +Done calculations with gyro to EC driving straight +TODO: problems with battery 0.3.0 - 'INGRID' (#42) Some weird magic in calculations of motor speeds @@ -97,7 +100,7 @@ void close_door(ev3cxx::Motor hinge) hinge.onForDegrees(25, 200); } -/* +/* Function to pick up all cubes on shorter side return true if ran till the end and false if stopped by middle button */ @@ -116,6 +119,7 @@ bool run_short_side(ev3cxx::MotorTank motors, MPWRS idealMPWRS, ev3cxx::GyroSens motor_powers.rMotorPWR = idealMPWRS.rMotorPWR; bool run = true; + bool error = false; int cycleCounter = 0; while (run) @@ -123,7 +127,6 @@ bool run_short_side(ev3cxx::MotorTank motors, MPWRS idealMPWRS, ev3cxx::GyroSens motors.on(motor_powers.lMotorPWR, motor_powers.rMotorPWR); tslp_tsk(50); - // Reset both motor's powers motor_powers.lMotorPWR = idealMPWRS.lMotorPWR; motor_powers.rMotorPWR = idealMPWRS.rMotorPWR; @@ -139,58 +142,76 @@ bool run_short_side(ev3cxx::MotorTank motors, MPWRS idealMPWRS, ev3cxx::GyroSens if (btnEnter.isPressed()) { run = false; - return false; + error = true; + motors.off(true); } // Check gyro angle and change driving speed to fix the angle // To the left - if (angle < LEFT_THRESHOLD) { - //ev3_speaker_play_tone(NOTE_A5, 250); + if (angle < LEFT_THRESHOLD) + { + // ev3_speaker_play_tone(NOTE_A5, 250); int correction = ev3cxx::abs(angle - LEFT_THRESHOLD); - motor_powers.lMotorPWR = motor_powers.rMotorPWR + (correction * CORRECTION_MULTIPLIER);//(int)pow(CORRECTION_MULTIPLIER, correction); - ev3_speaker_play_tone(correction*1000,30); + motor_powers.lMotorPWR = motor_powers.rMotorPWR + (correction * CORRECTION_MULTIPLIER); //(int)pow(CORRECTION_MULTIPLIER, correction); + ev3_speaker_play_tone(correction * 1000, 30); // Check if the motor is stuck - if(lPower == 0){ + if (lPower == 0) + { ev3cxx::statusLight.setColor(ev3cxx::StatusLightColor::RED); - ev3_speaker_play_tone(NOTE_A5,250); + ev3_speaker_play_tone(NOTE_A5, 250); } - - // To the right - } else if (angle > RIGHT_THRESHOLD) { - //ev3_speaker_play_tone(NOTE_A4, 250); + + // To the right + } + else if (angle > RIGHT_THRESHOLD) + { + // ev3_speaker_play_tone(NOTE_A4, 250); int correction = ev3cxx::abs(angle - RIGHT_THRESHOLD); - motor_powers.rMotorPWR = motor_powers.lMotorPWR + (correction * CORRECTION_MULTIPLIER);//(int)pow(CORRECTION_MULTIPLIER, correction);//correction * CORRECTION_MULTIPLIER; - ev3_speaker_play_tone(correction*1000,30); + motor_powers.rMotorPWR = motor_powers.lMotorPWR + (correction * CORRECTION_MULTIPLIER); //(int)pow(CORRECTION_MULTIPLIER, correction);//correction * CORRECTION_MULTIPLIER; + ev3_speaker_play_tone(correction * 1000, 30); // Check if the motor is stuck - if(rPower == 0){ + if (rPower == 0) + { ev3cxx::statusLight.setColor(ev3cxx::StatusLightColor::ORANGE); - ev3_speaker_play_tone(NOTE_A4,250); + ev3_speaker_play_tone(NOTE_A4, 250); } } cycleCounter++; - if(cycleCounter == CYCLE_LIMIT) { + if (cycleCounter == CYCLE_LIMIT) + { run = false; } } - return true; + ev3_speaker_play_tone(NOTE_C4, 250); + tslp_tsk(250); + ev3_speaker_play_tone(NOTE_C4, 125); + tslp_tsk(125); + ev3_speaker_play_tone(NOTE_D4, 250); + tslp_tsk(250); + ev3_speaker_play_tone(NOTE_C4, 250); + tslp_tsk(250); + ev3_speaker_play_tone(NOTE_B4, 750); + tslp_tsk(750); + ev3_speaker_play_tone(NOTE_G4, 750); + tslp_tsk(750); + return !error; } - void main_task(intptr_t unused) { // Create version info // version createVersion(int versionID, const char *codename, int major, int minor, int patch, int day, int month, int year, int hour, int minute) - const version VERSION = createVersion(62, "HELGA", 0, 4, 2, 10, 11, 2023, 14, 40); + const version VERSION = createVersion(67, "HELGA", 0, 4, 2, 10, 11, 2023, 14, 40); // Set-up screen ev3cxx::display.resetScreen(); ev3cxx::display.setFont(EV3_FONT_MEDIUM); // Print version information on screen - ev3cxx::display.format(" DOBREMYSL\nVERSION: % .% .% #% \nNAME: % ") % VERSION.major % VERSION.minor % VERSION.patch % VERSION.id % VERSION.codename; + ev3cxx::display.format(" DOBREMYSL\nVERSION: % .% .% #% \nNAME: % \nBattery: % mV") % VERSION.major % VERSION.minor % VERSION.patch % VERSION.id % VERSION.codename % ev3_battery_voltage_mV(); ev3cxx::statusLight.setColor(ev3cxx::StatusLightColor::GREEN); @@ -214,10 +235,10 @@ void main_task(intptr_t unused) tslp_tsk(200); // Set up motor powers - const int SPEED_MODIFIER = 30; + const int SPEED_MODIFIER = 10; MPWRS idealMPWRS; - idealMPWRS.lMotorPWR = 70 - SPEED_MODIFIER; - idealMPWRS.rMotorPWR = 50 - SPEED_MODIFIER; + idealMPWRS.lMotorPWR = 75 - SPEED_MODIFIER; + idealMPWRS.rMotorPWR = 60 - SPEED_MODIFIER; MPWRS motor_powers; motor_powers.lMotorPWR = idealMPWRS.lMotorPWR; @@ -226,7 +247,7 @@ void main_task(intptr_t unused) // Set up motors ev3cxx::Motor hinge(ev3cxx::MotorPort::A, ev3cxx::MotorType::LARGE); // Hinge motor ev3cxx::MotorTank motors(ev3cxx::MotorPort::B, ev3cxx::MotorPort::C); // Tank motors - ev3cxx::GyroSensor gyro(ev3cxx::SensorPort::S1); // gyro sensor + ev3cxx::GyroSensor gyro(ev3cxx::SensorPort::S1); // gyro sensor // Set up buttons ev3cxx::BrickButton btnEnter(ev3cxx::BrickButtons::ENTER); // Middle button @@ -234,19 +255,15 @@ void main_task(intptr_t unused) // Start program btnEnter.waitForClick(); - //turn_left(motors); + // turn_left(motors); bool side_1 = run_short_side(motors, motor_powers, gyro); - ev3_speaker_play_tone(NOTE_C4, 250); - ev3_speaker_play_tone(NOTE_C4, 125); - ev3_speaker_play_tone(NOTE_D4, 250); - ev3_speaker_play_tone(NOTE_C4, 250); - ev3_speaker_play_tone(NOTE_B4, 750); - - if(!side_1) { + if (!side_1) + { return; - } else { - ev3_speaker_play_tone(NOTE_G5, 500); + } + else + { return; } }