Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
}
}