Robótica y Electrónica Digital

Conoce las últimas tecnologías aplicadas a la robótica de servicio así como también los fundamentos teóricos en los que se basa esta ciencia.

Redes y Telecomunicaciones

Configuración de equipos de red de voz y datos, ejercicios resueltos sobre redes IP y diversos recursos disponibles como libros, documentación y simuladores.

Computación Científica

Manejar las últimas tecnologías es fundamental hoy en día, pero desconocer los fundamentos que las rigen sería un gran error.

Ingeniería de Software

OOP, AOP, Desarrollo de aplicaciones utilizando J2SE/J2EE, Spring, Hibernate, MyIbatis, MySQL, Oracle, UML, Scrum y mucho más.

Un mundo sin tecnología

En un blog de tecnología no podría faltar un espacio dedicado a quien más ha sentido el impacto de esta, la naturaleza.

Personalización de un JTable en Java

El JTable es un componente del API Swing de Java para desplegar datos en dos dimensiones. Este componente que está desarrollado bajo el patrón MVC (como el resto de componentes de Java Swing) presenta un modelo y un renderizador los cuales se encargan de mostrar los registros de una forma determinanda, sin embargo en muchas de nuestras aplicaciones queremos personalizar los datos mostrados por lo que se hace necesario escribir nuestras propias clases para renderizar y gestionar la información que queremos mostrar.

La imágen que podemos apreciar a la derecha podría no parecer el clásico JTable al que estamos acostumbrados quienes nos iniciamos con Java o podría pensarse que lograr tener una presentación de este tipo es cosa de otro mundo pero no es así. A lo largo de este artículo les mostraré la forma de cómo hacerlo con unos cuantos sencillos pasos.

Lo primero que debemos hacer es crearnos un proyecto en Netbeans nombrándolo como mejor nos paresca. Luego crear un paquete que en nuestro caso le hemos llamado com.blogspot.rolandopalermo.bean y a continuación crear en ese mismo paquete una clase Cliente tal como se muestra en la figura a continuación:


Y el código de esta clase debe quedar como se muestra  a continuación:
package com.blogspot.rolandopalermo.bean;

/**
 *
 * @author Rolando
 */
public class Cliente {

    private int id;
    private int edad;
    private String nombre;
    private String nombreEmpresa;
    private String nombreContacto;
    private String direccion;

    public Cliente(int id, int edad, String nombre, String nombreEmpresa, String nombreContacto, String direccion) {
        this.id = id;
        this.edad = edad;
        this.nombre = nombre;
        this.nombreEmpresa = nombreEmpresa;
        this.nombreContacto = nombreContacto;
        this.direccion = direccion;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getNombreContacto() {
        return nombreContacto;
    }

    public void setNombreContacto(String nombreContacto) {
        this.nombreContacto = nombreContacto;
    }

    public String getNombreEmpresa() {
        return nombreEmpresa;
    }

    public void setNombreEmpresa(String nombreEmpresa) {
        this.nombreEmpresa = nombreEmpresa;
    }
}
Ahora debemos crear una JFrame el cuál se encargará de contener tanto a nuestra tabla como al resto de nuestros componentes Swing de nuestra aplicación. Creamos el JFrame VentanaPrincipal.java como se muestra en el figura siguiente:


Es el turno de nuestro modelo, quién se encargá de manejar las propiedades de tabulación de nuestra tabla  Para esto creamos la clase TablaModeloCliente como se muestra en la figura:


Y su código respectivo:
package com.blogspot.rolandopalermo.gui;

import com.blogspot.rolandopalermo.bean.Cliente;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Rolando
 */
public class TablaModeloCliente extends AbstractTableModel {

    private String[] columnNames = {"DNI", "Nombre", "Edad", "Dirección", "Empresa", "Contacto"};
    private List<cliente> clientes = new ArrayList<cliente>();

    public void agregarCliente(Cliente cliente) {
        clientes.add(cliente);
        fireTableDataChanged();
    }

    public void eliminarCliente(int rowIndex) {
        clientes.remove(rowIndex);
        fireTableDataChanged();
    }
    
    public void limpiarClientes() {
        clientes.clear();
        fireTableDataChanged();
    }

    @Override
    public String getColumnName(int columnIndex) {
        return columnNames[columnIndex];
    }

    @Override
    public int getRowCount() {
        return clientes.size();
    }

    @Override
    public int getColumnCount() {
        return 6;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch (columnIndex) {
            case 0:
                return clientes.get(rowIndex).getId();
            case 1:
                return clientes.get(rowIndex).getNombre();
            case 2:
                return clientes.get(rowIndex).getEdad();
            case 3:
                return clientes.get(rowIndex).getDireccion();
            case 4:
                return clientes.get(rowIndex).getNombreEmpresa();
            case 5:
                return clientes.get(rowIndex).getNombreContacto();
            default:
                return null;
        }
    }

    @Override
    public Class getColumnClass(int columnIndex) {
//        return getValueAt(0, columnIndex).getClass();
        return String.class;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        Cliente cliente = clientes.get(rowIndex);
        switch (columnIndex) {
            case 0:
                cliente.setId((Integer) value);
            case 1:
                cliente.setNombre((String) value);
            case 2:
                cliente.setEdad((Integer) value);
            case 3:
                cliente.setDireccion((String) value);
            case 4:
                cliente.setNombreEmpresa((String) value);
            case 5:
                cliente.setNombreContacto((String) value);
        }
        fireTableCellUpdated(rowIndex, columnIndex);
    }
}
Y para renderizar los datos en la grilla, crearemos la clase TablaRenderizadorCliente la cuál determinará las propiedades gráficas y el comportamiento gráfico de las celdas que van a componer la tabla.


Lo que debemos hacer es implementar la interfaz TableCellRenderer.
package com.blogspot.rolandopalermo.gui;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author Rolando
 */
public class TablaRenderizadorCliente implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel etiqueta = new JLabel();
        etiqueta.setOpaque(true);
        /*
         * Coloreamos las filas
         */
        if (row % 2 == 0) {
            etiqueta.setBackground(new Color(255, 255, 200));
        } else {
            etiqueta.setBackground(Color.white);
        }
        /*
         * Para establecer el tipo de icono
         */
        if (column == 1) {
            String nombre = (String) value;
            etiqueta.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
            if (nombre.startsWith("#")) { //Hombre
                etiqueta.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/blogspot/rolandopalermo/recursos/user.png"))); // NOI18N
            } else if (nombre.startsWith("&")) { //Mujer
                etiqueta.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/blogspot/rolandopalermo/recursos/user2.png"))); // NOI18N
            }
            etiqueta.setText(value.toString().substring(1, nombre.length()));
        } else {
            etiqueta.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            etiqueta.setText(value.toString());
        }
        /*
         * Para una fila seleccionada
         */
        if (isSelected) {
            etiqueta.setBackground(new Color(151, 193, 215));
        }
        return etiqueta;
    }
}
Con esto ya deberiamos tener la tabla como se muestra en la siguiente figura:


Para establecer el modelo y el renderizador a nuestra tabla deberíamos hacer lo siguiente:
TablaModeloCliente modelo = new TablaModeloCliente();
TablaRenderizadorCliente renderizador = new TablaRenderizadorCliente();
tablaClientes.setModel(modelo);
tablaClientes.setDefaultRenderer(String.class, renderizador);
Y para finalizar les dejo el enlace del proyecto para descargar.

Photobucket

Para ver más los post más viistados así como enterarse de las novedades sigue este blog en Facebook:

Puente H con Reles para el control de giro de motores DC

En este post voy a explicar la forma de cómo diseñar un puente H basado en relés. Los puentes H son circuitos electrónicos ampliamente usados en robótica para el control de motores u otros actuadores que requieran de convertidores de potencia.
Los circuitos de puente H son tan populares que incluso los tenemos en circuitos integrados como el L293 o el L298. El hecho de construirlos nosotros mismos surge como respuesta a la necesidad de querer usar motores u otros acutadores que requieran manejar grandes cantidades de corriente como por ejemplo cuando queremos diseñar un warbot cuyos motores consumen entre 20A y 30A con picos de hasta 50A.
Existen en el mercado puentes H que soportan esta carga de corriente, pero su precio es elevado. Por eso, frente a ello les muestro el esquema de un sencillo puente H basado en relés pues estos permiten manejar corrientes elevadas sin precisar de mucho dinero en comparación con los Puentes H basados en mosfets.

El esquema que muestro en la Figura 1 corresponde a un circuito de Puente H el cual utiliza 2 relés de 5V para controlar el sentido de giro de un motor de corriente continua.

Figura 1. Diagrama esquemático de un puente H

Luego de armar el circuito debería quedarnos como en la Figura 3.

Figura 3. Circuitos de Puente H

Estos circuitos fueron desarrollados como parte de mi tesis sobre el telecontrol de robots móviles. Aquí les dejo un video en donde se muestra parte de las funcionalidades del robot.


Y aquí el diagrama para realizar el PCB del circuito junto a otro diagrama para ver la disposición de los componentes así como también el archivo del circuito hecho en PCBWizard si es que necesitan hacer modificaciones.

Photobucket 

Cualquier duda no duden en comentarla. Espero que les sea de utilidad y hasta la próxima!!!...xD !

Gráficas con Matlab

En este post vamos a ver la forma de realizar graficación de datos utilizando Matlab. Estudiaremos la amplia gama de funciones que Matlab pone a nuestra disposición para realizar gráficos de curvas, superficies, barras, líneas, gráficos polares, pies, etc. 

Plot(x,y) nos permite dibujar el conjunto de puntos X,Y en un plano cartesiano. La forma de utilizarlo se muestra a continuación:

x=-1:0.1:5;
y=sin(x.^2);
plot(x,y);
Bar(x,y) grafica barras verticales, donde y representa las frecuencias y x define los espacios en el eje x.
x=-3:0.2:3;
y=exp(-x.^2);
bar(x,y);
Barh(x,y) grafica barras verticales, donde x representa las frecuencias y y define los espacios en el eje x.



x=-3:0.2:3;
y=cos(x.^3)-2*x+1;
barh(x,y);
Stairs(x,y) se utiliza para graficar curvas escalonadas.
x=0:0.2:10
y=sin(x);
stairs(x,y);
Polar(x,y) se utiliza para graficar curvas en coordenadas polares.
t=0:0.1:2*pi;
y=abs(sin(2*t).*cos(2*t));
polar(t,y);
 



Pie(x) realiza un gráfico de sectores o de torta relativo al vector x.
x=1:2:9;
pie(x);
 

Rosex) realiza el histograma angular relativo al vector x. 
x=[ 1 3 6 7 4 7 4 12];
rose(x);
Matlab  también nos permite personaliar nuestros gráficos de funciones utilizando diferentes colores, caracteres y tipos de líneas. Las tablas a continuación nos muestran los valores que podemos utilizar para indicar los puntos de nuestra función.



Caracteres
Descripción
.
Punto
+
Más
*
Asterisco
O
Circunferencia
X
Equis


Líneas
Descripción
-
Continua
--
Guiones
:
Punteada
-.
Guiones y punto


Color
Descripción
r
Rojo
y
Amarillo
g
Verde
b
Azul
w
Blanco
m
Magenta
c
Turquesa
k
Negro

 Las imágenes a continuación muestran el resultado de aplicar los valores de la tabla anterior.
x=-2:0.2:2;
y=abs(cos(x));
plot(x,y,'+');
 

x=-3:0.2:4;
y=sin(x).^3-x;
plot(x,y,'O');


x=-3:0.2:3;
y=x^.2+3*abs(x)+8;
plot(x,y,'r');
 

Matlab también tiene la opción para realizar simultáneamente la gráfica de varias curvas. La función plot(x,y,x,z) grafica dos curvas con dos colores o tipos distintos.
x=0:0.05:5;
y=sin(x);
z=cos(x);
plot(x,y,x,z);
 

También podemos realizar gráficas en múltiples ejes. La función subplot(a,b,c) divide la pantalla del gráfico de a por b gráficas en una sola pantalla, en donde c es la secuencia o de las gráficas. En el siguiente ejemplo podemos ver el uso de la función subplot:
t=0:0.3:5;
x=t.^2;
y=2*t-5;
z=sin(t);
u=cos(t);
v=abs(t);
w=sqrt(t);
subplot(3,2,1), plot(t,x), title('gráfico 1');
subplot(3,2,2), plot(t,y), title('gráfico 2');
subplot(3,2,3), plot(t,z), title('gráfico 3');
subplot(3,2,4), plot(t,u), title('gráfico 4');
subplot(3,2,5), plot(t,v), title('gráfico 5');
subplot(3,2,6), plot(t,w), title('gráfico 6');


Y en el siguiente post dedicado a Matlab veremos cómo generar animaciones y películas.