0

Como ligar um comando PS3/PC ao Arduino

Olá a todos, hoje vamos ver como podemos ligar um comando da PS3 ou PC com bluetooth ao nosso Arduino. E a partir desta ligação comandar algum periférico. Neste projeto utilizo um comando da PS3 para controlar um servo motor.

 

É o inicio de um projecto para controlar um carro telecomandado ou um braço robot, etc.
A ligação será efectuada através da utilização de um USB shield que será acoplado ao Arduino UNO.

 

Vamos usar também um bluetooth dongle no USB shield para que possamos fazer a comunicação entre o comando e o arduino.

Antes de mais necessitamos importar a biblioteca que permitirá a comunicação entre os elementos:
1) Podes fazer o download da biblioteca USB_Host_Shield Aqui.
2) Depois importamos para o nosso programa Arduino IDE, no menu Rascunho > Include Library > Add .ZIP Library > seleccionar o ficheiro .zip
3) Para enviar para o Arduino, vamos a Ficheiro > Exemplos > USB Host Shield Library2.0 > Bluetooth > PS3BT
4) A IDE do Arduino vai abrir o programa e é só transferir para o Arduino.

 

O próximo passo é ligar o comando da PS3 ao dongle bluetooth (emparelhamento)

Com o arduino com o programa PS3BT e ligado ao pc, ligamos o serial monitor do IDE, para verificarmos o debug do programa;
Se tudo correu bem á primeira, deve aparecer um texto igual a este:

 

PS3 Bluetooth Library Started
Bluetooth Dongle Initialized
HCI Reset complete
Write class of device
Local Bluetooth Address: 00:15:83:0C:BF:EB —–> depende do dongle, por isso o teu vai ser diferente
Wait For Incoming Connection Request

 

Atenção:
Se aparecer apenas PS3 Bluetooth Library Started, deves activar o debugging.

 

Como?
Vais à pasta onde instalaste a biblioteca e procura o ficheiro settings.h
A seguir deve editá-lo (notepad ou bloco de notas) e onde está #define ENABLE_UHS_… deves substituir o 0 por 1.
Guardas o ficheiro e voltas a rodar o programa.
Se tudo correu bem irá aparecer o texto anterior.

Agora pressionas o botão PS do comando da ps3 e deverá aparecer:

Gamepad is connecting
Incoming Connection Request
Remote Name: PLAYSTATION(R)3 Controller
Connected to Device: 00:1B:FB:26:32:9B
HID Control Incoming Connection Request
HID Control Successfully Configured
HID Interrupt Incoming Connection Request
HID Interrupt Successfully Configured
Wait For Incoming Connection Request
Dualshock 3 Controller Enabled

 

E pronto, está operacional!!!!

Se não identificou o comando à primeira, retiramos a PEN Dongle, colocamos o cabo usb do comando ps3 no usb shield, esperamos que seja reconhecido e voltamos a colocar o dongle.
Esquema de ligações:


Nota:
Se estiveres a alimentar o Arduino com uma bateria de 9v (sem ligação ao pc por USB) e o comando da ps3 não for reconhecido, troca a bateria…
Não poderás utilizar os pins 9, 10, 11, 12 e 13, pois estão a ser utilizados pelo usb shield.

 

Material utilizado:

  • Arduino Uno R3
  • USB shield
  • Comando PS3 e respectivo cabo USB
  • Servo motor
  • USB_Host_Shield_2.0-master
  • Pen Bluetooth Dongle
  • Bateria 9V
  • Cabos de ligação e USB

 

Código do programa:

#include <SPP.h>
#include <usbhub.h>

#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

Servo omeuservo;

USB Usb;
BTD Btd(&Usb); 

/* You can create the instance of the class in two ways */
PS3BT PS3(&Btd); // This will just create the instance
//PS3BT PS3(&Btd, 0x00, 0x15, 0x83, 0x0C, 0xBF, 0xEB); 

bool printTemperature;
bool printAngle;

void setup() {
  omeuservo.attach(6);
  omeuservo.write(90);
  pinMode(ledverde, OUTPUT);

  Serial.begin(115200);
#if !defined(__MIPSEL__)
  while (!Serial); 

#endif
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started"));
}


void loop() {
  Usb.Task();

  if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
    if (PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX)  137 || PS3.getAnalogHat(LeftHatY)  137 || PS3.getAnalogHat(RightHatX)  137 || PS3.getAnalogHat(RightHatY) < 117) {
      Serial.print(F("\r\nLeftHatX: "));
      Serial.print(PS3.getAnalogHat(LeftHatX));
      omeuservo.write(map(PS3.getAnalogHat(LeftHatX), 0, 255, 0, 179));
      delay(10);
      Serial.print(F("\tLeftHatY: "));
      Serial.print(PS3.getAnalogHat(LeftHatY));
      if (PS3.PS3Connected) { // The Navigation controller only have one joystick
        Serial.print(F("\tRightHatX: "));
        Serial.print(PS3.getAnalogHat(RightHatX));
        Serial.print(F("\tRightHatY: "));
        Serial.print(PS3.getAnalogHat(RightHatY));
      }
    }

    // Analog button values can be read from almost all buttons
    if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
      Serial.print(F("\r\nL2: "));
      Serial.print(PS3.getAnalogButton(L2));
      if (PS3.PS3Connected) {
        Serial.print(F("\tR2: "));
        Serial.print(PS3.getAnalogButton(R2));
      }
    }
    if (PS3.getButtonClick(PS)) {
      Serial.print(F("\r\nPS"));
      PS3.disconnect();
    }
    else {
      if (PS3.getButtonClick(TRIANGLE))
        Serial.print(F("\r\nTriangle"));
      if (PS3.getButtonClick(CIRCLE))
        Serial.print(F("\r\nCircle"));
      if (PS3.getButtonClick(CROSS))
        Serial.print(F("\r\nCross"));
      if (PS3.getButtonClick(SQUARE))
        Serial.print(F("\r\nSquare"));

      if (PS3.getButtonClick(UP)) {
        Serial.print(F("\r\nUp"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED4);
        }
      }
      if (PS3.getButtonClick(RIGHT)) {
        Serial.print(F("\r\nRight"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED1);
        }
      }
      if (PS3.getButtonClick(DOWN)) {
        Serial.print(F("\r\nDown"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED2);
        }
      }
      if (PS3.getButtonClick(LEFT)) {
        Serial.print(F("\r\nLeft"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED3);
        }
      }

      if (PS3.getButtonClick(L1))
        Serial.print(F("\r\nL1"));
      if (PS3.getButtonClick(L3))
        Serial.print(F("\r\nL3"));
      if (PS3.getButtonClick(R1))
        Serial.print(F("\r\nR1"));
      if (PS3.getButtonClick(R3))
        Serial.print(F("\r\nR3"));

      if (PS3.getButtonClick(SELECT)) {
        Serial.print(F("\r\nSelect - "));
        PS3.printStatusString();
      }
      if (PS3.getButtonClick(START)) {
        Serial.print(F("\r\nStart"));
        printAngle = !printAngle;
      }
    }
#if 0 // Set this to 1 in order to see the angle of the controller
    if (printAngle) {
      Serial.print(F("\r\nPitch: "));
      Serial.print(PS3.getAngle(Pitch));
      Serial.print(F("\tRoll: "));
      Serial.print(PS3.getAngle(Roll));
    }
#endif
  }
#if 0 // Set this to 1 in order to enable support for the Playstation Move controller
  else if (PS3.PS3MoveConnected) {
    if (PS3.getAnalogButton(T)) {
      Serial.print(F("\r\nT: "));
      Serial.print(PS3.getAnalogButton(T));
    }
    if (PS3.getButtonClick(PS)) {
      Serial.print(F("\r\nPS"));
      PS3.disconnect();
    }
    else {
      if (PS3.getButtonClick(SELECT)) {
        Serial.print(F("\r\nSelect"));
        printTemperature = !printTemperature;
      }
      if (PS3.getButtonClick(START)) {
        Serial.print(F("\r\nStart"));
        printAngle = !printAngle;
      }
      if (PS3.getButtonClick(TRIANGLE)) {
        Serial.print(F("\r\nTriangle"));
        PS3.moveSetBulb(Red);
      }
      if (PS3.getButtonClick(CIRCLE)) {
        Serial.print(F("\r\nCircle"));
        PS3.moveSetBulb(Green);
      }
      if (PS3.getButtonClick(SQUARE)) {
        Serial.print(F("\r\nSquare"));
        PS3.moveSetBulb(Blue);
      }
      if (PS3.getButtonClick(CROSS)) {
        Serial.print(F("\r\nCross"));
        PS3.moveSetBulb(Yellow);
      }
      if (PS3.getButtonClick(MOVE)) {
        PS3.moveSetBulb(Off);
        Serial.print(F("\r\nMove"));
        Serial.print(F(" - "));
        PS3.printStatusString();
      }
    }
    if (printAngle) {
      Serial.print(F("\r\nPitch: "));
      Serial.print(PS3.getAngle(Pitch));
      Serial.print(F("\tRoll: "));
      Serial.print(PS3.getAngle(Roll));
    }
    else if (printTemperature) {
      Serial.print(F("\r\nTemperature: "));
      Serial.print(PS3.getTemperature());
    }
  }
#endif
}

Resultado final:

Espero que vos seja util este projeto, abre portas para boas ideias relacionadas com controlo de Robots etc!

por Rafael Nogueira 

—————
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.

Gostaram deste artigo ? Deixem o vosso comentário no formulário a baixo.

Não se esqueçam de fazer like na nossa Página no Facebook.

Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no facebook Arduino Portugal – Qual o teu projeto?

Comments

Comentários

ArduinoPortugal.pt

Deixar uma resposta