martes, 13 de diciembre de 2011

Usos y aplicaciones java

El programa JAVA sirve para aplicaciones con uso intensivo de red, o internet, o donde sea muy importante la seguridad. También sirve para actualizar las horas programadas y comprueba si hay actualizaciones disponibles. Java tiene muchas herramientas que te sirven para desarrollo de aplicaciones a gran escala. Es muy potente y fiable, y puramente orientado a objetos. Por eso es que se usa mucho en estos tiempos. Es una herramienta más. Java tiene una particularidad, que corre en casi cualquier plataforma.

Java Development Kit

Java Development Kit o (JDK), es un software que provee herramientas de desarrollo para la creación de programas en Java. Puede instalarse en una computadora local o en una unidad de red.

En la unidad de red se pueden tener las herramientas distribuidas en varias computadoras y trabajar como una sola aplicación.

JDK en Windows

En los sistemas operativos Microsoft Windows sus variables de entorno son:

JAVAPATH: es una ruta completa del directorio donde está instalado JDK.

CLASSPATH: son las bibliotecas o clases de usuario.

PATH: variable donde se agrega la ubicación de JDK.

Los programas más importantes que se incluyen son:

Appletviewer: es un visor de applets para generar sus vistas previas, ya que un applet carece de método main y no se puede ejecutar con el programa java.

Javac: es el compilador de Java.

Java: es el intérprete de Java.

Javadoc: genera la documentación de las clases Java de un programa.

Requerimientos para programar en JAVA

Lo primero que nos viene en mente es hacernos con un editor, un programa en el que escribir nuestro código Java. El famoso bloc de notas puede valernos como tal, pero sin un compilador no nos servirá de mucho. Ahora bien... ¿de donde sacamos ese compilador? 

Sun, la empresa creadora de Java, distribuye gratuitamente el llamadoSDK (Software Development Kit), en versiones anteriores llamado JDK (Java Development Kit), un conjunto de herramientas y programas que permiten desarrollar, compilar y ejecutar aplicaciones en Java. El compilador en el SDK o JDK se llama javac.exe. 

Programar tan sólo con el SDK puede resultar algo tedioso, pues utilizaremos un programa para editar, otro para compilar, otra para el debugger... por ello, se suelen utilizar los llamados IDE´s, aplicaciones que permiten hacer todo eso en un mismo entorno, a través de un sólo programa. 

Exiten muchos IDE´s para Java, algunos que incluyen sus propias clases y librerías, otros orientados al desarrollo de applets, gratuitos, de pago.... Algunos también no llevan compilador, por lo que tendremos que indicar en la configuración del programa el directorio donde se encuentra nuestro SDK o JDK. 

Relacion de JAVA con Android

A través de un comunicado de prensa, Oracle anunció el 12 de agosto de 2010 una demanda contra Google por violación de propiedad intelectual en el uso de Java en el sistema operativo Android. La razón citada: «Al desarrollar Android, Google a sabiendas, infringió directa y repetidamente la propiedad intelectual de Oracle en relación a Java. Esta demanda busca remediar apropiadamente su infracción.

Programas de ejemplo

// Demostración de los clics de ratón y cómo diferenciar entre los botones del ratón.

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class DetallesRaton extends JFrame

{

   private int xPos, yPos;

   // establecer cadena barra título; registrar escucha ratón; ajustar tamaño y mostrar ventana

   public DetallesRaton()

   {

      super( "Clics y botones del ratón" );



      addMouseListener( new ManejadorClicsRaton() );



      setSize( 350, 150 );

      setVisible( true );

   }



   // dibujar objeto String en la ubicación donde se hizo clic con el ratón

   public void paint( Graphics g )

   {

      // llamar al método paint de la superclase

      super.paint( g );



      g.drawString( "Se hizo clic en: [" + xPos + ", " + yPos + "]",

         xPos, yPos );

   }



   public static void main( String args[] )

   {

      DetallesRaton aplicacion = new DetallesRaton();

      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

   }



   // clase interna para manejar eventos de ratón

   private class ManejadorClicsRaton extends MouseAdapter {



      // manejar evento de clic del ratón y determinar cuál botón se oprimió

      public void mouseClicked(MouseEvent evento)

      {

         xPos = evento.getX();

         yPos = evento.getY();



         String titulo = "Se hizo clic " + evento.getClickCount() + " Veces";

     

         if ( evento.isMetaDown() )  // botón derecho del ratón

            titulo += " con el botón derecho del ratón";

     

         else if ( evento.isAltDown() )  // botón de en medio del ratón

            titulo += " con el botón central del ratón";

     

         else  // botón izquierdo del ratón                      

            titulo += " con el botón izquierdo del ratón";



         setTitle( titulo );  // establecer barra de título de la ventana

         repaint();



      } // fin del método mouseClicked



   } // fin de la clase interna privada ManejadorClicsRaton



} // fin de la clase DetallesRaton

Ejemplo No.2

// Demostración de los colores.

import java.awt.*;

import javax.swing.*;



public class MostrarColores extends JFrame {



   // el constructor establece cadena de barra de título y dimensiones de la ventana

   public MostrarColores()

   {

      super( "Uso de los colores" );



      setSize( 400, 130 );

      setVisible( true );

   }



   // dibujar rectángulos y objetos String en distintos colores

   public void paint( Graphics g )

   {

      // llamar al método paint de la superclase

      super.paint( g );



      // establecer nuevo color de dibujo utilizando enteros

      g.setColor( new Color( 255, 0, 0 ) );

      g.fillRect( 25, 25, 100, 20 );

      g.drawString( "RGB actual: " + g.getColor(), 130, 40 );



      // establecer nuevo color de dibujo utilizando valores float

      g.setColor( new Color( 0.0f, 1.0f, 0.0f ) );

      g.fillRect( 25, 50, 100, 20 );

      g.drawString( "RGB actual: " + g.getColor(), 130, 65 );



      // establecer nuevo color de dibujo utilizando objetos Color estáticos

      g.setColor( Color.BLUE );

      g.fillRect( 25, 75, 100, 20 );

      g.drawString( "RGB actual: " + g.getColor(), 130, 90 );



      // mostrar valores RGB individuales

      Color color = Color.MAGENTA;

      g.setColor( color );

      g.fillRect( 25, 100, 100, 20 );

      g.drawString( "Valores RGB: " + color.getRed() + ", " +

         color.getGreen() + ", " + color.getBlue(), 130, 115 );



   } // fin del método paint



   // ejecutar la aplicación

   public static void main( String args[] )

   {

      MostrarColores aplicacion = new MostrarColores();

      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

   }



} // fin de la clase MostrarColores


martes, 29 de noviembre de 2011

Modelo de Negocios de GOOGLE
Google no tiene como única finalidad proporcionar acceso a miles de sitios web para poder obtener cierta información que necesitemos ya que google desde sus inicios también se ha esforzado por brindar un mejor servicio a empresas tanto grandes como chicas también dando oportunidad a distintos tipos de personas sea cual sea su situación económica ya que google se interesa en crecer como organización y permitir que los demás que quieran darse a conocer logren llegar a la cima de la empresa.
Para google no fue difícil ver como podía crear opciones para el crecimiento de las pequeñas medianas y grandes empresas para esto google decidió crear espacios en las páginas con las que estaba asociado y poner publicidad pero para esto google tuvo que desarrollar software que ayudaría al usuario a mejorar le creación de anuncio publicitario sin en cambio en un principio solo se podía crear publicidad para las paginas si no que ahora también la publicidad puede ser elaborara para  los teléfonos móviles que cuenten con acceso a internet esto para que se puedan administrar mas anuncios publicitarios que ayuden a dar a conocer la empresa con la finalidad de crecer e ir obteniendo más ganancias atribuyendo a que se pudo asociar con una gran organización como lo es google.
También google se intereso en elaborar nuevas formas de crear diversos negocios con todas la empresas que deseaban unirse a dicha empresa pero google pensó como podía llegar a obtener ciertos resultados si ya tenían la publicidad entonces para esto google diseño una aplicación denominada google places lo cual era una base de datos que contenía fichas con los datos de la empresa desde el nombre la ubicación y que puede brindar a un usuario y google también utiliza para esto herramientas de apoyo que ayudan a mejorar la experiencia de el usuario que está a punto de darse a conocer en todo el público.

martes, 22 de noviembre de 2011

robot rastreador de luz
Descripción: El siguiente robot es un rastreador de luz específicamente diseñado a tal efecto y su única tarea es encontrar un punto de luz dentro de su ángulo de detección de 180º frontales y dirigirse lo más rápido posible hacia tal fuente de luz.

Dispone de 3 sensores de luz LDR dispuestos en ángulo de 60º los unos de los otros y metidos en una bocina dividida en 3 partes y echa al efecto con cartulina negra para evitar que la luz ambiente afecte a la buena detección de la fuente de luz a encontrar, también dispone de 3 circuitos comparadores analógicos de tensión en torno a amplificadores operacionales en modo comparador y lógica digital programable (a mano) en torno a circuitos integrados de la serie 74, el driver controlador de los motores es un ULN2003 con lo que se controla el encendido de los dos motores independientemente, al usar el ULN203 no se dispone de control de dirección de giro y las ruedas en ningún caso correrán hacia atrás, por último y terminar con la descripción, he usado una base móvil con dirección de giro diferencial (tipo tanque) construida a partir de 2 kits motorizados 4x4 a escala 1/32 de camiones de mina que comercializa TAMIYA, como los motores actúan sobre las dos ruedas de un costado e juntado dos camiones y ahora cada motor de cada camión actúa sobre un lado con lo que ya tenemos el sistema diferencial de dirección. La alimentación de la parte lógica de control es mediante una pila de 9V y la parte de potencia y motores es mediante las mismas pilas que trae cada camión compuesta por 2 pilas LR6 de 1,5 V, estos dos grupos de pilas los conectamos en paralelo para disponer de más corriente y que se agoten por un igual los dos grupos de pilas, como puede deducirse los motores son de 3V cada uno y gastan una media de 400mA aunque el pico de arranque es bastante elevado y ronda 1 Amperio.

Funcionamiento: Paso ahora a describir el funcionamiento del circuito principal del robot que contiene la lógica digital compuesta por circuitos integrados de la serie 74xx, el diseño del circuito es tal que se puede programar de manera manual y sin tener grandes conocimientos de electrónica digital, mediante cableado entre los conectores J7 y J6. De esta manera seremos nosotros mismos los que programemos la actitud del robot según las condiciones o eventos externos captados por los sensores, como se verá más adelante la configuración optima de la parte programable no la describo y no puede verse en ninguno de los esquemas, no obstante estará explicado de una forma muy sencilla y completa el modo de hacerlo y cada cual tendrá que programarse el robot a gusto ya que de esta manera será más satisfactorio el montaje de este robot y de paso aprenderemos un poco sobre circuitos digitales simples.

Sensores: El siguiente esquema muestra el circuito utilizado para poder ajustar la sensibilidad  del nivel luz a detectar y de este modo poder dejar fuera de acción a la luz ambiente u otras posibles fuentes de luz.
















El funcionamiento de este circuito es como sigue; como ya sabemos, la LDR varia su resistencia interna en función de la luz que incide sobre ella, a más luz menos resistencia y viceversa, si nos fijamos en el circuito anterior veremos que lo que se ha hecho es un divisor de tensión simple en base a dos resistencias, una de ellas es la LDR que variara su valor en función de la luz y la otra es una resistencia fija de 10K, al variar la LDR de valor lo que también hará es variar la tensión en el punto intermedio entre las dos resistencias, con lo que ya tenemos un nivel de tensión proporcional a la luz. Seguidamente lo que se hace es comparar el nivel de tensión proporcionado por el conjunto divisor de tensión LDR-Resistencia con otra tensión variable esta vez obtenida de un potenciómetro, el amplificador operacional lo que hace es activar su salida o desactivarla en función de si los valores en su entrada positiva es igual o mayor al de su salida negativa, de este modo podemos ajustar el nivel de histeris del circuito es decir con que valor mínimo de luz se activara su salida.

Como también podemos observar, en la salida del amplificador operacional se ha dispuesto un diodo LED para tener una indicación de visual del estado de salida del circuito y de este modo poder ajustar fácilmente sin instrumento externo alguno, también se ha dispuesto un jumper en el caso que no queramos que los leds luzcan una vez ajustado el circuito.

El robot consta de dos circuitos idénticos como este, como cada uno maneja dos LDR en total serian 4 pero como en este caso tan solo necesitamos 3 sensores LDR podemos dejar sin montar media parte de uno de los circuitos si así lo creemos conveniente (aunque teniendo en cuenta el bajísimo precio de los componentes que lo forman no vale la pena).

Lógica de control 1/2: Aquí tenemos la mitad del corazón del sistema lógico de control que se describirá en dos partes como ya habréis intuido.

El problema principal que se me planteaba en el diseño de este robot era el uso de 3 sensores LDR ya que no podía hacerlo tan simple como si hubiese sido con 2 LDR, aunque ni que decir de las ventajas de usar 3 sensores en la práctica. Pues bien al pensar un poco y hacer unos bocetos sobre papel se me ocurrió (lo que a todo el mundo con un mínimo de electrónica digital) que 3 LDR equivalían a 8 posibles estados de salida en conjunto, bien esta parte ya la tenemos pensada, ahora queda el que hacer con estos 8 posibles estados, en forma binaria no nos son muy útiles a no ser que usemos un micro controlador o sistema complejo con lo que la siguiente fase será convertir los 3 bits binarios en 8 salidas independientes y para tal efecto usaremos el circuito integrado 74LS138 que es un conversor BCD-Decimal de 3 bits y nos viene al dedillo para este caso, las salidas de este integrado son pull-up y se activan a nivel bajo (siempre están a 5V menos cuando se activa la salida que pasa a ser 0V o GND).


Pues bien esta parte del circuito ya la tenemos echa, o casi os habréis fijado en que he puesto unos disparadores trigger schmitt tipo 74LS14 en las entradas, pues bien esto es debido a que los amplificadores operacionales LM358 no dan más que 3,3 V a sus salidas y si los dirigiésemos directamente al 74LS138 este ni se enteraría de los niveles lógicos y tomaría todo como 0, hay otros operacionales que dan a su salida lo mismo que su alimentación pero bueno esto ya está hecho y funcionando :)

Lógica de control 2/2: Pues bien aquí tenemos la segunda parte del circuito de control y el problema ahora es que tenemos 8 salidas del 74LS138 y solo 2 motores que actuar, así que nos sobran unas cuantas salidas no?, y como vamos a poder hacer que en un determinado estado de entrada se active tal motor?.

Vamos a analizarlo ahora del revés, tenemos 2 motores, el control que vamos a tener sobre ellos va a ser tal que solo podamos activarlos o desactivarlos en una dirección con lo que para girar el robot mantendrá un lado frenado mientras las otras ruedas giraran (como un tanque) el radio de giro de este sistema es más grande que haciendo girar un lado en un sentido y el otro lado en otro sentido, pero como es más sencillo usaremos lo primero. Para controlar los motores usaremos un circuito integrado driver específico para motores modelo ULN2003 que es suficiente para pequeños motores de juguetería. Bien ahora lo tenemos así; el motor tiene 2 cables, uno de ellos lo llevamos a Vcc y el otro lo hacemos pasar por el driver que actuara como un interruptor y activara o no el motor, ahora tenemos 2 cables para el control de los 2 motores, 2 cables son 4 posibles estados; Adelante, Giro derecha, Giro izquierda, Parado, de esta manera tenemos un control simple de todas las posibles acciones del robot.

Para solucionar el problema planteado anteriormente sobre las 8 salidas y los 2 motores. pues nada más fácil que un codificador de prioridad o conversor Decimal-BCD, en este caso un 74LS147 que dispone de 9 entradas independientes y una salida binaria de 4 bits equivalente a la entrada activa, para activar los motores usaremos (tal como se ve en el esquema) solamente las salidas A y B, las entradas del codificador de prioridad se han puesto a pull-up mediante resistencias y se activaran a nivel bajo, recordemos que el 74138 activaba sus salidas a nivel bajo también, con lo que los 2 integrados se acoplan entre sí a la perfección.

En el esquema también podemos ver el regulador de tensión en torno a un 7805 que regulara a +5V los +9V obtenidos de la pila que alimenta el circuito.

Montaje: El robot consta en total de 3 placas de circuito impreso, dos para los sensores y una con la lógica de control, conectadas entre sí tal como puede verse en la siguiente figura:


La siguiente parte que tenemos que hacer es una especie de bocina plana de 180º en total dividida en 3 sectores a 60º en donde ubicaremos las LDR. Tal como puede verse en la foto de la derecha. En mi caso el sector central lo he estrechado con tiras de cartulina negra para así tener una mejor detección de lo que realmente es el frente (en esta foto no están puestas tales tiras). Esto se debe de probar sobre la marcha una vez el robot ya funcione y hagamos diferentes pruebas.

Programación: Llegados a esta fase supongo que ya tendréis montado el robot por completo y solo os quedara la programación del circuito.

La tabla de la verdad del circuito integrado 74LS138 es la siguiente:

Input
Output
Estado de los sensores
C
B
A
/Q=L
0
0
0
1
Luz en todos
0
0
1
2
0
1
0
3
0
1
1
4
1
0
0
5
1
0
1
6
1
1
0
7
1
1
1
8
Oscuridad total

Y como puede verse cada combinación de entrada de los sensores LDR equivale a que una de las salidas del integrado tome el valor lógico bajo. Tendremos en cuenta para la programación que las señales provenientes de las LDR son invertidas al pasar por el trigger schmitt con lo que en ausencia de luz captaremos todas las entradas a nivel lógico alto. Como puede verse hay dos campos rellenados correspondientes a oscuridad y luz en todos los sensores, los demás deberán de rellenarlos cada cual ya que de esta manera será más divertido y satisfactorio el trabajo. Los números de salida equivalen a cada pin del conector J7 del circuito de control.

En la siguiente tabla de la verdad podemos ver la equivalente al circuito integrado 74LS147 codificador de prioridad, que como vemos saca un valor binario equivalente a la entrada que tiene puesta a nivel bajo.

/Entrada
/Salida

1
2
3
4
5
6
7
8
9
D
C
B
A
Descripción.
1
1
1
1
1
1
1
1
1
1
1
1
1
todas al aire
0
1
1
1
1
1
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
0
Parado
1
1
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
1
1
1
1
0
1
0
1
1
1
1
1
0
1
1
1
1
0
0
1
1
1
1
1
1
1
0
1
1
1
0
0
0
Parado
1
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
0
0
1
1
0

Como podemos observar las salidas C y D están representadas en un color más apagado ya que en no se usan en este montaje para nada y no se tienen en cuenta. También podemos observar que no está rellenada la descripción de lo que harán los motores en todos los casos posibles y como en el la tabla anterior será tarea de cada uno averiguarlo :) aunque en este caso es más fácil ya que teniendo el circuito alimentado y probando con un cablecito conectado a masa podremos ver lo que hacen los motores cada vez que pinchamos el cable en una posición de conector J6 (cuidado de no poner más de un cable a masa o hacer contactos entre pines adyacentes). La primera posición cuya descripción es "todas al aire" corresponde al caso en que no tengamos ningún calecido puesto y estén todos los pines de J6 al aire con lo que en realidad estarán a Vcc por las resistencias de polarización y por lo tanto los dos motores se moverán hacia delante. (Si lo hiciesen hacia atrás sería un problema del cableado de los motores y habría que invertir los polos de estos para invertir el giro de estos)