Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Controle um Rover Arduino com Firmata e Gamepad Xbox One

Componentes e materiais

ComponenteQuantidade
Controle Xbox One e Adaptador Sem Fio para Windows1
Módulo Bluetooth SparkFun BlueSMiRF Silver (ou HC-05/HC-06 equivalente)1
Arduino UNO1

Aplicativos e serviços online

Sobre o projeto

Há alguns meses comprei um pequeno rover (controlado por um Arduino Uno) por um ótimo preço. O kit era muito completo: chassi do carro, 2 rodas, 2 motores DC com engrenagem, UNO R3, controlador de motor L298N Dual H-Bridge e vários outros componentes.

Este rover é destinado a ser programado para operação autônoma. Por isso, um sensor ultrassônico e um servo também estão incluídos no kit. Também há um shield de sensores Arduino 5 bem legal no kit. Sim, foi uma pechincha real ;-)

Mas minha ideia era usar tanto um controle Xbox One quanto o protocolo Firmata para pilotar este rover eu mesmo ou um dos meus filhos. E funciona muito bem!

Principais partes usadas neste projeto:

Montando o kit

Montar o kit não é difícil. Embora o manual de construção estivesse em chinês, tudo parece bem lógico. Há apenas uma placa base, então tive que colocar alguns componentes em cima e outros embaixo (agora o controlador de motor).

Nesta imagem, dois suportes de bateria diferentes são adicionados. Durante a programação, descobri que precisava usar uma fonte de alimentação separada apenas para fazer os motores funcionarem.

Conectando os motores – layout de pinos do controlador

O coração do hardware desta vez não é o Arduino Uno, mas o controlador de motor.

"O L298 é um driver dual H-bridge para motores DC escovados e motores de passo. Suporta uma ampla faixa de tensão operacional e pode fornecer 2 A por canal em um pacote through-hole acessível para projetos faça-você-mesmo."

Este controlador controlará a velocidade e direção de cada um dos dois motores, usando sinais vindos do Arduino.

O layout de pinos do L298N Dual H-Bridge Motor Controller é:

Nota: O controlador tem sua própria fonte de alimentação. O Arduino tem uma também. Para manter as coisas funcionando (sem explodir coisas, dê a eles um terra comum. Veja item 4 acima)

Conectando os motores – layout de pinos do Arduino

Conectar o Arduino é bem direto. Conectamos o terra e os 5 volts da fonte de alimentação ao Arduino. E conectamos as seis linhas (ENA, IN1-4 e ENB) aos pinos D10 até D5.

Deve ficar claro que as portas 7 e 8 (e 9 e 10 para o outro motor) são apenas portas GPIO regulares. Estas serão usadas para a direção do motor. Se ambas as portas (ex: 7 e 8) estiverem LOW, o motor não fará nada (para). Se uma estiver HIGH e a outra LOW, o motor girará em uma direção. Se conectado ao contrário (a primeira LOW e a outra HIGH), o motor conectado girará na outra direção.

Mas... apenas definir esses pinos resultará em nada. Nenhuma peça móvel ainda!

A mágica virá dos pinos 5 e 10. Estes são pinos 'especiais' que podem gerar sinal PWM. Definir um valor entre 0 e 255 resultará em rodar o motor MUITO devagar (parado) ou em alta velocidade.

Nota: Cada porta no Arduino Uno capaz de PWM é marcada com um til (~).

Conectando o Bluetooth

O módulo Bluetooth que uso só precisa ser conectado às portas RX e TX (cruze as linhas) e precisa de alimentação 5V e terra do Arduino.

Sketch Firmata no Arduino

O sketch Firmata "StandardFirmata" é tudo que precisamos no Arduino! Basta obtê-lo nos exemplos da Arduino IDE e carregá-lo (talvez você precise desconectar TX/RX primeiro para completar o upload).

Nota: Devido à falta de qualidade do meu módulo Bluetooth, sempre diminuo o baudrate que é hardcoded dentro do sketch, e o defino para 9600.

Senhores, liguem seus motores

Ou, testem a conexão…

Por que estou usando Firmata? Porque é fácil. Quão fácil? Muito fácil. E pode até ser feito sem programação. Basta iniciar o app Windows Remote Arduino Experience (disponível na loja e também funciona em dispositivo Windows 10 Mobile).

Primeiro, você terá que conectar ao módulo Bluetooth HC-6 já emparelhado.

Quando emparelhado, vá para a página PWM. Ative o pino digital 5 e dê um valor de, digamos, 128.

Cuidado: O próximo passo fará seu motor girar. Capacete e rodas fora do chão. Você saberá por que quando vir.

Então vá para a página Digital. E alterne o switch do pino digital 6.

Agora, se tudo estiver conectado e rodando, um dos motores girará!

Se sim, você pode testar outras velocidades (usando valor PWM mais alto ou mais baixo) ou mudar a direção (defina pino digital 6 para 0 volt e pino digital 7 para 5 volt).

E pronto. Você pode controlar essa roda!

Mas há mais, o mesmo vale para pino 10 (PWM) e pinos digitais 9 e 8.

Ambas as rodas rodando. Agora comece a codificar…

O app UWP como intermediário

Fica claro que precisamos de um novo app UWP entre o controle Xbox One e o rover.

Já escrevi sobre usar o controle Xbox One aqui. Desta vez combinaremos esse conhecimento com nosso rover.

Vamos olhar a interface do nosso app UWP: é bem simples, dois botões e um bloco de texto. Não terei nada mais a fazer do que primeiro conectar ao Arduino usando Firmata. E uma vez feita a conexão, o botão do controle terá que iniciar um loop gigante para ler a entrada do controle e transformá-la em comandos úteis.

E o que queremos criar são controles clássicos de tanque com dois manches. Tudo que precisamos é verificar os dois thumbsticks no controle Xbox One. Movê-los para frente e para trás também iniciará o motor correspondente para frente e para trás.

Nota: Se você iniciar um novo app UWP, não esqueça de adicionar a capacidade Bluetooth. E terá que instalar o pacote nuget para Firmata.

Primeiro adicionamos o snippet XAML (veja seção de código para código fonte XAML) no grid do mainform para ter alguns botões.

Em seguida, adicionamos o code-behind (veja seção de código para código fonte C#) do main form. Basicamente é dividido em duas partes. Primeiro fazemos uma conexão via Bluetooth com o protocolo Firmata. Em seguida, começamos a ouvir entrada no controle Xbox One.

Dentro do loop para verificar os controles, decidimos se um thumbstick está apontando para frente, para trás ou na faixa de 'parada'. Depois disso, decidimos qual será o valor para o pino PWM.

É interessante ver que escrever um valor PWM é representado no Firmata como escrever um valor analógico em uma porta digital. Não há método PWM especial na classe Arduino.

Adicionei dois métodos "ArduinoDigitalWrite" e "ArduinoAnalogWrite" para evitar escrever o mesmo valor repetidamente no Arduino. Isso vai entupir a comunicação e degradar o desempenho do Arduino. (Em um design mais rico, adicionei um buzzer. Sem ignorar comandos duplicados, o desempenho do buzzer era extremamente ruim e terrível de ouvir).

Quando os motores recebem pulsos PWM baixos, o motor não começa a rodar diretamente, ele chiará com um som muito característico. Isso é comportamento normal. E foi assim que descobri que tinha que adicionar duas fontes de alimentação. Na primeira vez que conectei tudo, achei que o controlador estava quebrado. Nada aconteceu. Até que desliguei um dos motores e o outro começou a chiar.

Então é assim que funciona:

Nota de rodapé: A luz piscante não é apenas para efeito dramático. Sempre que suas criações começarem a se mover, por favor, esteja ciente da segurança. A engenhoca é burra, você não! Por isso coloquei esta luz no topo em primeiro lugar.

Código

Controles XAML para iniciar a comunicação

<StackPanel Orientation="Vertical">
  <Button Name="btnStart" Click="btnStart_Click" FontSize="50" Width="400" Content="Start" />
  <Button Name="btnController" Content="Controller" FontSize="50" Width="400" IsEnabled="False" Click="btnController_Click" />
  <TextBlock Name="tbRead" FontSize="20" Foreground="Gray" />
</StackPanel>

Code-Behind do app UWP mainform (C#)

public sealed partial class MainPage : Page {
  private BluetoothSerial _bluetooth;
  private RemoteDevice _arduino;
  private UwpFirmata _firmata = null;
  private Gamepad _Gamepad = null;
  private double _SpeedLimit = 0.75;
  private double _ActionPoint = 0.15;
  private byte _LeftForward = 6;
  private byte _LeftBackward = 7;
  private byte _LeftValue = 5;
  private byte _RightForward = 9;
  private byte _RightBackward = 8;
  private byte _RightValue = 10;
  private Dictionary<byte, PinState> _CurrentPinStates = new Dictionary<byte, PinState>();
  private Dictionary<byte, ushort> _CurrentSpeedValues = new Dictionary<byte, ushort>();

  public MainPage() { this.InitializeComponent(); }

  private void btnStart_Click(object sender, RoutedEventArgs e) {
    btnStart.IsEnabled = false;
    Gamepad.GamepadAdded += Gamepad_GamepadAdded;
    Gamepad.GamepadRemoved += Gamepad_GamepadRemoved;
    _bluetooth = new BluetoothSerial("HC-06");
    _bluetooth.ConnectionLost += BluetoothConnectionLost;
    _bluetooth.ConnectionFailed += BluetoothConnectionFailed;
    _bluetooth.ConnectionEstablished += OnConnectionEstablished;
    _firmata = new UwpFirmata();
    _arduino = new RemoteDevice(_firmata);
    _firmata.begin(_bluetooth);
    _bluetooth.begin(9600, SerialConfig.SERIAL_8N1);
    _arduino.DeviceReady += ArduinoDeviceReady;
  }
  // ... (código completo disponível no projeto original)
}

Processo de manufatura

  1. Sistema de Presença RFID Confiável com Arduino e Python
  2. Controle Remoto Universal Android com Arduino, 1Sheeld e IR
  3. Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
  4. Controle IoT Remoto de Braço Robótico Personalizado
  5. Medição Precisa de Frequência e Ciclo de Trabalho com Arduino UNO
  6. Medição de Distância em Tempo Real com Sonar Arduino e Visualização no Processing
  7. Controle Suave de Brilho de LED com Bolt IoT e Arduino UNO
  8. Braço Robótico Inteligente Controlado por Arduino: Tutorial DIY Fácil
  9. Controle sua TV com Alexa via Arduino IoT Cloud – Guia Passo a Passo
  10. Construa um Rádio FM Compacto com Arduino Nano e RDA5807M