ROBOTC — автономное программирование с помощью встроенных энкодеров

#integrated #robotc

#Встроенный #robotc

Вопрос:

У меня есть X-диск, который закодирован в ROBOTC. У меня и моей команды уже есть встроенные энкодеры двигателя на роботе (для автономного периода). Однако код для их запуска неверен. Текущий автономный код приведен ниже. Когда я запускаю его, он просто идет вперед вечно и с разной скоростью.

Я просмотрел несколько руководств, но ни одно из них не работает. У кого-нибудь есть код, чтобы заставить двигатели (393 двигателя) работать со счетом 720?


 #pragma config(I2C_Usage, I2C1, i2cSensors)
#pragma config(Sensor, I2C_1, sensorQuadEncoderOnI2CPort, AutoAssign)
#pragma config(Motor,  port2, FL, tmotorVex393_MC29, PIDControl, encoderPort, I2C_1)
#pragma config(Motor,  port3, BR, tmotorVex393_MC29, PIDControl, reversed, encoderPort, I2C_1)
#pragma config(Motor,  port8, BL, tmotorVex393_MC29, PIDControl, encoderPort, I2C_1)
#pragma config(Motor,  port9, FR, tmotorVex393_MC29, PIDControl, reversed, encoderPort, I2C_1)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//

task main()
{
// Autonomous with Integrated Encoders
nMotorPIDSpeedCtrl[FL] = mtrSpeedReg;
nMotorPIDSpeedCtrl[FR] = mtrSpeedReg;
nMotorPIDSpeedCtrl[BL] = mtrSpeedReg;
nMotorPIDSpeedCtrl[BR] = mtrSpeedReg;

//Clears motor values
nMotorEncoder[FL] = 0;
nMotorEncoder[FR] = 0;
nMotorEncoder[BL] = 0;
nMotorEncoder[BR] = 0;

//Forward
motor[FL] = 63;
motor[FR] = 63;
motor[BL] = 63;
motor[BR] = 63;
   while(nMotorEncoder[FL] < 720) {
}

//Clears motor values
nMotorEncoder[FL] = 0;
nMotorEncoder[FR] = 0;
nMotorEncoder[BL] = 0;
nMotorEncoder[BR] = 0;

}
  

Комментарии:

1. Могут ли значения энкодера уменьшаться, а не увеличиваться? Попробуйте изменить свое while условие на nMotorEncoder[FL] > -720 .

Ответ №1:

Вам необходимо явно остановить двигатели (а не просто обнулить энкодеры) после цикла while. В противном случае робот не знает, что нужно остановиться; он просто знает, что он прошел цель энкодера.

Итак, этот код должен работать для вас:

 //Clears motor values
nMotorEncoder[FL] = 0;
nMotorEncoder[FR] = 0;
nMotorEncoder[BL] = 0;
nMotorEncoder[BR] = 0;

 motor[FL] = 63;
 motor[FR] = 63;
 motor[BL] = 63;
 motor[BR] = 63;
//Forward
while(nMotorEncoder[FL] < 720) {
}
//stops motors
motor[FL] = 0;
motor[FR] = 0;
motor[BL] = 0;
motor[BR] = 0;
//Clears motor encoder values
nMotorEncoder[FL] = 0;
nMotorEncoder[FR] = 0;
nMotorEncoder[BL] = 0;
nMotorEncoder[BR] = 0;