viernes, 11 de noviembre de 2011

Envío de SMS con J2Me

1 - Iniciar el Netbeans, este proyecto fue desarrollado con la version 7.0.1 en ingles.
2 - Crear el proyecto en netbeans, Menu File -> New Proyect
En el cuadro de diálogo seleccionar Categoría: JavaME, Proyecto: Mobile Application; click en Next.



3-Dar un nombre al proyecto, yo seleccioné BlasSMS


4 - En la siguiente pantalla es necesario seleccionar la plataforma para la que se compilará el proyecto, para esta ocasion CLDC-1.0 y MIDP-2.0, se seleccionan las configuraciones mas básicas posibles para mantener la compatibilidad con la mayor cantidad de dispositivos posibles.
Luego hacemos click en Finish


5 - Seleccionamos el archivo HelloMIDlet.java, apretamos F2 y cambiamos su nombre a BlasSMS.java y le damos enter, en la pantalla que aparece seleccionamos la casilla "Apply Rename on Comments" (Aplicar renombrar a los comentarios) y hacemos click en Refactor.

6 - Abrir el fuente BlasSMS.java y hacer click en boton Screen y seleccionar "form" en el combo de la derecha.

7 - En la paleta de objetos seleccionamos TextField y agregamos 2 campos al form que estamos editando, seleccionamos el primero de los textfields, hacemos click derecho y seleccionamos Rename, cambiamos el nombre de la instancia a "txtCodigo".



Hacemos lo mismo con el segundo textfield y lo nombramos "txtMensaje".

Al hacer click derecho sobre los objetos podemos acceder también a las propiedades, y cambiar los labels a "Codigo" y "Mensaje"


Ahora seleccionamos en la paleta un "Exit Command" y lo agregamos a la pantalla, luego un "Ok Command", también lo agregamos, cambiamos las propiedades para que se llamen "cmdSalir" y "cmdEnviar" de manera análoga a las propiedades de los campos de texto.



El proyecto debería verse así:


8 - En la solapa "Flow", se hace un click en el boton cmdSalir y se arrastra hacia el cuadro titulado "Mobile Device"
Con lo que se vería así:


9 - Al código!
Seleccionamos la solapa source, debajo de la declaracion de la clase agregamos la declaracion de dos variables, una para el mensaje y otra para mantener el numero telefónico al cual enviar
public class BlasSMS extends MIDlet implements CommandListener {
private String mensaje = "";
private String telNro = "+595985265999";
en el método commandAcction agregamos una llamada al metodo enviarSMS() que efectuará el envio del mensaje

public void commandAction (Command command, Displayable displayable) {
if (displayable == form) {
if (command == cmdEnviar) {
// write pre-action user code here
this.enviarSMS(this.telNro); //----> ATENCION ESTE ES EL CODIGO AGREGADO!!!
// write post-action user code here
} else if (command == cmdSalir) {
Al final del archivo se escriben métodos para enviar y validar el mensaje, uno para dar un formato "util" al texto enviado y otro para mostrar una ventana de alerta que nos ayudará a mostrar diferentes mensajes en pantalla.
Validación del mensaje:
public boolean validarMensaje(){

if (this.txtCodigo.getString().length()<1){
this.mensaje = "Falta Codigo: Verifique";
return false;
}
if (this.txtMensaje.getString().length()<1){

this.mensaje = "Falta Mensaje: Verifique";
return false;
}

return true;

}
Método para "comprimir" el mensaje con los datos introducidos antes de enviarlo:
public String compactarMensaje(){

String resultado = "" ;
resultado = "'" + this.txtCodigo.getString().trim().toUpperCase() + "',";
resultado += "'" + this.txtMensaje.getString().trim().toUpperCase() + "',";
return resultado;
}

Método para envío del mensaje:
public boolean enviarSMS(String telNro){
try {
if (!validarMensaje()){
mostrarAlerta(this.mensaje);
return false;
}
String recipientAddress = "sms://" + telNro;
MessageConnection connection = (MessageConnection) Connector.open(recipientAddress);
TextMessage tmsg = (TextMessage) connection.newMessage(MessageConnection.TEXT_MESSAGE);
tmsg.setPayloadText(this.compactarMensaje());
tmsg.setAddress(recipientAddress);
connection.send(tmsg);
connection.close();
} catch (IOException ex) {
this.mostrarAlerta("Error:" + ex.getMessage());
return false;
}
this.mostrarAlerta("Envio OK");
return true;
}
Método para mostrar alertas:
public void mostrarAlerta(String msg){
Alert frmAlert = new Alert(msg);
frmAlert.setTimeout (Alert.FOREVER);
switchDisplayable (frmAlert, getForm());
}
Bibliografía:

Proyecto tagua http://sourceforge.net/projects/tagua/files/ Octubre 10, 2011
Manual de programación J2ME http://mygnet.net/manuales/j2me/manual_programacion_j2me.510 Octubre 10, 2011
Arranque rápido para programar J2ME http://netbeans.org/kb/docs/javame/quickstart.html Octubre 10, 2011

domingo, 6 de noviembre de 2011

Robot de Sumo Boogerbot

Este fue el primer robot que he diseñado, lo hice para la competencia de sumo que se llevó a cabo en el marco de la ETyC de la facultad Politécnica de la UNA.
Para la tracción utiliza orugas (obtenidas de un tractor de juguete) con un juego de rodamientos que formaba parte de las orugas.
El elemento activo de la tracción está compuesto por 2 servos conectados a los ejes de un par de rodamientos con orificios que se emparejan con dientes en la superficie interna de las gomas que forman las orugas.
El par de ruedas frontales es móvil, de manera que la tensión de las orugas pueda ser regulada.
El chasis en sí está formado por una tapa de fuente de pc reciclada a la que removí los laterales con una tijera para cortar chapas.
A este chasis le agregué tres soportes transversales de madera (por la facilidad de manipularla), el espacio mayor al frente estaba destinado a una batería de ups de 12V y 5Amper/hs ;-)
Lastimosamente tuve inconvenientes con la batería que conseguí (prestada) y tuve que comprar de urgencia 4 pilas recargables NiMh.
Para compensar el peso eliminado al reemplazar la batería, me hice unas bolsas con clavos que iban ubicadas a los lados de las orugas :)


Vista superior del chasis del robot con los servos y orugas montados.


Vista inferior del chasis del robot.
En la imagen superior se pueden  ver los sensores utilizados para el borde del ring de sumo, sensores CNY70 pegados al chasis con silicona de calor.


El cerebro del robot fue un microcontrolador pic 16f84 (mas que suficiente para el objetivo) con un programa  escrito en ccs.
La placa de control la implementé con una placa universal, eso fue realmente trabajoso, me llevo varias horas, la terminación fue mala y tuve inconvenientes con el control de los servos (creo que se metían señales ya que en mi protoboard funcionaba todo correctamente).


Para detectar al enemigo utilicé un sensor infrarrojo implementado por un fototransistor, un fotodiodo y un lm567 como comparador de tonos.
El rango de detección se limitaba a unos 20cm, pero puede mejorarse utilizando filtros y lentes.

Por parte del código implementado, el control de los servos lo realicé con instrucciones de delays, también implemente un timer con interrupciones para tener noción del tiempo transcurrido entre acción y acción, por ejemplo: se encuentra el borde del ring, se retrocede durante 3 segundos y se gira durante 2,5 segundos.
Con relación a la detección del borde, los sensores disparaban interrupciones y las rutinas para evitar caer del ring tenían prioridad por sobre cualquier otro evento.
El diseño y acabado pueden mejorarse inmensamente; para la siguente versión del bot pienso hacer las siguientes modificaciones:

  • Los servos tienen buen torque, pero son lentos, los voy a cambiar por motores dc.
  • Realizar todas las partes en metal.
  • Agregar una rutina de autodiagnóstico de sensores y motores.
  • Ajustar la rutina de ataque y búsqueda del enemigo para contemplar varias estrategias.
  • Reemplazar el arreglo de 4 pilas recargables por una batería plomo ácido o LiPo.
  • Agregar indicador de niveles de carga de batería para monitorear el rendimiento y consumo del robot.
  • Utilizar un microcontrolador más potente.