Lejos NXT - Как я могу обнаружить остановку двигателя? - PullRequest
1 голос
/ 23 декабря 2011

Я пытаюсь построить решатель кубиков Рубика с 4 руками, чтобы схватить куб. Я использую прошивку lejos версии 0.9.0. Моя проблема в том, как я могу определить, что двигатель остановлен?

Например: Motor.A вращается вперед, в то время как двигатель будет заблокирован / остановлен, тогда Motor.A должен остановиться.

Я надеюсь, что кто-нибудь может мне помочь.

Ответы [ 3 ]

2 голосов
/ 03 июня 2015

Это, вероятно, то, что вы ищете:

isStalled ()

NXTRegulatedMotor.isStalled() - Вернуть true, если двигатель в данный момент остановлен. (то есть счетчик движений показывает меньше градусов поворота, чем ожидалось) http://www.lejos.org/nxt/nxj/api/lejos/nxt/NXTRegulatedMotor.html#isStalled()

Еще один метод, о котором вам следует знать:

setStalledThreshold ()

NXTRegulatedMotor.setStallThreshold() - Установите параметры для обнаружения остановленного двигателя. Двигатель будет распознаваться как остановленный, если ошибка движения (величина, на которую двигатель отстает от регулируемого положения) больше ошибки на период, превышающий время. http://www.lejos.org/nxt/nxj/api/lejos/nxt/NXTRegulatedMotor.html#setStallThreshold(int, int)

И, наконец, вот пример того, как все это собрать:

public static void main(String[] args) 
{
    boolean stalled = false;
    NXTRegulatedMotor motor_arm = Motor.A;
    motor_arm.setStallThreshold(1, 100);

    motor_arm.setSpeed(400);
    motor_arm.backward();

    while (! stalled)
    {
        LCD.drawString("Motor is rotating", 0, 0);
        if(motor_arm.isStalled())
        {
           motor_arm.stop();
           stalled=true;
           LCD.drawString("Motor is stalled", 0, 0);
           Delay.msDelay(3000);
        }

        Delay.msDelay(100);
    }

}

Примечание: Значения для setStalledThreshold() могут быть механически зависимыми , если вы используете шестерни для подключения двигателя к механизму остановки, значения для правильного обнаружения остановки могут варьируется в зависимости от дизайна вашего робота.

Удачи! :)

0 голосов
/ 05 января 2019

Согласно документации, motor.getPosition () должен быть таким же, как и motor.getTachoCount (). Если это не так, то вы можете считать, что двигатель остановлен.

публичный метод getPosition ()

Возвращает текущее положение двигателя регулятор пытается сохранить. Обычно это будет фактическим положение двигателя и будет таким же, как значение, возвращаемое getTachoCount (). Однако в некоторых обстоятельствах (ActiveMotors, которые в процессе сваливания или активных двигателей, которые были вытеснены положения), эти два значения могут отличаться. Обратите внимание, что если регулирование имеет было приостановлено, вызов этого метода перезапустит его.

Так что вам просто нужно проверить, равны ли эти два значения:

public boolean isStealed() {
    motor.getPosition() == motor.getTachoCount();
}
0 голосов
/ 23 декабря 2011

Я думаю, что проверка изменения позиции - единственный способ.Отправь команду на перемещение, подожди, проверь позицию, посмотри, что ты просил

...