Sebastian Sosa / Mbed 2 deprecated MbedProcessingCar

Dependencies:   mbed

Committer:
Sosx
Date:
Sat Feb 21 04:49:49 2015 +0000
Revision:
2:24f25fea5f95
Parent:
1:fc4305740d67
Documentation for processing control updated to describe the entirety of the code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sosx 1:fc4305740d67 1 //Processing code for a bluetooth controlled car that interfaces with processing in order to be controlled with an xbox360 controller
Sosx 1:fc4305740d67 2 //If further clarification is required contact @ sebastian.sosa@upaep.edu.mx
Sosx 1:fc4305740d67 3 //Library needs to be downloaded, also thanks to those guys, more info on the library on their page @ http://creativecomputing.cc/p5libs/procontroll/
Sosx 1:fc4305740d67 4 //Bluetooth is working being serial #1 if you have other serial devices conected modify as needed on line 35
Sosx 1:fc4305740d67 5
Sosx 1:fc4305740d67 6 //PROCESSING CODE, COPY AND PASTE ON PROCESSING
Sosx 1:fc4305740d67 7 //Preferably on 32 bit version, even if your computer is 64bit
Sosx 1:fc4305740d67 8
Sosx 2:24f25fea5f95 9 import procontroll.*; //Importa librerias
Sosx 1:fc4305740d67 10 import java.io.*;
Sosx 1:fc4305740d67 11 import processing.serial.*;
Sosx 1:fc4305740d67 12
Sosx 2:24f25fea5f95 13 Serial myPort; //inicia puerto serial
Sosx 1:fc4305740d67 14
Sosx 2:24f25fea5f95 15 ControllIO controll; //Requisitos de procontroll, los primeros inician el control, sliders son el joystick y button son botones (obviamente).
Sosx 1:fc4305740d67 16 ControllDevice device;
Sosx 1:fc4305740d67 17 ControllSlider sliderX;
Sosx 1:fc4305740d67 18 ControllSlider sliderY;
Sosx 1:fc4305740d67 19 ControllButton button;
Sosx 1:fc4305740d67 20 ControllButton button2;
Sosx 1:fc4305740d67 21
Sosx 1:fc4305740d67 22 void setup(){
Sosx 2:24f25fea5f95 23 size(400,400); //codigo standard de processing, se tiene que crear una ventana nueva
Sosx 1:fc4305740d67 24
Sosx 2:24f25fea5f95 25 controll = ControllIO.getInstance(this); //Aqui lee los controles conectados, mouses, teclados, controles, joysticks, lo que sea
Sosx 1:fc4305740d67 26
Sosx 2:24f25fea5f95 27 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
Sosx 2:24f25fea5f95 28 device.setTolerance(0.05f); //Otro requerimiento de procontroll, para que el joystick sea mas preciso (lee la libreria)
Sosx 1:fc4305740d67 29
Sosx 2:24f25fea5f95 30 sliderX = device.getSlider(1); // Toma valores de slider y botones
Sosx 2:24f25fea5f95 31 sliderY = device.getSlider(0); //Los sliders pueden ser de 0 a x numero o de -x a x (lee las librerias)
Sosx 2:24f25fea5f95 32 button = device.getButton(0); //Los botones son booleanos
Sosx 2:24f25fea5f95 33 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...)
Sosx 1:fc4305740d67 34
Sosx 2:24f25fea5f95 35 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
Sosx 2:24f25fea5f95 36 myPort = new Serial(this, portName, 9600); //Inicia serial (ya deberias saber esto, si no lee el serial de arduino)
Sosx 1:fc4305740d67 37
Sosx 1:fc4305740d67 38
Sosx 2:24f25fea5f95 39 fill(0); //Color del fondo del cuadro, realmente no importa por ahora, luego probablemente si.
Sosx 2:24f25fea5f95 40 rectMode(CENTER); //Otras cosas de la ventana, lee la documentacion de processing, esta chida.
Sosx 1:fc4305740d67 41 }
Sosx 1:fc4305740d67 42
Sosx 1:fc4305740d67 43 void draw(){
Sosx 2:24f25fea5f95 44 background(255); //Mas colores... Esta parte es el void loop() de arduino.
Sosx 2:24f25fea5f95 45 int vel = 0; // variables del programa, si te preguntas por que estan aqui y no arriba, seguro hay una razon.
Sosx 2:24f25fea5f95 46 float rightM = 0; //vel es la velocidad de los motores
Sosx 2:24f25fea5f95 47 float leftM = 0; //leftM y right M son los valores que se envian, por lo tanto son valores que se interpretaran como ASCII
Sosx 2:24f25fea5f95 48 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
Sosx 2:24f25fea5f95 49 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)
Sosx 1:fc4305740d67 50 while(true){
Sosx 2:24f25fea5f95 51 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
Sosx 2:24f25fea5f95 52 if(vel < 6){
Sosx 1:fc4305740d67 53 vel = vel +1;
Sosx 1:fc4305740d67 54 }
Sosx 1:fc4305740d67 55 }
Sosx 2:24f25fea5f95 56 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
Sosx 2:24f25fea5f95 57 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
Sosx 2:24f25fea5f95 58 vel = vel -1; //de caracteres que poseemos para mandar la informacion.
Sosx 1:fc4305740d67 59 }
Sosx 1:fc4305740d67 60 }
Sosx 2:24f25fea5f95 61 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
Sosx 2:24f25fea5f95 62 rightM = 0; //boton, este frene solo, hay mecanismos mas refinados que poner muchos ifs para cada caso, aunque sea pude poner un case,
Sosx 2:24f25fea5f95 63 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
Sosx 2:24f25fea5f95 64 } //que me dejaran satisfecho, invito al lector a corregir esta parte del codigo y diseñar un mejor algoritmo de frenado.
Sosx 2:24f25fea5f95 65
Sosx 1:fc4305740d67 66 if(button.pressed() == false && button2.pressed() == false && vel == 3){ // positivos
Sosx 1:fc4305740d67 67 vel = vel -3;
Sosx 1:fc4305740d67 68 }
Sosx 1:fc4305740d67 69 if(button.pressed() == false && button2.pressed() == false && vel == 6){
Sosx 1:fc4305740d67 70 vel = vel -3;
Sosx 1:fc4305740d67 71 }
Sosx 1:fc4305740d67 72 if(button.pressed() == false && button2.pressed() == false && vel == 2){
Sosx 1:fc4305740d67 73 vel = vel -2;
Sosx 1:fc4305740d67 74 }
Sosx 1:fc4305740d67 75 if(button.pressed() == false && button2.pressed() == false && vel == 4){
Sosx 1:fc4305740d67 76 vel = vel -2;
Sosx 1:fc4305740d67 77 }
Sosx 1:fc4305740d67 78 if(button.pressed() == false && button2.pressed() == false && vel == 1){
Sosx 1:fc4305740d67 79 vel = vel -1;
Sosx 1:fc4305740d67 80 }
Sosx 1:fc4305740d67 81 if(button.pressed() == false && button2.pressed() == false && vel == 5){
Sosx 1:fc4305740d67 82 vel = vel -3;
Sosx 1:fc4305740d67 83 }
Sosx 1:fc4305740d67 84 if(button.pressed() == false && button2.pressed() == false && vel== -1){ //negativos
Sosx 1:fc4305740d67 85 vel = vel +1;
Sosx 1:fc4305740d67 86 }
Sosx 1:fc4305740d67 87 if(button.pressed() == false && button2.pressed() == false && vel== -2){ //negativos
Sosx 1:fc4305740d67 88 vel = vel +2;
Sosx 1:fc4305740d67 89 }
Sosx 1:fc4305740d67 90 if(button.pressed() == false && button2.pressed() == false && vel== -3){ //negativos
Sosx 1:fc4305740d67 91 vel = vel +3;
Sosx 1:fc4305740d67 92 }
Sosx 1:fc4305740d67 93 if(button.pressed() == false && button2.pressed() == false && vel== -4){ //negativos
Sosx 1:fc4305740d67 94 vel = vel +2;
Sosx 2:24f25fea5f95 95 } //Este es el ultimo caso para que el coche frene solo.
Sosx 1:fc4305740d67 96
Sosx 2:24f25fea5f95 97 else{ //#Nota: estoy casi seguro que este else no solo hace nada sino que traba el codigo, revisandolo no tengo ni idea
Sosx 2:24f25fea5f95 98 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
Sosx 1:fc4305740d67 99 if(y>=0){
Sosx 2:24f25fea5f95 100 rightM = (right - y) * vel; //la funcion que toma el valor lateral del joystick tiene diferentes formas, en este caso hacia un lado es positiva
Sosx 2:24f25fea5f95 101 leftM = left * vel; //y hacia otro lado negativa, las hay que dan valores absolutos y diferentes rangos, invito al lector a revisarlas
Sosx 2:24f25fea5f95 102 } //lo que hace esta parte del codigo es ver hacia donde gira, restarselo a la velocidad del lado al que gira y
Sosx 2:24f25fea5f95 103 if(y<=0){ //multiplicarlo por el factor de velocidad, asi si se gira a la derecha, la seccion derecha del auto ira un poco
Sosx 2:24f25fea5f95 104 y = -y; //mas lento (y) que la parte izquierda, el factor de conversion y los demas valores se tomaron pensando en que
Sosx 2:24f25fea5f95 105 leftM = (left - y) * vel; //todos los numeros de velocidad deben poder ser valores ASCII
Sosx 1:fc4305740d67 106 rightM = right * vel;
Sosx 1:fc4305740d67 107 }
Sosx 1:fc4305740d67 108 }
Sosx 2:24f25fea5f95 109 if(rightM <0){ //Como se puede ver en esta parte del codigo, para diferenciar los valores de derecha o izquierda se modifico el
Sosx 2:24f25fea5f95 110 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
Sosx 2:24f25fea5f95 111 leftM = (leftM * (-1)) + 60; //(valores ASCII) la programacion del robot debe estar al tanto de este desplazamiento para decidir movimiento.
Sosx 1:fc4305740d67 112 }
Sosx 2:24f25fea5f95 113 myPort.write(int(rightM)); //Se imprimen los valores a enviar
Sosx 1:fc4305740d67 114 myPort.write(int(leftM));
Sosx 2:24f25fea5f95 115 myPort.clear(); //Se limpia el puerto serial, puede que esta linea se pueda remover
Sosx 2:24f25fea5f95 116 delay(200); //Se da un delay de 200ms, puede que esta linea tambien sea removible
Sosx 1:fc4305740d67 117 }
Sosx 1:fc4305740d67 118 }