El Coche Bluetooth v1.0 en marcha. Parte android.


Coche Bluetooth 2 from Leo Lamolda on Vimeo.


Hola. Como prometí aquí os dejo un video un poco cutre del coche en funcionamiento. Podéis ver el interfaz del mando del teléfono. Actualmente, en esta primera versión, es digital. Quiero decir que no está implementado el control de velocidad, simplemente va para adelante, atrás, izquierda y derecha. Como podéis ver en la pantalla hay un icono para las luces. En la siguiente versión, la 2.0, quiero ponerle luces de freno, de marcha atrás y luces de cruce, que son las que se podrán encender y apagar a gusto del consumidor.

El programa es un Sketch de Processing. La parte gráfica es bastante simple con este sistema, además comparte interfaz gráfico con arduino, lo que hace que no tengas que estar cambiando el chip cada vez que cambias de sketch. Luego hay dos apartados más, el control de la pantalla multitouch, y el bluetooth. Ambos se tienen que programar usando las api del SDK de android. Esto es lo que más trabajo me ha dado como podréis comprobar cuando veais el programita.

El control de la entrada por pantalla está terminado al 100% y funciona al 100%. Puedo tocar cuantos puntos me deje el hardware del teléfono o tablet, y procesarlos según me interese. En este caso puedo tocar los cuatro botones a la vez junto con el de las luces y los detecta todos juntos e individualmente. Una vez que controlas el mecanismo va muy bien. En realidad estás llamando a las mismas funciones que cualquier aplicación de android utiliza para controlar la entrada por pantalla táctil.

El control del Bluetooth es ..... tela. Esto no lo tengo completo. Por ahora detecta si el bluetooth está apagado, si es así pide permiso para conectarlo, y seguidamente se conecta al bluetooth del coche directamente. Me queda programar la parte de configuració detectando los dispositivos que están enlazados con el teléfono y dar la opción de que realice un broadcast de bluetooth para buscar nuevos dispositivos. Quiero terminar esto porque cuando lo tenga listo servirá para cualquier proyecto futuro. He leido mucho sobre el tema y aún me queda mucho por aprender. Desde un ordenador es muy simple, ya que solo tienes que enlazar con el dispositivo por el puerto serie bluetooth y enviarle datos al com correspondiente, pero desde android es otro cantar. Os animo a intentarlo y así repartimos el trabajo.

El control de entrada táctil y el del bluetooth lo realizan básicamente las dos últimas funciones que podéis ver en el código del sketch al final de este post (surfaceTouchEvent y onStart)

En futuras versiones:

     - Sustitución de los botones de avance y marcha atrás por un control deslizante para control de velocidad.
     - Puesta en marcha del sistema de luces. (En realidad esto es dedicarle 10 minutos al coche y 5 al soft).
     - Completar el módulo Bluetooth.
     - Opción de control de dirección con el acelerómetro del teléfono. Esto que puede parecer muy complicado, en el fondo es bastante más simple que manejar el Bluetooth.
     - Valoración de las ideas que me podáis aportar.

A continuación el sketch de Processing:

/* COCHE BLUETOOTH V1.0
   POR LEO LAMOLDA
*/
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import java.util.ArrayList;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
private static final int REQUEST_ENABLE_BT = 3;
BluetoothAdapter adaptador;
BluetoothDevice dispositivo;
BluetoothSocket socket;
InputStream ins;
OutputStream ons;
PImage imgfondo;
byte[][] lcd = new byte [20] [12];
byte envio;
byte lectura;
int ancho;
int alto;
int diametro;
int factorx;
int factory;
void setup()
{
  orientation(LANDSCAPE);
  size(800,480);
  imgfondo = loadImage("fibracarbono.jpg");
  for (int i=0; i<20; i=i+1){for (int z=0; z<12; z++){lcd [i][z]=0;}}
  for (int i=3; i<7; i=i+1){for (int z=1; z<5; z++){lcd [i][z]=16;}}
  for (int i=3; i<7; i=i+1){for (int z=7; z<11; z++){lcd [i][z]=8;}}
  for (int i=10; i<14; i=i+1){for (int z=7; z<11; z++){lcd [i][z]=4;}}
  for (int i=15; i<19; i=i+1){for (int z=7; z<11; z++){lcd [i][z]=2;}}
  for (int i=13; i<17; i=i+1){for (int z=1; z<5; z++){lcd [i][z]=1;}}
  ancho=screenWidth;
  alto=screenHeight;
  factorx=ancho/20;
  factory=alto/12;
  diametro=ancho/5;
  envio=0;
  lectura=0;
  background(imgfondo);
  pinta();
}
void draw()
{
      if (envio!=lectura)
      {
        envio=lectura;
        pinta();
        envia();
      }
}
void pinta()
{
  if ((envio & 16)==0){pulsadorrojo(ancho/4,alto/4,diametro);}
  else{pulsadorverde(ancho/4,alto/4,diametro);}
  if ((envio & 8)==0){pulsadorrojo(ancho/4,alto*3/4,diametro);}
  else{pulsadorverde(ancho/4,alto*3/4,diametro);}
  if ((envio & 4)==0){pulsadorrojo(ancho*3/5,alto*3/4,diametro);}
  else{pulsadorverde(ancho*3/5,alto*3/4,diametro);}
  if ((envio & 2)==0){pulsadorrojo(ancho*17/20,alto*3/4,diametro);}
  else{pulsadorverde(ancho*17/20,alto*3/4,diametro);}
  if ((envio & 1)==0){lucesoff();}
  else{luceson();}
}
void envia(){
 try
    {
        ons.write(envio);
    }
    catch(Exception ex)
    {
    }
}

void luceson()
{
  stroke(0,255,0);
  strokeWeight(10);
  noFill();
  line(ancho*13/20,alto*3/12,ancho*3/4,alto/12);
  line(ancho*13/20,alto*3/12,ancho*3/4,alto*5/12);
  line(ancho*4/5,alto*3/24,ancho*17/20,alto*5/24);
  line(ancho*4/5,alto*5/24,ancho*17/20,alto*7/24);
  line(ancho*4/5,alto*7/24,ancho*17/20,alto*9/24);
  ellipse(ancho*3/4,alto/4,diametro/4,diametro);
}
void lucesoff()
{
  stroke(172);
  strokeWeight(10);
  noFill();
  line(ancho*13/20,alto*3/12,ancho*3/4,alto/12);
  line(ancho*13/20,alto*3/12,ancho*3/4,alto*5/12);
  line(ancho*4/5,alto*3/24,ancho*17/20,alto*5/24);
  line(ancho*4/5,alto*5/24,ancho*17/20,alto*7/24);
  line(ancho*4/5,alto*7/24,ancho*17/20,alto*9/24);
  ellipse(ancho*3/4,alto/4,diametro/4,diametro);
}
void pulsadorrojo(float x, float y, float d)
{
  stroke(172);
  strokeWeight(20);
  fill(255,0,0);
  ellipse(x, y, d, d);
}
void pulsadorverde(float x, float y, float d)
{
  stroke(172);
  strokeWeight(20);
  fill(0,255,0);
  ellipse(x, y, d, d);
}

public boolean surfaceTouchEvent(MotionEvent evento)

  int numPointers = int(evento.getPointerCount());
  lectura=0;
  for(int i=0; i < numPointers; i=i+1)
  {
    if (evento.getActionMasked()!=1)
    {
     int x= int (evento.getX(i)/factorx);
     int y=int (evento.getY(i)/factory);
     int z=int (lcd [x][y]);
     lectura=byte(int(lectura) | z);
    }
 
  }
 return super.surfaceTouchEvent(evento); 
}

void onStart()
{
  super.onStart();
  adaptador = BluetoothAdapter.getDefaultAdapter();
  if (adaptador != null)
  {
    if (!adaptador.isEnabled())
    {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
  }
   dispositivo = (BluetoothDevice) adaptador.getRemoteDevice("00:11:11:04:08:27");    
   try  
  {    
      socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
      Method m = dispositivo.getClass().getMethod("createRfcommSocket", new Class[] { int.class });    
      socket = (BluetoothSocket) m.invoke(dispositivo, 1);            
      socket.connect();    
      ins = socket.getInputStream();    
      ons = socket.getOutputStream();    
  }  
  catch(Exception ex)  
  {  
  }
}

Comentarios

Publicar un comentario

Entradas populares de este blog

Mirrorlink. Smartphone Samsung Galaxy A5 y Peugeot Partner Tepee. Controla tu móvil desde la pantalla de tu coche.

UN CLASICO: SEMAFORO CON ARDUINO Y EJEMPLO DE LIBRERIA.

TeLEOsketch. Un experimento con arduino, bluetooth, appinventor y android.