JAVA Coordenadas en un mapa Localización de municipios
En esta ocasión junto los dos anteriores programas: Coordenadas en un mapa. MAPA Municipios de España. MUNICIPIOS Teníamos una base de datos con todos los municipios españoles, en esta base de datos venían las coordenadas de latitud y longitud. Con esa información de coordenadas, las transformamos en pixel de pantalla, donde dibujamos un cuadrado.
También tenemos que tener en cuenta que la tierra no es plana, y los mapas no son demasiado precisos, por lo cual la traslación de las coordenadas grados decimales a pixel de pantalla, no son lo exactas que deberían ser. Si la escala del mapa es grande, el error será grande.
Debo pedir perdón a los de las islas Canarias, debido a que el programa debía de ser simple, no están implementadas las islas. Los grados que proporciona el programa son decimales, son los más fáciles de entender, además son los que utiliza Google Maps. Como la base de datos de municipios es antigua, los datos de habitantes no serán demasiado exactos.
En este intento de aprender a programar en JAVA, creo un visor de coordenadas en un mapa. Existen dos sistemas de notación: grados sexagesimales o grados decimales.
" Grados sexagesimales El sistema sexagesimal es el método tradicional usado en los mapas impresos, plegables, libros, etc. Consiste en tres grupos de valores: grados, minutos y segundos. Por ejemplo el Capitolio de La Habana está situado en los: 23° 08' 06'' N 82° 21' 34'' W Grados decimales El sistema decimal es muy empleado es programas y aplicaciones de mapas en la red como Google Maps, OpenStreetMaps, además en los sistemas de navegación por GPS. Se separa la parte entera de la fraccionaria con una coma y se transforman los minutos y segundos en números decimales. Por ejemplo a la misma ubicación anterior le corresponde en formato decimal: 23.134999, -82.359444 "
También tenemos que tener en cuenta que la tierra no es plana, y los mapas no son demasiado precisos, por lo cual la traslación de las coordenadas de pantalla de una imagen plana a coordenadas en grados decimales, no son lo exactas que deberían ser. Contra más grande sea el mapa, el error será más grande. En un mapa de España puede ser el error de hasta 20Km por pixel.
Entendiendo lo que se puede esperar en exactitud de este programa, realizo el programa que muestra las coordenadas en un punto de un mapa de España cuando se pulsa el ratón sobre un lugar de la imagen. Debo pedir perdón a los de las islas Canarias, debido a que el programa debía de ser simple, no están implementadas las islas. Los grados que proporciona el programa son decimales, son los más fáciles de entender, además son los que utiliza Google Maps.
Programa funcionando.
Está realizado en Debian10_64bits comprobado en Windows10_64bits , Windows7_32bits, WindowsXP y Debian9 32bits . Tenéis que tener en cuenta, que por defecto netBeans utiliza la versión JDK 11, la versión mayor que tiene instalado el sistema. Lo normal es que la versión que tengáis instalado en vuestro sistema sea la versión de Java 8, la mas extendida. Cambiar en propiedades del proyecto en netBeans a la versión JDK 8, y vuestro programa no tendrá problemas en cualquier sistema operativo.
Sigo con el trabajo de portar antiguos programas realizados en C a JAVA. Esta vez es un base de datos SQLite, para consulta de escritores. En un antiguo programa lo había realizado en C para Linux dbautor.html, y para Windows autoresw.html .
En esta ocasión la programo en Java en mi intento de aprender a programar en este lenguaje. A pesar de existir mucha documentación sobre Java y SQLite , es difícil buscar soluciones concretas , o está cortado el código, o no funciona. Lo normal es que las dll estén instaladas en Windows, pero si tienes algún problema al respecto, se pueden bajar de: https://www.sqlite.org/index.html Sigo pensando que es mucho mejor programar en C que en Java. La única y gran ventaja que tiene Java sobre C, es que no tienes que tocar ni una sola línea de código para que funcione el programa en todas las plataformas.
Linux.
Windows10
Está realizado en Debian10_64bits comprobado en Windows10_64bits , Windows7_32bits, WindowsXP y Debian9 32bits, .
En mi intento de coger el gusto al Java, y mira que le pongo ganas, sigo con un anterior programa realizado para android, androj.html . Este programa es una especie de base de datos que busca los municipios de España. El fichero con la base de datos de municipios se llama municipios0.txt que se incluye en el propio programa dentro de la carpeta de recursos internos llamada datos. En esta carpeta interna datos, incluyo también un icono de representación del programa, y un fondo para que quede más estético el programa. Al no saber mucho de Java, y provenir de C o Basic, el manejo de ficheros se hace de lo mas lioso. En Java necesitas abrir un descriptor de ficheros FileReader , y un BufferedReader . En C con openFile vale, se pensarán los diseñadores de Java que los sistemas operativos no tienen como mínimo dos buffer para que el acceso sea rápido, además de el de el propio disco. También te obligan a comprobar con try que la operación no tuvo errores. Otras de las sorpresas que tuve y que me llevo tiempo encontrar el error fue la función substring. Esta función extrae un trozo de una cadena, en mi caso era xtmp=tmp.substring(0,25); , para que los campos largos me los acortara. El problema era que unas veces me funcionaba y otras no. Estuve tiempo hasta que descubrí que no comprobaba el tamaño de la cadena de origen. Entonces para que sirven los String, si en cosas como esta no comprueban el tamaño. Tuve que solucionarlo con: int z=tmp.length(); if(z>25) z=25; xtmp=tmp.substring(0,z); . Creo a mi parecer que en Java se complican demasiado utilizando para todo herencias y clases. Pero esto es lo que hay. Pero dejémonos de quejas sobre Java y continuemos.
He realizado dos programas que hacen lo mismo. El primero utiliza referencias para colocar los diferentes elementos gráficos en la ventana principal. El segundo utiliza coordenadas absolutas para colocar los elementos gráficos. Esto es debido a que quería colocar un fondo en la aplicación para que quedara más estética. También implica utilizar absolutelayout que debes incluir en el programa. El botón de Maps solo funciona en Linux, debido a que abre el navegador firefox con la coordenadas, en Windows se podrá hacer, pero lo he dejado como tarea para otros.
Normal.
Con absolutelayout y fondo.
Está realizado en Debian9_32bits comprobado en Windows10_64bits , Windows7_32bits, WindowsXP y Debian10 64bits, .
En un programa anterior androi.html había realizado un programa que calculaba la inductancia de una bobina con núcleo de aire. Estaba realizado para la plataforma Android, y como es normal en Java. Como estaba en la época de programar en Java, y es fácil pasar de Android a PC, en un rato lo he pasado.
Lo mas difícil fue insertar la imagen en el programa, pero después de ver unos videos que empleaba un texto con imagen de fondo, la programación se hizo rápida.
Una cosa que me ha pasado y que quiero comentar, es el problema de que cuando genero el archivo *.jar desde netBeans 11 , solo me funciona en Debian10. Pero si lo genero tanto en Windows10_64bits como en Debian9_32bits, me funciona en cualquier plataforma, incluso WindowsXP. Aunque la tendencia es pasar todas las aplicaciones a 64bits, tengo la sensación de que funciona todo mejor y mas rápido en las plataformas de 32bits.
En el montaje anterior javled.html había realizado un controlador de salidas mediante una placa Arduino. Estaba realizado en JAVA, había salido bastante frustrado en su realización. Me había prometido no tocar durante bastante tiempo el JAVA, pero no pude resistir el probar el IDE netBeans para mitigar mi frustración. Después de unos cuanto vídeos sobre este IDE, decidí hacer un video propio demostrando como portar mi anterior montaje a netBeans. Lo difícil ya estaba realizado, la programación serie, solo me faltaba copiar y pegar parte del código de un proyecto a otro. Le resultado ha sido bastante satisfactorio, además de útil para próximas aplicaciones.
Interface del programa.
Programa funcionando.
El programa esta realizado a base de botones, y no como en el anterior proyecto que eran JRadioButton. Quizás los JRadioButton son en este caso mas intuitivos, pero mi intención era hacerlo de otro modo.
En un montaje anterior arseta.html había realizado un controlador de salidas mediante una placa Arduino. Estaba realizado en Gambas (VB Linux), en esta ocasión lo realizo en JAVA. Normalmente o trabajo en C, C++, y Basic. El trabajo que he tenido que realizar para programarlo en JAVA a sido increíble. Intentar encontrar fuentes donde existan ejemplos sobre la programación de los puertos serie en JAVA a sido muy difícil. Cuando encontraba algo, estaba semicompletado o no funcionaba realmente. En una de mis múltiples búsquedas encontré: http://josedeveloper.com/2012/01/28/comunicacion-serial-java-y-arduino/ Además de proporcionar los programas completos, enseñaba como compilar los programas sin errores.
Circuito.
Programa JAVA funcionando.
En cuanto al programa realizado para el arduino, los códigos se basan en anteriores montajes míos, son del tipo: petición de dato a través del interface serie, y respuesta por parte del arduino a través del mismo interface serie. Por ejemplo: SET 8,0 Apagar pin 8 SET 8,1 Encender pin 8 El que quiera puede mandar los comandos por el teminal y mandarlos con SEND, harán el mismo efecto. En la parte del Arduino, está preparado para que entienda desde los pin 14 al 19, que corresponden a A0 - A5 , pero no están implementados en la interface JAVA. El cansancio de programar este programa en JAVA, me hizo que no realizara la comprobación del estado real de las salidas, estaba harto. Para colmo, en teoría se puede empaquetar todo en un único fichero *.jar, pero yo no lo he conseguido. Para hacer mas fácil la compilación y ejecución del programa, he realizado dos ficheros de comandos BASH ./copile y ./run . Lo que parece fácil de C o C++ , se hace muy complicado en JAVA, como el manejo de ficheros o puertos serie. Está realizado en el entorno de Debian 10 , por lo cual el arduino debe encontrarse en /dev/ttyUSB0 , lo normal es que buscase automáticamente donde está conectado el arduino, pero lo he simplificado. Si por casualidad estuviese en otro sitio, deberemos indicarlo en la línea de comandos. ./run /dev/ttyUSB1 .
Espero que les sirva este programa para vuestros proyectos.
En uno de mis artículos anteriores había mostrado varios analizadores digitales - analógicos . Entre ellos mostraba Arduinoscopeque era un visualizador de 6 señales analógicas utilizando el arduino.
Era bastante útil para visualizar señales en baja velocidad, pero el arduino podía convertir señales A/D bastante mas rápido. El programa arduinoscope estaba programado en JAVA utilizando una biblioteca llamada Processing. processing Processing es un potente software dedicado a la producción de imágenes, animaciones e interactivos. Processing está compuesto de todo un entorno de programación en JAVA, (muy similar al del arduino), incluidas un montón de librerías para el tratamiento de imágenes. Se puede descargar de su própia página, y funciona en Windows, Linux y Mac, además de ser Open Source.
Mis conocimientos en JAVA son bastante limitados, y en muchos casos me vuelvo loco utilizando funciones que en C o C++ están permitidas y en JAVA no. Me puse manos a la obra para transformar el Arduinoscope en un Osciloscopio de un solo canal, pero con muestreo de 180000 m/S. En varios artículos había realizado un osciloscopio similar realizado en diferentes lenguajes de programación, Gambas, SDL, Xwin, wxwidgets. Para mi es un reto programar en JAVA, pero los retos me gustan.
Como soy un tanto particular en la programación, he utilizado el editor Geany y la línea de comandos linux (Debian 10) para compilación (copile) y ejecución (run). También he colocado todos los archivos en un solo directorio, incluidas las fuentes (un formato de fuentes de lo mas particular formato vlw) . Los purista me meterían a la cárcel, pero bueno soy autodidacta, y se me puede perdonar.
Forma de onda en mi osciloscópio.
En un oscilocópio comercial.
Señal de 5000 Hz.
El muestreo máximo que permite el arduino en modo Fast es de 183000 m/S , con una resolución de 8 bits. A esta velocidad la exactitud de la conversión A/D no es muy precisa, pero suficiente.
Como se puede ver he colocado una resistencia entre la entrada A1 y los 3,3V, y esto tiene un motivo. Resultaba que al hacer pruebas de medida en DC, las medidas no eran correctas, eran algo inferiores. Revisando voltajes por el circuito descubrí que la tensión en el arduino nano no era de 5V , era de 4,7V y alteraba todas las mediciones. Mirando los esquemas del arduino UNO y el arduino NANO , había diferentes formas de alimentar el micro. El primero utilizaba un transistor sin caída de tensión, y el segundo un diodo que hacia caer la tensión entre 0,3V a 0,7V . Este cambio en la alimentación produce errores de lectura . Para solucionar este problema, realizo una lectura de referencia de los 3,3V en el pin A1. Con esta lectura de referencia calculo la lectura real de la entrada A0.
Espero que le haya gustado este proyecto. Ha sido mas una lucha por aprender JAVA que por realizar el osciloscopio.
Intentado utilizar el montaje del tacómetro, se me vino a la cabeza hacer un lector de código de barras. Debía ser fácil pero no fue así.
Imprimí unas etiquetas con un tamaño bastante grande. Además utilicé una impresora láser para que las definiciones y los contrastes fueran mayores.
Después de muchas pruebas, el mejor resultado de las ondas son las de las imágenes anteriores. Los problemas son varios: -El láser que debería ser un punto fino, en nuestro caso es una línea, no muy gruesa, que debes colocar en vertical, y aún así es demasiado ancha para leer barras normalizadas. -Al utilizar un fototransistor que no tiene óptica de enfoque, el resultado no es muy preciso. -La distancia entre el lector y el papel con el código de barras es variable, lo que dificulta su lectura al pasar el papel manualmente.
Comercialmente se utilizan pequeños espejos que se mueven para mover el láser y efectuar la lectura del código. Con los nuevo modelos de códigos de barras, Código QR, la lectura se realiza con sensores CCD que leen los códigos como imágenes, para luego un programa decodifica el código.
No a sido un montaje exitoso, pero lo expongo como práctica de experimento fallido.
En el anterior artículo había usado un láser y un fototransistor para transmitir datos. Tenía todo montado y debía de dar otra utilidad para estos componentes, se me vino la idea de hacer un tacómetro. La idea es la siguiente, lanzar el rayo láser sobre un motor girando, que depende la superficie donde incida, revota una cantidad de luz que es detectado por un fototransistor. Se podría colocar cualquier tipo de LCD, pero tenía a mano una pantalla OLED 128x64, SSD1306Z, GM009605 , y la añadí a montaje.