domingo, 10 de maio de 2015

Robô controlado por Dualshock 3 utilizando arduino

Hoje eu venho apresentar para vocês o meu primeiro protótipo de um "carrinho" controlado sem fio através de um dualshock 3, o controle de PS3 no caso. Para isso ser possível, é necessário utilizar um dongle bluetooth e um usb host shield para o arduino poder conseguir fazer a comunicação com o controle. Já na parte de locomoção utilizei o motor e as reduçoes do servo MG 995 (que possui engrenagens de metal), onde são controlados por drivers externos, nesse caso duas ponte-H que usam o L298N. Para conseguir alimentar tudo isso estou utilizando tipo de bateria selada 12V 7Ah (utilizadas em central de alarmes e no-breaks), ela aguenta bastante tempo até mas não cheguei a medir a [acronym]corrente[/acronym] que "puxa" com os 4 motores operando com força máxima para calcular a duração. A bateria também é um pouco pesada, o ideal seria usar bateria Li-Po que é mais compacta e não compromete tanto o tempo que o robô consegue operar, mas era o que tinha disponível no momento. Também há iluminação na frente que é composta por 15 led's de alto-brilho que apresentaram um bom resultado.

Agora a parte mais trabalhosa, a programação. Não existe nenhum mistério nesse código, pois para esse shield existe uma biblioteca que tem vários exemplos, inclusive para controle de PS3. Só é necessário adaptar a programação para o uso. Segue ai o programa que estou usando no arduino.


#include <PS3BT.h>                                                   

USB Usb;
BTD Btd(&Usb);
PS3BT PS3(&Btd); 

int motorE1 = 2;
int motorD1 = 3;
int motorE2 = 4;
int motorD2 = 5;

int pin11 = 30;
int pin12 = 31;
int pin13 = 32;
int pin14 = 33;
int pin21 = 34;
int pin22 = 35;
int pin23 = 36;
int pin24 = 37;

void setup() {
  Serial.begin(115200);                                              
  if (Usb.Init() == -1)
  {                                            
  Serial.print(F("\r\nOSC did not start"));
  while(1);
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started")); 

  pinMode(motorE1, OUTPUT);
  pinMode(motorD1, OUTPUT);
  pinMode(motorE2, OUTPUT);
  pinMode(motorD2, OUTPUT);
  pinMode(pin11, OUTPUT);
  pinMode(pin12, OUTPUT);
  pinMode(pin13, OUTPUT);
  pinMode(pin14, OUTPUT);
  pinMode(pin21, OUTPUT);
  pinMode(pin22, OUTPUT);
  pinMode(pin23, OUTPUT);
  pinMode(pin24, OUTPUT);  
                                                      
   
}
void loop() 
{
  Usb.Task();  
  
  if(PS3.PS3Connected || PS3.PS3NavigationConnected){
    if (PS3.getAnalogHat(LeftHatY) > 135){
      digitalWrite(pin11, HIGH);
      digitalWrite(pin12, LOW);
      analogWrite(motorE1, map(PS3.getAnalogHat(LeftHatY), 130, 255, 0, 255));
      }
        
    if (PS3.getAnalogHat(LeftHatY) < 120){
      digitalWrite(pin11, LOW);
      digitalWrite(pin12, HIGH); 
      analogWrite(motorE1, map(PS3.getAnalogHat(LeftHatY), 0, 125, 255, 0));
    }     
     
    if (PS3.getAnalogHat(LeftHatY) > 135){
      digitalWrite(pin21, HIGH);
      digitalWrite(pin22, LOW);
      analogWrite(motorE2, map(PS3.getAnalogHat(LeftHatY), 130, 255, 0, 255));
    }
          
    if (PS3.getAnalogHat(LeftHatY) < 120){
      digitalWrite(pin21, LOW);
      digitalWrite(pin22, HIGH); 
      analogWrite(motorE2, map(PS3.getAnalogHat(LeftHatY), 0, 125, 255, 0));
    }     
      
    if (PS3.getAnalogHat(RightHatY) > 135){
      digitalWrite(pin13, HIGH);
      digitalWrite(pin14, LOW);
      analogWrite(motorD1, map(PS3.getAnalogHat(RightHatY), 130, 255, 0, 255));
    }
       
    if (PS3.getAnalogHat(RightHatY) < 120){
      digitalWrite(pin13, LOW);
      digitalWrite(pin14, HIGH); 
      analogWrite(motorD1, map(PS3.getAnalogHat(RightHatY), 0, 125, 255, 0));
    } 
  
    if (PS3.getAnalogHat(RightHatY) > 135){
      digitalWrite(pin23, HIGH);
      digitalWrite(pin24, LOW);
      analogWrite(motorD2, map(PS3.getAnalogHat(RightHatY), 130, 255, 0, 255));
    }
          
    if (PS3.getAnalogHat(RightHatY) < 120) {
      digitalWrite(pin23, LOW);
      digitalWrite(pin24, HIGH); 
      analogWrite(motorD2, map(PS3.getAnalogHat(RightHatY), 0, 125, 255, 0));
    }
  
    if (PS3.getButtonClick(SQUARE)){
      digitalWrite(53, HIGH);
    }

    if (PS3.getButtonClick(CROSS)){
      digitalWrite(53, LOW);
    }

    if (PS3.getButtonClick(CIRCLE)){
      analogWrite(motorE1, 0);
      analogWrite(motorE2, 0);
      analogWrite(motorD1, 0);
      analogWrite(motorD2, 0);
    }
     
    if(PS3.getButtonClick(PS)){
      PS3.disconnect();      
      analogWrite(motorE1, 0);
      analogWrite(motorE2, 0);
      analogWrite(motorD1, 0);
      analogWrite(motorD2, 0);
      digitalWrite(53, LOW);
  }
 }
}


Explicando de forma bem simples, o arduino captura a variável do eixo analógico do controle, converte para PWM pela função 'map' e joga o sinal para a ponte H junto com o os sinais 'high' e 'low' para controlar a direção do motor. Ali na parte que faz uso do pino 53, é a iluminação que nao declarei uma variável para ele.


Seguem agora algumas fotos e um vídeo de testes que fiz:



Frisando novamente que apenas é o protótipo, ainda quero implementar várias coisas nele, como um sensor ultrassônico que tenho aqui, além de algum tipo de braço/garra na frente para pegar objetos.

2 comentários:

  1. Qual dongle bluetooth VC está utilizando nesse projeto, estou tendo dificuldade em encontrar um compatível, se muder me incar algum ficarei grato, obrigado

    ResponderExcluir
  2. Olá Bruno, comprei esse dongle bt em uma loja de informática e paguei 15 reais, sequer tem uma marca. Se te ajuda o formato dele é de um semicirculo e até onde sei é bluetooth 2.0.

    ResponderExcluir