# Last edited on 2018-07-18 17:26:43 by stolfilocal # Comments on AccelStepper. After writing # they did not seem relevant, therefore # were not sent to team. Suponha um submarino parado debaixo dágua que de repente liga o motor na força máxima {F} no instante {t0}. Ele não vai sair de repente numa velocidade alta, mas vai acelerar gradualmente. E também não continua acelerando sem parar, mas eventualmente atinge uma velocidade máxima, devido à resistência da água. O movimento segue a equação aproximada {F = M a + B v}, onde {v} é a velocidade, {a} é a aceleração, {M} é o coeficiente de inércia (isto é, a massa), e {B} o coeficiente de atrito. A solução dessa equação é {v(t0+t) = (F/B)(1 - exp(-t/T))}, onde {T} é o tempo característico do sistema, {T = M/B}. Veja a figura anexa. Isto é, o submarino começa acelerando com a aceleração {a(t0) = F/M} (lei de Newton) e tende exponencialmente para a velocidade limite {vlim = F/B} em que a força motriz é igual à força do atrito. Por outro lado, se a força motriz {F} cai para zero num instante {t1}, quando o submarino está se movendo com velocidade {vini}, ele não pára imediatamente. A mesma equação vale, e a solução neste caso é {v'(t1+t) = vini exp(-t/T)}. Ou seja, a velocidade decai exponencialmente, começando em {vini} e tendendo a zero, com o mesmo tempo caracterítico {T}. A mesma análise vale quando um motor é ligado para girar um eixo, mas os símbolos tem sentido um pouco diferente. {F} é o torque que o motor aplica no eixo; {v} é a velocidade de rotação (ângulo por segundo); {a} é a aceleração angular (ângulo por segundo ao quadrado); {M} é a inércia de rotação (momento de inércia) do eixo e de tudo o que está preso nele; e {B} é o coeficiete de atrito de rotação. Por outro lado, se o motor é um motor de passos, a velocidade angular deveria ser {u = s f}, onde {s} é o ângulo de cada passo e {f} é a frequência dos pulsos de corrente de acionamento em cada pino, emitidos pelo Arduino. Mas o motor de passo não vai conseguir manter a velocidade {u} especificada pelo Arduino se ela for maior que a velocidade máxima {F/B} que a física permite, onde {F} é o torque máximo que o motor consegue aplicar quando em movimento; ou se ele tentar mudar a velocidade real do eixo com uma aceleração maior que {F/M}, ou uma deceleração maior que {G/M} onde {G} é o torque que gaz o motor girar mesmo sem pulsos de acionamento. Se esses limites forem excedidos, o motor "patina", perde passos, e acelera ou freia menos do que os pulsos mandam. Se ele está parado, e os pulsos são rápidos demais, ele pode nem sair do lugar. Nesse caso o consumo de corrente provavelmente será muito maior que o normal. De qualquer forma, quando os limites são exedidos, o estado real do motor (ângulo rodado e velocidade) não vai ser aquele que o Arduino está supondo. A função da biblioteca AccelStepper é então fazer o motor girar de um certo ângulo total da maneira mais rápida e suave possível, sem exceder os limites acima. Para isso, ela varia a duração dos passos gradualmente, tanto na aceleração quanto na freada, segundo as equações acima. Para que a biblioteca AccelStepper funcione corretamente, o firmware precisa especificar valores corretos para a aceleração máxima {F/M} e para a velocidade máxima {F/B}. Se os valores especificados forem muito altos, o Arduino vai mandar pulsos que o motor não consegue obedecer, com as consequências acima. Agora que expliquei tudo isso, vamos ao ponto: isso tudo não interessa no nosso caso. 8-) O AccelStepper foi projetado para o caso em que o tempo de resposta {T=M/B} é significativo; isto é, a resistência do sistema é mais devida a inércia {M} to que ao atrito {B}. Por isso ele precisa aumentar gradualmente a velocidade dos pulsos na partida, e diminuir gradualmente na freada, para não patinar. Mas no nosso caso o atrito domina. Isto é, a velocidade limite {F/B} é relativamente baixa, a aceleração limite {F/M} é alta, e o motor consegue atingir a velocidade limite logo no primeiro passo.