Sebastian Sosa / Mbed 2 deprecated MbedProcessingCar

Dependencies:   mbed

Processing.cpp

Committer:
Sosx
Date:
2015-02-21
Revision:
2:24f25fea5f95
Parent:
1:fc4305740d67

File content as of revision 2:24f25fea5f95:

//Processing code for a bluetooth controlled car that interfaces with processing in order to be controlled with an xbox360 controller
//If further clarification is required contact @ sebastian.sosa@upaep.edu.mx
//Library needs to be downloaded, also thanks to those guys, more info on the library on their page @ http://creativecomputing.cc/p5libs/procontroll/
//Bluetooth is working being serial #1 if you have other serial devices conected modify as needed on line 35

//PROCESSING CODE, COPY AND PASTE ON PROCESSING
//Preferably on 32 bit version, even if your computer is 64bit

import procontroll.*;           //Importa librerias
import java.io.*;
import processing.serial.*;

Serial myPort;                  //inicia puerto serial

ControllIO controll;            //Requisitos de procontroll, los primeros inician el control, sliders son el joystick y button son botones (obviamente).
ControllDevice device;
ControllSlider sliderX;
ControllSlider sliderY;
ControllButton button;
ControllButton button2;

void setup(){
  size(400,400);                                //codigo standard de processing, se tiene que crear una ventana nueva
  
  controll = ControllIO.getInstance(this);      //Aqui lee los controles conectados, mouses, teclados, controles, joysticks, lo que sea

  device = controll.getDevice("Controller (XBOX 360 For Windows)");     //Aqui escribes el nombre del control que vas a usar, lo lees de una lista en processing
  device.setTolerance(0.05f);                   //Otro requerimiento de procontroll, para que el joystick sea mas preciso (lee la libreria)
  
  sliderX = device.getSlider(1);                // Toma valores de slider y botones 
  sliderY = device.getSlider(0);                //Los sliders pueden ser de 0 a x numero o de -x a x (lee las librerias)
  button = device.getButton(0);                 //Los botones son booleanos
  button2 = device.getButton(1);                //Los 1 y 0 en los parentesis se refieren a que boton es cual, no es booleano, hay mas argumentos (0,1,2,3...)
  
  String portName = Serial.list()[1];           //Lee el puerto serial 1, si tienes conectados mas aparatos seriales pasas argumento 1,2,3 etc, si solo hay 1 es 0 o 1
  myPort = new Serial(this, portName, 9600);    //Inicia serial (ya deberias saber esto, si no lee el serial de arduino)
 
  
  fill(0);                                      //Color del fondo del cuadro, realmente no importa por ahora, luego probablemente si.
  rectMode(CENTER);                             //Otras cosas de la ventana, lee la documentacion de processing, esta chida.
}

void draw(){
  background(255);              //Mas colores... Esta parte es el void loop() de arduino.
  int vel = 0;                  // variables del programa, si te preguntas por que estan aqui y no arriba, seguro hay una razon. 
  float rightM = 0;             //vel es la velocidad de los motores 
  float leftM = 0;              //leftM y right M son los valores que se envian, por lo tanto son valores que se interpretaran como ASCII
  float right = 6;              //Por calculos que no quiero explicar y en pro de usar numeros mas normales y manejables estas variables son con las que 
  float left = 6;               //se controla  la direccion y velocidad de cada rueda (left y right) (no estoy seguro de por que empiezan en 6, muevanle)
    while(true){
        if(button.pressed()){   // Lee la condicion de A para ver si esta presionado, si la velocidad es menor a un valor semi arbitrario 6, este acelera
      if(vel < 6){              
        vel = vel +1;
      }    
    }
    if(button2.pressed()){      // Lo mismo pero al contrario para el boton B para que vaya en reversa, la velocidad es 4 porque se me antojo que de
      if(vel > -4){             //reversa no deberia de poder ir tan rapido, no tiene mucho que ver con las capacidades del motor o el numero limitado
        vel = vel -1;           //de caracteres que poseemos para mandar la informacion.
      }
    }
    if(vel == 0){               //Esta parte del codigo y hasta donde marque se asegura de que si el coche esta en movimiento y no se aprieta ningun
      rightM = 0;               //boton, este frene solo, hay mecanismos mas refinados que poner muchos ifs para cada caso, aunque sea pude poner un case,
      leftM = 0;                //pero el momento de usar el codigo estaba cerca y era la forma mas facil ya que el otro codigo no daba resultados 
    }                           //que me dejaran satisfecho, invito al lector a corregir esta parte del codigo y diseñar un mejor algoritmo de frenado.
    
    if(button.pressed() == false && button2.pressed() == false && vel == 3){  // positivos
      vel = vel -3;
    }
    if(button.pressed() == false && button2.pressed() == false && vel == 6){
      vel = vel -3;
    }
    if(button.pressed() == false && button2.pressed() == false && vel == 2){
      vel = vel -2;
    }
    if(button.pressed() == false && button2.pressed() == false && vel == 4){
      vel = vel -2;
    }
    if(button.pressed() == false && button2.pressed() == false && vel == 1){
      vel = vel -1;
    }
    if(button.pressed() == false && button2.pressed() == false && vel == 5){
      vel = vel -3;
    }
    if(button.pressed() == false && button2.pressed() == false && vel== -1){  //negativos
      vel = vel +1;
    }
    if(button.pressed() == false && button2.pressed() == false && vel== -2){  //negativos
      vel = vel +2;
    }
    if(button.pressed() == false && button2.pressed() == false && vel== -3){  //negativos
      vel = vel +3;
    }
    if(button.pressed() == false && button2.pressed() == false && vel== -4){  //negativos
      vel = vel +2;
    }                           //Este es el ultimo caso para que el coche frene solo.
    
    else{                                 //#Nota: estoy casi seguro que este else no solo hace nada sino que traba el codigo, revisandolo no tengo ni idea
      float y = sliderX.getValue()*5;     //de por que lo puse y voy a probar borrandolo y hacer el commit sin el lo antes posible, lo importante esta dentro
      if(y>=0){
        rightM = (right - y) * vel;       //la funcion que toma el valor lateral del joystick tiene diferentes formas, en este caso hacia un lado es positiva
        leftM = left * vel;               //y hacia otro lado negativa, las hay que dan valores absolutos y diferentes rangos, invito al lector a revisarlas
      }                                   //lo que hace esta parte del codigo es ver hacia donde gira, restarselo a la velocidad del lado al que gira y 
      if(y<=0){                           //multiplicarlo por el factor de velocidad, asi si se gira a la derecha, la seccion derecha del auto ira un poco
        y = -y;                           //mas lento (y) que la parte izquierda, el factor de conversion y los demas valores se tomaron pensando en que
        leftM = (left - y) * vel;         //todos los numeros de velocidad deben poder ser valores ASCII
        rightM = right * vel;
      }
    }
    if(rightM <0){                        //Como se puede ver en esta parte del codigo, para diferenciar los valores de derecha o izquierda se modifico el
      rightM = (rightM * (-1)) + 60;      //punto medio de valores 0, antes -60 a 60 y el nuevo punto medio es 60, para tener un rango de valores 60 - 120
      leftM = (leftM * (-1)) + 60;        //(valores ASCII) la programacion del robot debe estar al tanto de este desplazamiento para decidir movimiento.
    }    
    myPort.write(int(rightM));            //Se imprimen los valores a enviar
    myPort.write(int(leftM));
    myPort.clear();                       //Se limpia el puerto serial, puede que esta linea se pueda remover
    delay(200);                           //Se da un delay de 200ms, puede que esta linea tambien sea removible
  }
}