Classe+StepperRobot+-+Operação

Home > Robótica > Bibliotecas **Recursos** > RunTimer > Timer2 > CircularBuffer > SerialLog > ActionPlan **Dispositivos** > Ultrassom > Array de sensores > NRF24L01 > Wireless log > RF24Control **Movimento** > StepperMotor > StepperMotorTm > StepperRobot Inicialização > **StepperRobot Operação** > StepperRobot Recursos

Aqui os detalhes sobre a operação dos motores usando a classe.

Comando dos movimentos
Os movimentos podem ser comandados usando vários métodos diferentes, listados abaixo:

Este método faz parte do "baixo nível" da classe, mas foi mantido exposto porque pode ajudar na fase de calibração do robô, como citado na página anterior. Não deve ser usado para a operação normal porque isso provocaria a perda de importantes recursos de mais alto nível que estão implementados em classes descendentes.
 * boolean moveSteps(char movType, uint steps) **
 * // **movType:** // tipo do movimento. Ver lista na página anterior.
 * ** //steps:// ** quantidade de passos que serão executados.
 * ** //retorno:// ** **//true//** se o movimento foi iniciado, **//false//** se não. Se o robô já está em movimento, o comando é ignorado e é retornado o valor **//false//**. Neste nível não há armazenamento de comandos.

Este método já usa as informações fornecidas na calibração e faz a atualização do controle de posição do robô. Os movimentos são quantificados em centímetros ou graus. Apenas o movimento mvBrake ainda usa passos para ser quantificado, por enquanto.
 * boolean move(char movType, float param) **
 * // **movType:** // tipo do movimento. Ver lista na página anterior.
 * ** //param:// ** quantidade de passos para o movimento **//mvBrake//**, centímetros para os movimentos **//mvAhead//** e **//mvBack//** e graus para os outros movimentos.
 * ** //retorno:// ** **//true//** se o movimento foi iniciado, **//false//** se não. Se o robô já está em movimento, o comando é ignorado e é retornado o valor **//false//**. Neste nível não há armazenamento de comandos.

Este método estende o movimento que estiver sendo executado no momento.
 * boolean extendMove(float param) **
 * ** //param:// ** valor que será acrescentado ao movimento. Quantidade de passos para o movimento **//mvBrake//**, centímetros para os movimentos **//mvAhead//** e **//mvBack//** e graus para os outros movimentos.
 * ** //retorno:// ** **//true//** se a extensão foi aceita, **//false//** se não. Se o robô **//não//** está em movimento, ou se já está na fase de desaceleração, o comando é ignorado e é retornado o valor **//false//**.

Este método usa uma lista circular para armazenar comandos de movimento. Os comandos podem ser adicionados a qualquer momento, esteja o robô em movimento ou não. Uma vez adicionados os movimentos são executados em sequência, um após o outro. Se o robô não está em movimento, o movimento é iniciado imediatamente, se já está, o comando é adicionado no final da lista. Caso sejam adicionados movimentos do mesmo tipo em sequência, eles são somados de maneira a ficar com um único comando de movimento. Isso evita que o robô desacelere e depois acelere novamente para executar o mesmo movimento. Sobre o // buffer // de movimentos veja o próximo tópico.
 * boolean addMove(char movType, float param) **
 * // **movType:** // tipo do movimento que será adicionado. Ver lista na página anterior.
 * ** //param:// ** quantidade de passos para o movimento **//mvBrake//**, centímetros para os movimentos **//mvAhead//** e **//mvBack//** e graus para os outros movimentos.
 * ** //retorno:// ** **//true//** se o movimento foi adicionado, **//false//** se não. O comando é recusado se a lista já estiver lotada. Veja os detalhes sobre o //buffer// de movimentos no próximo tópico.

Use este método para paradas de emergência a fim de evitar colisões quando for o caso. O robô para imediatamente e a lista de movimentos é zerada. Caso tenha ainda algum espaço livre para a parada, prefira o método **//decelStop//**.
 * void stopNow **

Este método também para o robô, mas faz isso forçando o robô a entrar em desaceleração, ou seja, o movimento continua por alguns centímetros. A vantagem é que desacelerando antes da parada, os dispositivos instalados no robô não sofrerão os efeitos inerciais de uma parada brusca. O método também zera a lista de movimentos.
 * void decelStop **

Lista circular de movimentos
Um dos recursos implementados na classe é uma lista circular capaz de armazenar movimentos. Os movimentos são adicionados usando o método **//addMove//** descrito acima e serão executados na sequência em que foram adicionados. O número máximo de movimentos que podem ser armazenados é definido pelo **//#define movBufLen//** declarado no arquivo //stepperRobot.h//. O valor default é 16 movimentos. Caso não precise de tudo isso esse valor pode ser diminuído para economizar memória.

Este é um recurso bastante útil e importante, mas pode se tornar irrelevante se existir uma classe de mais alto nível no programa que também implemente uma lista de comandos. Esse é o caso da classe ** //ActionPlan// ** que também é parte desta suíte de classes. ** //ActionPlan// ** também implementa uma lista circular que pode conter movimentos, mas pode incluir comandos para outros dispositivos como sensores e atuadores. Nesse caso, conforme a lógica usada pelo programa, a lista implementada pela classe **//StepperRobot//** pode não ser necessária e passa a ser um consumo inútil de memória. Para evitar essa situação, todo o código relacionado à lista circular, incluindo o método **//addMove//** está dentro de cláusulas **//#ifdef//** que são desativadas se o **//#define _USE_MOVE_BUFFER_//** declarado no arquivo //stepperRobot.h// estiver comentado. Desativar o código relacionado à lista de movimentos economiza mais de 300 bytes no tamanho do programa e mais algumas dezenas na memória RAM.