Código de controlador personalizado em VEXcode EXP

O uso do Controlador pode facilitar a condução e movimentação do robô para concluir uma tarefa. No entanto, existem limitações no uso do programa Drive e, dependendo da construção do seu robô ou da tarefa em questão, você pode querer controles diferentes. Codificar o Controlador permite que você otimize o Controlador para que ele se ajuste melhor ao seu robô e à tarefa em questão. Existem várias maneiras de codificar o Controlador no VEXcode EXP. Cada um tem suas vantagens e limitações, e alguns métodos são mais adequados para determinadas situações, dependendo do resultado desejado.

Este artigo orientará você por três opções diferentes para codificação personalizada do controlador no VEXcode EXP. Cada método será descrito com suas vantagens, limitações e um exemplo de caso de uso para ajudar a orientá-lo na escolha de um método. Para os fins deste artigo, todos os exemplos de código mostrados foram criados para o Clawbot. No entanto, os mesmos conceitos podem ser aplicados a inúmeras outras compilações encontradas em builds.vex.come compilações personalizadas.

Opção 1: Atribuição de botões na configuração do dispositivo

Essa opção é ótima quando você está usando uma versão padrão, como BaseBot ou Clawbot, e deseja começar a trabalhar rapidamente.

Esta opção permite atribuir motores, um sistema de transmissão ou grupos de motores a botões no controlador na configuração do dispositivo. Para obter mais informações sobre como atribuir botões ao controlador na configuração do dispositivo, este artigo.

Menu de dispositivos VEXcode EXP com as opções do controlador apresentadas. O diagrama de controlos por botões mostra que os dois joysticks controlam o robô numa configuração de direção tipo tanque. Os botões para cima e para baixo controlam um grupo de motores do braço (ArmMotorGroup), e os botões do eixo R controlam um motor da garra (ClawMotor).

Resumo da Opção 1: Atribuição de botões na configuração do dispositivo

Vantagens

Limitações

Situação de exemplo

  • Configuração rápida sem necessidade de codificação
  • Método mais simples
  • Facilmente ajustável
  • Pode atribuir motores individuais, um sistema de transmissão padrão e grupos de motores aos botões
  • As atribuições de botões são limitadas ao número de botões no controlador
  • O trem de força não pode exceder 4 motores ou ser personalizado (somente um acionamento padrão é suportado, não um acionamento H, holonômico ou outro trem de força personalizado)
  • Manipular uma construção padrão, como BaseBot, Clawbot ou uma simples modificação dessas construções padrão. Por exemplo, um BaseBot com uma entrada acoplada na frente controlada por um grupo motor.
  • Manipular quais botões correspondem a diferentes comportamentos no robô rapidamente, sem muita codificação

Opção 2: Usando um Forever Loop

Se você estiver usando uma compilação personalizada em vez de uma compilação padrão, ou deseja ter mais personalização em seu controlador, esta opção é uma boa opção. Usar um loop Forever é uma ótima introdução para criar código personalizado para seu Controller.

Esta opção coloca todas as condições do Controlador e seus botões associados em um loop Forever. Isso proporciona mais flexibilidade, especialmente com designs de construção personalizados, mas também requer alguma experiência em codificação. Uma consideração ao usar esta opção, entretanto, é a duração e a complexidade do seu projeto. Quanto mais condições forem adicionadas, maior será a pilha de códigos. Isso significa que vários blocos devem ser executados em ordem e, quando há muitos blocos, isso pode retardar a execução do projeto. A execução mais lenta do projeto pode criar um atraso entre pressionar os botões do Controlador e ver o comportamento do robô.

O exemplo específico mostrado abaixo é uma maneira de usar um loop Forever com um robô de design personalizado (como um robô com transmissão personalizada) para conduzir o robô e manipular a garra e o braço para interagir com objetos.

Espaço de trabalho VEXcode EXP com o projeto de blocos da Opção 2 aberto. O projeto possui uma pilha de blocos e dispositivos configurados. O menu Dispositivos é aberto na lateral e lista os seguintes dispositivos: ArmMotor na porta 3, ClawMotor na porta 4, Controller, LeftMotor na porta 6 e RightMotor na porta 10. Por último, existe a pilha de blocos para lidar com a entrada do controlador. A mensagem na pilha é: Ao iniciar, defina a paragem do ArmMotor para "manter em espera" e defina a paragem do ClawMotor para "manter em espera". O resto da pilha está contido num loop Forever. A mensagem diz: "Para sempre, defina a velocidade do motor esquerdo para a percentagem da posição do controlador 3, rode o motor esquerdo para a frente, defina a velocidade do motor direito para a percentagem da posição do controlador 2 e rode o motor direito para a frente." De seguida, se o botão de controlo para cima for pressionado, rode o motor do braço para cima; caso contrário, se o botão de controlo para baixo for pressionado, rode o motor do braço para baixo; caso contrário, pare o motor do braço. Por fim, se o Controlador A for pressionado, rode o ClawMotor para abrir; caso contrário, se o Controlador B for pressionado, rode o ClawMotor para fechar; e, caso contrário, pare o ClawMotor.

Baixe o arquivo de projeto VEXcode EXP "Opção 2" >

Explicação do código da opção 2.

Pedaço de código

Explicação

Detalhe da pilha de blocos no projeto VEXcode EXP da Opção 2. Dois blocos estão destacados e estão fora do ciclo Forever da pilha; dizem "set ArmMotor stopping to hold" e "set ClawMotor stopping to hold".

Um Clawbot foi usado para este exemplo de código. Quando os botões do controlador são usados ​​para levantar e abaixar o braço, assim que o botão é liberado, devido à gravidade o braço cairá novamente. Definir o braço e a garra para “segurar” garantirá que o braço e a garra permanecerão no lugar mesmo depois que os botões do controlador forem liberados.

Detalhe da pilha de blocos no projeto VEXcode EXP da Opção 2. Quatro blocos estão destacados dentro do ciclo "Forever" da pilha. Leem "Para sempre", definem a velocidade do motor esquerdo para a percentagem da posição do controlador 3, rodam o motor esquerdo para a frente, definem a velocidade do motor direito para a percentagem da posição do controlador 2 e rodam o motor direito para a frente. Diagrama do controlador EXP com os seus botões e joysticks identificados. A imagem mostra a vista da parte frontal do controlador. Os eixos do joystick esquerdo estão identificados como 3 e 4. O botão central do joystick esquerdo está identificado como L3. Os dois botões redondos abaixo do joystick esquerdo estão identificados como "Para cima" e "Para baixo". Os eixos do joystick direito estão identificados como 1 e 2. O botão central do joystick direito está identificado como R3. Os dois botões redondos abaixo do joystick direito estão identificados como A e B.

Um Clawbot foi usado para este exemplo de código. Quando os botões do controlador são usados ​​para levantar e abaixar o braço, assim que o botão é liberado, devido à gravidade o braço cairá novamente. Definir o braço e a garra para “segurar” garantirá que o braço e a garra permanecerão no lugar mesmo depois que os botões do controlador forem liberados.

Um loop Forever é usado para verificar continuamente quais botões estão sendo pressionados no controlador.

Os blocos [Set motor speed] são usados ​​para definir a velocidade do motor para a posição atual do controlador ao longo dos eixos 2 e 3. Isso é o equivalente a colocar um carro em movimento. Isso não necessariamente faz o carro se mover, apenas o define.

Cada eixo do joystick retorna um valor entre -100 e +100 e retorna um valor zero quando centralizado. Isto significa então que os eixos do joystick, quando pressionados, equivalem a -100% a 100%. Quanto mais próximo de 100 ou -100 os eixos forem empurrados, mais rápido o motor girará.

O bloco [Spin] é então usado para realmente mover o motor. Isso equivale a pisar no acelerador do carro depois que a direção for definida. Isto permite que cada motor seja controlado por um dos quatro eixos do Controlador.

Detalhe da pilha de blocos no projeto VEXcode EXP da Opção 2. Um bloco if, else if, else é destacado dentro do ciclo Forever da pilha. O código lê-se: se o botão de controlo para cima for pressionado, o motor do braço roda para cima; caso contrário, se o botão de controlo para baixo for pressionado, o motor do braço roda para baixo; e caso contrário, o motor do braço pára.

Um Clawbot foi usado para este exemplo de código. Quando os botões do controlador são usados ​​para levantar e abaixar o braço, assim que o botão é liberado, devido à gravidade o braço cairá novamente. Definir o braço e a garra para “segurar” garantirá que o braço e a garra permanecerão no lugar mesmo depois que os botões do controlador forem liberados.

O bloco [If then else if then else] é usado para mapear certos comportamentos para botões sendo pressionados ou liberados no Controlador. Nesta seção do código, as condições definidas são se os botões Para cima ou Para baixo forem pressionados. Nesse caso, certos comportamentos acontecerão, como levantar e abaixar o braço. Há também a parte else da condição: se nenhum botão for pressionado, o braço será configurado para parar de se mover.

Observe que a seção de código a seguir no projeto do Claw segue a mesma explicação.

Resumo da opção 2: usando um loop eterno

Vantagens

Limitações

Situação de exemplo

  • Pode acomodar construções personalizadas, especialmente transmissões com mais de 4 motores
  • Pode atribuir vários comportamentos a um único botão
  • Pode atribuir comportamentos a diferentes eixos no controlador (em oposição às únicas opções de Left Arcade, Right Arcade, Split Arcade e Tank Drive na configuração do dispositivo)
  • Requer algum conhecimento de codificação (condicionais, loops e conhecimento dos botões/joysticks no controlador)
  • Potencial para execução mais lenta do projeto ou atraso no tempo de resposta do botão. Como todos os comandos estão contidos em um único loop Forever, a execução do código pode ser lenta dependendo das condições definidas e do comprimento do código.
  • Usando o controlador com um robô personalizado, especialmente com um sistema de transmissão não padrão
  • Ao querer atribuir vários comportamentos a um único botão. Por exemplo, quando o botão para cima é pressionado, a garra pode abrir, avançar e fechar em torno de um objeto.

Opção 3: Usando eventos

Se você deseja muita customização para seu Controller, Usar Eventos é a melhor opção para você. O pressionamento de um botão pode acionar vários comportamentos do robô, como pressionar um botão para abrir a garra, levantar o braço e avançar por uma distância definida. Tentar codificar vários comportamentos por botão dentro de um loop Forever faria com que a execução do projeto ficasse drasticamente lenta – o uso de Eventos permite que você faça isso de forma mais eficaz.

Esta opção usa Eventos para dividir o fluxo do projeto. Isso é semelhante ao uso de um loop Forever, mas permite que o código seja mais organizado, para que a execução do botão tenha um tempo de resposta mais rápido. Tempo de resposta mais rápido significa que você não verá um atraso entre pressionar os botões do controlador e ver o comportamento do robô. Este exemplo mostra os mesmos comportamentos do projeto anterior, mas feito usando Events em vez do Forever Loop.

Espaço de trabalho VEXcode EXP com o projeto de blocos da Opção 3 aberto. O projeto tem 11 pequenas pilhas de blocos e dispositivos configurados. O menu Dispositivos é aberto na lateral e lista os seguintes dispositivos: ArmMotor na porta 3, ClawMotor na porta 4, Controller, LeftMotor na porta 6 e RightMotor na porta 10. Por fim, existem as 11 pequenas pilhas de blocos que tratam da entrada do controlador. A primeira linha de comando diz: "Ao iniciar, defina a paragem do ArmMotor para 'manter em espera' e, em seguida, defina a paragem do ClawMotor para 'manter em espera'". A segunda linha de comando diz: Quando o eixo 3 do controlador for alterado, defina a velocidade do motor esquerdo para a percentagem da posição do controlador 3 e, em seguida, rode o motor esquerdo para a frente. A terceira linha de comando diz: Quando o eixo 2 do controlador for alterado, defina a velocidade do RightMotor para a percentagem da posição do controlador 2 e, em seguida, rode o RightMotor para a frente. A quarta linha de comando diz: Quando o botão "Para cima" do controlador é premido, rode o motor do braço para cima. A quinta linha de comando diz: Quando o botão "Para cima" do controlador for libertado, pare o ArmMotor. A sexta linha de comando indica: Quando o botão "Para baixo" do controlador é premido, rode o motor do braço para baixo. A sétima linha de comando diz: Quando o botão "Pressionar" do controlador for libertado, pare o ArmMotor. A oitava linha de comando diz: Quando o botão A do controlador é premido, rode o ClawMotor para abrir. A nona linha de comando diz: Quando o botão A do controlador for libertado, pare o motor da garra. A décima linha de comando diz: Quando o botão B do controlador é premido, rode o motor da garra para fechar. A décima primeira e última linha de comando diz: Quando o botão B do controlador for libertado, pare o ClawMotor.

Baixe o arquivo de projeto VEXcode EXP "Opção 3" >

Explicação do código da opção 3.

Pedaço de código

Explicação

Pormenor de uma pilha de blocos no projeto Option 3 VEXcode EXP. A sequência de comandos indica: "Ao iniciar, defina a paragem do ArmMotor para 'manter em espera' e, em seguida, defina a paragem do ClawMotor para 'manter em espera'."

Um Clawbot foi usado para este exemplo de código. Quando os botões do controlador são usados ​​para levantar e abaixar o braço, assim que o botão é liberado, devido à gravidade o braço cairá novamente. Definir o braço e a garra para “segurar” garantirá que o braço e a garra permanecerão no lugar mesmo depois que os botões do controlador forem liberados.

Pormenor de duas pilhas de blocos no projeto Option 3 VEXcode EXP. A primeira linha de comando diz: Quando o eixo 3 do controlador for alterado, defina a velocidade do motor esquerdo para a percentagem da posição do controlador 3 e, em seguida, rode o motor esquerdo para a frente. A segunda linha de comando diz: Quando o veio 2 do controlador for alterado, defina a velocidade do motor direito para a percentagem da posição do controlador 2 e, em seguida, rode o motor direito para a frente. Diagrama do controlador EXP com os seus botões e joysticks identificados. A imagem mostra a vista da parte frontal do controlador. Os eixos do joystick esquerdo estão identificados como 3 e 4. O botão central do joystick esquerdo está identificado como L3. Os dois botões redondos abaixo do joystick esquerdo estão identificados como "Para cima" e "Para baixo". Os eixos do joystick direito estão identificados como 1 e 2. O botão central do joystick direito está identificado como R3. Os dois botões redondos abaixo do joystick direito estão identificados como A e B.

Um Clawbot foi usado para este exemplo de código. Quando os botões do controlador são usados ​​para levantar e abaixar o braço, assim que o botão é liberado, devido à gravidade o braço cairá novamente. Definir o braço e a garra para “segurar” garantirá que o braço e a garra permanecerão no lugar mesmo depois que os botões do controlador forem liberados.

{When controller axis} Blocos de eventos são usados ​​para acionar certos comportamentos quando um dos quatro eixos do Controlador é alterado usando os joysticks.

Os blocos [Set motor speed] são usados ​​para definir a velocidade do motor para a posição atual do controlador ao longo dos eixos A e D. Isso é o equivalente a colocar um carro em movimento. Isso não necessariamente faz o carro se mover, apenas o define.

Cada eixo do joystick retorna um valor entre -100 e +100 e retorna um valor zero quando centralizado. Isto significa então que os eixos do joystick, quando pressionados, equivalem a -100% a 100%. Quanto mais próximo de 100 ou -100 os eixos forem empurrados, mais rápido o motor girará.

O bloco [Spin] é então usado para realmente mover o motor. Isso equivale a pisar no acelerador do carro depois que a direção for definida. Isto permite que cada motor seja controlado por um dos quatro eixos do Controlador.

Pormenor de quatro pilhas de blocos no projeto Option 3 VEXcode EXP. A primeira linha de comando diz: Quando o botão "Para cima" do controlador é premido, rode o motor do braço para cima. A segunda linha de comando diz: Quando o botão "Para cima" do controlador for libertado, pare o ArmMotor. A terceira linha de comando diz: Quando o botão "Para baixo" do controlador é premido, rode o motor do braço para baixo. A quarta linha de comando diz: Quando o botão "Pressionar" do controlador for libertado, pare o ArmMotor.

Um Clawbot foi usado para este exemplo de código. Quando os botões do controlador são usados ​​para levantar e abaixar o braço, assim que o botão é liberado, devido à gravidade o braço cairá novamente. Definir o braço e a garra para “segurar” garantirá que o braço e a garra permanecerão no lugar mesmo depois que os botões do controlador forem liberados.

{When controller axis} Blocos de eventos são usados ​​para mapear certos comportamentos de botões pressionados ou liberados no Controlador. Nesta seção do código, as condições definidas são se os botões Para cima ou Para baixo forem pressionados. Nesse caso, certos comportamentos acontecerão, como levantar, abaixar ou parar o braço.

Observe que a última seção do código do projeto para o Claw segue a mesma explicação.

Resumo da Opção 3: Usando Eventos

Vantagens

Limitações

Situação de exemplo

  • Pode acomodar construções personalizadas, especialmente transmissões com mais de 4 motores
  • Pode atribuir vários comportamentos a um único botão
  • Pode atribuir comportamentos a diferentes eixos no controlador (em oposição às únicas opções de Left Arcade, Right Arcade, Split Arcade e Tank Drive na configuração do dispositivo)
  • Execução de código mais rápida e, portanto, capacidade de resposta do botão (já que cada condição é chamada separadamente e não incorporada em uma única pilha de código)
  • Requer o máximo conhecimento de codificação das opções (condicionais, loops, eventos e conhecimento dos botões/joysticks no controlador)
  • Usando o controlador com um robô personalizado, especialmente com um sistema de transmissão não padrão
  • Quando quiser atribuir vários comportamentos a um único botão sem atraso. Por exemplo, quando o botão para cima é pressionado, a garra pode abrir, avançar e fechar em torno de um objeto.

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: