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@2:24f25fea5f95, 2015-02-21 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |