viernes, 18 de noviembre de 2016

Circuito integrados. Fotos con microscopio

Página principal

Circuito integrados
Fotos con microscopio


El otro día rebuscando por los cajones encontré algunos circuitos. Estos circuitos eran parte de mis inicios de juventud en esto de la electrónica.
En mi pueblo había pocas cosas de electrónica, una radio de válvulas y una televisión que funcionaba con un montón de válvulas. Cuando mi padre abría el televisor para cambiar alguna válvula fundida, y se fundían con frecuencia, yo procuraba estar cerca para ver el increíble espectáculo de cables y cosas que yo no entendía, pero me parecían un mundo mágico que aquellas cosas pudieran generar imágenes.
Esto creo yo que me incito a empezar aprender cosas de electricidad, luces, cables, interruptores.
Las casualidades de la vida trajeron cerca del pueblo un lugar donde quemaban infinidad de componente electrónicos, cuando prendían los montones de cables y circuitos, las llamas se elevaban a gran altura generando llamas de todos los colores, era debido a los plástico y componentes.
Todos los días venían camiones llenos de cables, circuitos restos de centralitas, etc , y se marchaban con el cobre  y demás metales.
De vez en cuando nos acercábamos y nos llevábamos algún cable,  teléfono, o circuito antes de que lo quemaran. De ese quemadero saqué muchos componentes para experimentar.
El quemadero se cerró debido al cantidad de humo y olor sin control que se esparcía todos los días. Yo me quedé triste debido a que me habían quitado mi fuente de suministros. :(
Esto ocurrió en los años 70 , fueron años de cambios en la fabricación de circuitos integrados.
Los circuitos que os muestro en las imágenes eran hechos por IBM y Texas Instruments, de los cuales no se encontraban referencias, eran numeraciones especiales que no coincidían con los standard, por lo cual no pude aprovechar.
Yo me pasaba horas viendo por el microscopio los circuitos. Ahora sería casi imposible ver los CI debido a la miniaturización.



Saludos.
Juan Galaz

viernes, 29 de julio de 2016

Mando a distancia de 4 reles (relay) mediante nRF24 Arduino

Página principal



Mando a distancia de 4 reles (relay)
mediante nRF24
Arduino

xsetaseta@gmail.com


En este montaje realizo un mando a distancia para 4 relés mediante el módulo nRF24.
En un lado está el emisor con un arduino, el módulo nRF24 como emisor y 4 pulsadores.
En el lado receptor se encuentra otro arduino y el módulo nRF24, junto con un modulo de 4 relés que funcionan bajo 5V.
No he realizado placa de circuito impreso, se ha montado y probado en protoboard.
No se ha optimizado el código en el emisor para que consuma poco, se podría reducir 20 veces, pero eso os lo dejo como trabajo.
Para poder insertar el nRF24 he realizado un adaptador como se puede ver en la imagen.


Adaptador


Esquema emisor.


Circuito emisor montado con dos pulsadores.


Esquema del receptor.


Circuito receptor montado.


Como he dicho antes, en el circuito emisor se podría modificar el programa para que la autonomía fuese 20 veces mas.
Para probar el circuito receptor he colocado una demo cada vez que se reinicia el circuito emisor.
El que quiera quitar la demo comenta la línea.
Debéis tener en cuenta que el nRF24 funciona a una frecuencia de 2.4GHz. A esta frecuencia los obstáculos afectan mucho, por lo que si se ve el emisor y el transmisor el alcance es considerable, pero con paredes por medio se reducen bastante.
Existe un  nRF24 con antena que puede llegar hasta 1km en visión directa, sin obstáculos.
En el lado receptor debemos tener en cuenta el consumo de los 4 relés, 60 mA por rele, 4x60=240mA, por lo que la optimización del consumo no es demasiado importante,



Programa

Saludos.
Juan Galaz

jueves, 23 de junio de 2016

Programación EEPROM 24cXX 24c01-24c02-24c04-24c08-24c16 con Arduino y Gambas

Página principal



Programación EEPROM 24cXX
24c01-24c02-24c04-24c08-24c16
con
Arduino y Gambas

xsetaseta@gmail.com


En el anterior montaje  (programación EEPROM 24c02 24c01) había realizado un grabador de memorias 24c01 y 24c02 de 128bytes y 256 bytes. Estos modelos tienen un direccionamiento de 1byte, 256 posiciones de memoria. El bus I2C se había diseñado para en principio para direccionar  256 tipos de dispositivos (Circuitos integrados), y era mas que suficiente. Pero que ocurrió que se utilizó para memorias EEPROM, y las memorias crecieron en capacidad, y ahora es fácil encontrar memoria de hasta 8Mbytes.
Para memorias de entre 256 bytes a 2Kbytes, quitaron los ping de selección de chip E0,E1,E2  para internamente utilizarlos como direccionamiento.
En memorias 24c32 al 24c256, 4Kbytes a 64Kbytes, se mandan dos bytes para sacar la dirección de la memoria. Cuando me lleguen estos modelos de chip actualizaré el programa. Recomiendo leer las hojas de características  de los chip para entender su funcionamiento.

Cuando empece a programar los chip 24c04-24c08-24c16 desde arduino no encontré ningún ejemplo, y el que vi resulto que direccionaba mal la memoria, mandando 2Bytes.
Tampoco entendía que en la librería Wire de arduino , asignaran para las memorias la dirección 0x50, #define EEPROM_I2C_ADDRESS 0x50 ,cuando en realidad era 0xA0  (0b10100000). Después de investigar, descubrí que desplazaba 1 bit a la derecha para eliminar el bit de escritura, claro está que luego la librería Wire, vuelve a desplazar a la izquierda para volver a colocar el verdadero valor.
Ahora entendido como se debía utilizar la EEPROM_I2C_ADDRESS como parte de direccionamiento de la memoria, se modifica la programación del arduino. Utilizo los bits A8,A9,A10 de la dirección de memoria, para colocarlos en el Device Select Code en la posición b1,b2,b3.  deviceaddress=deviceaddress | (eeaddress >> 8) ;




Conexionado de la memoria con el arduino nano para memorias 24c01-24c02-24c04-24c08-24c16 .


Circuito montado.


Adaptando los modelos  SO8 Pin Connections


Programa en gambas.

El programa en gambas (VB para Linux) es sencillo, pero tiene un poco de todo, lee, graba,compara, guarda, restaura, y un pequeño editor.
Para evitar ciclos de escritura, conviene leer la memoria a programar, y cuando se graban datos en dicha memoria se compara el dato que hay en esa posición de memoria y el dato que va se va ha escribir, sin son el mismo no graba nada. Esto evita muchas grabaciones innecesarias y hace grabaciones rápidas. A esto llamo WriteComparación.

Para empezar el programa debemos seleccionar el puerto, normalmente /dev/ttyUSB0 , y pulsamos start . Si todo nos va bien nos saldrá EMPIEZA 24C 01/02 .
Insertada la memoria, leemos sus datos con el botón Read, se visualizaran automáticamente. Si queremos cambiar el modo de visualización seleccionamos DEc , Char,  Hex .
Si queremos editar algún dato, pulsamos sobre la pantalla de los datos y mediante los cursores seleccionamos la dirección que queramos modificar. Ahora introducimos el valor en la casilla de Valor y pulsamos Enter, automáticamente cambia el dato e incrementamos la posición de memoria.
Ahora podemos grabar los datos en memoria o guardarlos en un fichero.

Espero que le sirva a alguien este programa.
Mi intención es actualizar el programa para grabar todo tipo de memorias

Programa

Saludos.
Juan Galaz

martes, 21 de junio de 2016

Programación EEPROM 24c02 24c01 con Arduino y Gambas

Página principal

Programación EEPROM 24c02 24c01
con
Arduino y Gambas

xsetaseta@gmail.com

Las memorias 24Cxx son del tipo EEPROM (programadas eléctricamente) , antes había que borrarlas mediante luz ultravioleta, pero eso es el pasado, ahora en un chip de 8 patillas puedes tener hasta 8Mbytes.
Tengo bastantes memorias del tipo 24cxx procedentes del reciclado, y me voy hacer un programador mediante el arduino. Por uno de mis cajones tengo el programador TE20-SE que utilizo para alguna programación de los PIC , este programador dispone de zócalos para programar memorias 24Cxx, pero al ser la conexión del tipo serie no se puede utilizar en los ordenadores nuevos.
Este montaje de momento solo programará los 24c01 y 24c02 de 128bytes y 256 bytes, respectivamente.
Para modelos de memoria mayor de 256bytes  ,24c04 ,24c08 y 24c16 ,  se debe direccionar de otra forma, utilizando parte del Device code para la dirección de memoria. En otros modelos con mas memoria se mandan dos bytes para sacar la dirección de la memoria. Recomiendo leer las hojas de características  de los chip para entender su funcionamiento.

Memoria EEPROM.


Conexionado de la memoria con el arduino nano.


Circuito montado.


Programa en gambas.

El programa en gambas (VB para Linux) es sencillo, pero tiene un poco de todo, lee, graba,compara, guarda, restaura, y un pequeño editor.
Para evitar ciclos de escritura, conviene leer la memoria a programar, y cuando se graban datos en dicha memoria se compara el dato que hay en esa posición de memoria y el dato que va se va ha escribir, sin son el mismo no graba nada. Esto evita muchas grabaciones innecesarias y hace grabaciones rápidas. A esto llamo WriteComparación.

Para empezar el programa debemos seleccionar el puerto, normalmente /dev/ttyUSB0 , y pulsamos start . Si todo nos va bien nos saldrá EMPIEZA 24C 01/02 .
Insertada la memoria, leemos sus datos con el botón Read, se visualizaran automáticamente. Si queremos cambiar el modo de visualización seleccionamos DEc , Char,  Hex .
Si queremos editar algún dato, pulsamos sobre la pantalla de los datos y mediante los cursores seleccionamos la dirección que queramos modificar. Ahora introducimos el valor en la casilla de Valor y pulsamos Enter, automáticamente cambia el dato e incrementamos la posición de memoria.
Ahora podemos grabar los datos en memoria o guardarlos en un fichero.

Espero que le sirva a alguien este programa.
Mi intención es actualizar el programa para grabar todo tipo de memorias

Programa

Saludos.
Juan Galaz

miércoles, 15 de junio de 2016

Teclado para acceso con contraseña. Arduino nano

Página principal



Teclado para acceso con contraseña
Arduino nano

xsetaseta@gmail.com


En este montaje realizo un circuito de autorización mediante teclado, con una contraseña de 4 dígitos.
La realización está hecha con arduino nano debido a que tiene dos entradas mas A6 y A7 , aunque solo se utilice la entrada A6 en modo analógico debido a que no funciona como entrada digital.
Se debe teclear el código de 4 dígitos y pulsar la tecla # .
Si nos equivocamos pulsamos la tecla * ,  borramos todos los dígitos introducidos.
Si no pulsamos ninguna tecla antes de 10 segundos todos los dígitos tecleados se borran.
Si nos equivocamos al introducir el código, los 4 led parpadean.
Si hemos introducido el código correcto el led verde se enciende durante 1 segundo.





Para ahorrar 3 resistencia he hecho una pequeña trampa, colocar una resistencia para los 4 diodos.





PROGRAMA




Hubiese sido fácil hacer una rutina para poder cambiar la contraseña, pero eso lo dejo para que vosotros trabajéis un poco.


Saludos.
Juan Galaz



jueves, 9 de junio de 2016

wxMunicipios wxwidgets

09/06/2016 - wxMunicipios
Había realizado un programa para buscar los municipios, en primer lugar lo había realizado para Android, luego lo hice en Gambas (vb linux) , y como hacia tiempo que no había realizado nada en wxwidgets, y antes de que se me olvidase, me puse manos a la obra.
Lo que me satisface más, es el poder compilar para las dos plataformas, Linux o Windows, con solo cambiar la directiva YesWindows 0 por #define YesWindows 1 en el fichero define.h  .

Programas de linux y windows

Windows
 


















Linux

sábado, 4 de junio de 2016

ANDROID - Códigos postales de España - openRawResource(getResources().getIdentifier


Android

ANDROID
Códigos postales de España
getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));

Encontré una base de datos de códigos postales de España y era una buena ocasión de hacer una aplicación que buscara los códigos por provincias y calles o pueblos.
En este caso había realizado esta aplicación en gambas(VB linux), luego la he realizado para android.
Estos datos de CP(códigos postales) se colocan en el directorio /res/raw ,y solo son de lectura. Estos datos están organizados por capitales y provincias, y en algún que otro caso en ciudades grandes como Reus, Fuenlabrada, etc.
El fichero indice se llama codciuz.txt donde figuran nombres de capitales y provincias, y el nombre de fichero que corresponde a dicha capital o provincia.

280:MADRID
28X:MADRID
150:A CORUÑA
030:ALACANT/ALICANTE

Para el ejemplo de Madrid capital el fichero se llamará a280codpos.txt . El fichero original se llamaba 280codpos.txt  , pero en los recursos internos los ficheros no deben empezar por numero, no distingue entre mayúsculas y minúsculas , además la extensión no se utiliza, por lo que tuve que renombrar los ficheros.
En el fichero  están los datos postales ordenados de la siguiente forma:

28021:A (EL SALOBRAL)
28032:ABAD JUAN CATALAN
28013:ABADA
28012:ABADES
28039:ABADESA
28043:ABALOS
28037:ABANICO

En este fichero se recorre buscando concordancias con el nombre de la calle que se quiere buscar.



Recomiendo ver el anterior androj.html programa para entender este.
Lo diferente de este programa frente al anterior es el nombre de fichero de la provincia. En este caso no sabemos su nombre hasta que no nos lo proporcione la búsqueda por provincia, y esto lo solucionamos con la siguiente orden:
ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
Donde miProvincia es el nombre del fichero de recursos internos.
Utilizamos un buffer para aumentar la velocidad de acceso al fichero.
BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
Leemos línea por línea buscando concordancias con el nombre de calle.
while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }     
public void cuantosCX(String Lprovincia)
    {                 
        String miProvincia;
        Scalle=Mcalle.getText().toString();       
        Scalle=Scalle.toUpperCase();
        Mcalle.setText(Scalle); 
        miProvincia = Lprovincia.substring(0, Lprovincia.length()-4);
       
        try
        {
            if(ISentrada2 != null)    ISentrada2.close();       
            ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
            BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
           
            while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }       
           
            ISentrada2.close();
        }
        catch (IOException e)
        {
            Log.e("Provincias->",e.getMessage(),e);
        }       
       
    }


PROGRAMA

Saludos
Juan Galaz


Bibliografía:

http://www.seta43.hol.es/android.html
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013

viernes, 27 de mayo de 2016

Códigos postales de España programado en Gambas


Códigos postales de España
Gambas


xsetaseta@gmail.com


Encontré un fichero con los códigos postales de España y me puse manos a la obra para hacer un programa que buscara códigos postales.
Se realiza en gambas, una especie de Visual Basic para linux.
Debido a que tiene varios ficheros clasificados por provincias, y que no me quería complicarme mucho, no he utilizado SQLite, he utilizado la lectura secuencial, algo lenta, pero para los ordenadores de ahora es bastante rápida.
Espero que si se encuentra errores me los digáis.




Programa

Saludos.
Juan Galaz

miércoles, 25 de mayo de 2016

Municipios de España - Gambas

Página principal



Municipios de España
Gambas

xsetaseta@gmail.com


Había realizado una aplicación para android que buscaba municipios de España androj.html.
En gambas debía ser también sencillo  de hacer, y me puse manos a la obra.



Programa

Saludos.
Juan Galaz


lunes, 23 de mayo de 2016

Arduino - lector de RFID RC522


Arduino

RFID RC522


En este montaje realizamos un lector de tarjetas RFID RC522  - ISO/IEC 14443 Type A 13.56 MHz.
Basado en el chip  Philips/NXP MFRC522 RFID chip (Chip Datasheet) .
El módulo montado se puede comprar por menos de 3 € , y 10 tarjetas por menos de 2€ .

Tarjetas RFID.

Módulo.


Esquema.


Circuito montado.

Para realizar este montaje estuve viendo varias páginas donde explicaban diferentes modos de leer tarjetas RFID.
La mas completa es https://github.com/miguelbalboa/rfid  con una librería muy completa. Al principio no me funcionaba con arduino 1.05 daba errores al compilar, pero después de instalar la última versión 1.69 me funcionó.
Otra página  no utilizaba ningún tipo de librería https://labitat.dk/wiki/RFID_RC522-AN, funcionaba con cualquier versión de arduino.
La utilizada se encuentra en http://geekchickens.blogspot.com.es/, es una librería sencilla RFID, dos ficheros que se copian en un directorio que se llama RFID en el directorio de librerias  (libraries).
/* SETA43 http://www.seta43.hol.es/ http://seta43.blogspot.com.es/ */ /* basado en  GeekChickens //http://geekchickens.blogspot.com.es/ /* SDA es el pin 10 SCK es el pin 13 MOSI es el pin 11 MISO es el pin 12 RST es el pin 9 */
#include <SPI.h> #include <RFID.h>
 
#define SS_PIN 10 #define RST_PIN 9
#define DEBUG 0
 
RFID rfid(SS_PIN, RST_PIN);
 
int numero_serie[5]; unsigned char  usuariosON[10][5]={ 151,44,65,197,63,
                                   214,191,212,72,245,
                                   206,12,97,113,210,
                                   78,179,151,113,27,
                                   190,187,151,113,227, } ;
const int ledPinOK =  2; const int ledPinERROR =  3;    // Sound
void setup() {
  Serial.begin(9600);
  SPI.begin();
  pinMode(ledPinOK, OUTPUT);
  pinMode(ledPinERROR, OUTPUT);
  rfid.init();
  Serial.println("Inicia ");
#if DEBUG
  for(int z=0; z<5 ; z++)
   {
      Serial.print("Usuario "); Serial.print(z);Serial.print("-> ");
      for(int i=0; i<=4 ; i++)
                {
                  Serial.print(usuariosON[z][i]);
                  Serial.print(",");
                }
      Serial.println(" ");
   }
#endif  
   digitalWrite(ledPinOK, LOW);
   digitalWrite(ledPinERROR, LOW);
}
 
void loop() {
  int i,z;
 
    if (rfid.isCard())
    {
           if (rfid.readCardSerial())
            {
                Serial.print("Numero usuario: "); // guardamos el numero del usuario
                for(int i=0; i<=4 ; i++)
                {
                  numero_serie[i] = rfid.serNum[i];
                }

                for(i=0; i<=4 ; i++) // y lo imprimimos
                {
                  Serial.print(numero_serie[i]);
                  Serial.print(",");
                }               
               
                if(-1==detectarUsuario())
                {
                   //Error Usuario
                   for(z=1; z<12 ; z++)
                     if(z&1)
                       {
                        for(i=0; i<200 ; i++)  {digitalWrite(ledPinERROR, i&1); delay(1);}
                       }
                       else
                       {
                        delay(200);
                       }                          
                }
                else
                {
                 //Ok usuario
                  digitalWrite(ledPinOK, HIGH);
                  for(i=0; i<100 ; i++)  {digitalWrite(ledPinERROR, i&1); delay(3);}                 
                }
            
                delay(1000);
                digitalWrite(ledPinOK, LOW);
                digitalWrite(ledPinERROR, LOW);
             }
    }
    rfid.halt();
}
unsigned int detectarUsuario() {
 char f1;
 int z,i;
 Serial.println();
 Serial.println("Chequeando usuario");
  for(z=0; z<5 ; z++)
   {
     f1=0;
      for(i=0; i<=4 ; i++)
                {                 
                  if(usuariosON[z][i]==numero_serie[i]) f1++;
                }
      if(f1==5)
        {
          Serial.print("OK-Usuario ");
          Serial.println(z);
          return(z);
        }      
   }
  Serial.println("Error Usuario ");
  return(-1);

}

Existen un numero de tarjetas prefijadas en que pueden activar el pin 2 , para abrir una puerta o lo que se quiera.
Estas tarjetas se encuentran memorizada en la variable:
unsigned char  usuariosON[10][5]={ 151,44,65,197,63,
                                   214,191,212,72,245,
                                   206,12,97,113,210,
                                   78,179,151,113,27,
                                   190,187,151,113,227, } ;
Cualquier tarjeta que no este en la variable usuariosON activara el pin 3 y sonará un pitido de alarma durante unos segundos.
El programa es sencillo, sin muchas complicaciones, es simplemente una aproximación a la tarjetas RFID.
Si quisiéramos hacer una llave mas segura, deberíamos poner un teclado que nos pida una clave secreta asignada a dicha tarjeta.



PROGRAMAS


Saludos.
Juan Galaz

Bibliografía:
https://labitat.dk/wiki/RFID_RC522-AN
https://sites.google.com/a/mail.utec.edu.sv/arduino-seguridad-con-tecnologia-rfid/home
http://geekchickens.blogspot.com.es/search/label/RFID
https://github.com/miguelbalboa/rfid
https://es.wikipedia.org/wiki/RFID

jueves, 19 de mayo de 2016

ANDROID - Municipios de España - openRawResource


Android

ANDROID
Municipios de España
openRawResource

En esta aplicación para android realizo una especie de base de datos que busca los municipios de España.
No estoy muy orgulloso de esta aplicación pero hace su función de enseñar como se utiliza datos insertados en la propia aplicación.
Estos datos de municipios se colocan en el directorio /res/raw ,y solo son de lectura. El fichero con la base de datos de municipios se llama municipios0.txt , debemos tener en cuenta que a la hora de utilizar los recursos internos, la extensión no se utiliza.
La base de datos la he pasado a mayúsculas y quitado los acentos. Lo he hecho debido a que la búsqueda es secuencial y lenta, además de que normalmente en los dispositivos android es lento añadir acentos y cambiar de minúsculas a mayúsculas.

Vamos a intentar explicar  este pequeño trozo de código de la función Fbuscar.
Lo primero es coger el texto del municipio a buscar y cambiarlo a mayúsculas .
  miclave=Mclave.getText().toString();       
  miclave=miclave.toUpperCase();
  Mclave.setText(miclave);  
Utilizamos try para manejar los error de abrir ficheros.
Abrimos el fichero y utilizamos un buffer para aumentar la velocidad de acceso al fichero.
  ISentrada=getResources().openRawResource(R.raw.municipios0);
   BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
Leemos una por una todas las líneas del fichero.
Troceamos cada línea separando por el carácter ":" .
Si la segunda cadena que ha salido del troceo contiene la cadena a buscar miclave , se para la busqueda y se muestra.
    while ((Sentrada=BFentrada.readLine()) != null)
      {
      String SentradaT[]= Sentrada.split(":");
      if(SentradaT[2].contains(miclave)) {Mostrar(); break;}
      }
public void Fbuscar(View view)
    {        
        miclave=Mclave.getText().toString();       
        miclave=miclave.toUpperCase();
        Mclave.setText(miclave);     
        Contar();    
       
        try
        {
            if(ISentrada != null)    ISentrada.close();
            ISentrada=getResources().openRawResource(R.raw.municipios0);
            BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
           
            while ((Sentrada=BFentrada.readLine()) != null)
            {
            String SentradaT[]= Sentrada.split(":");
            if(SentradaT[2].contains(miclave))         {Mostrar(); break;}
            }
           
        }
        catch (IOException e)
        {
            Log.e("Municipios->",e.getMessage(),e);
        }       
    }


Me hubiera gustado no tener que abrir y cerrar el fichero para volver a la posición inicial, pero no he encontrado la función seek(0) para recursos internos, no se si existe o no. Esto hace al programa poco eficiente, pero funciona bien :( .


PROGRAMA

Saludos
Juan Galaz


Bibliografía:
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013


viernes, 13 de mayo de 2016

ANDROID - Cálculo bobinas núcleo de aire


Android

ANDROID
Cálculo bobinas núcleo de aire

En esta aplicación para android voy ha realizar el cálculo en micro henrios para una bobina con núcleo de aire.
Para el cálculo he empleado la formula que viene en el libro.

Handbook of electronics calculations for engineers and technicians
Milton Kaufman, Arthur H. Seidman


He visto otras formulas que se parecen, pero hay veces que mezclan el radio con el diámetro, por lo que me he decidido por esta.
Las  dimensiones deben estar en cm.

Hace años había realizado un programa en basic que luego trasladé a C para el cálculo de bobinas.


Como se ve en el nuevo, todo es mas interactivo y bonito.

Para este programa he empleado 4 SeekBar para cambiar los valores. Para cada cambio de valor se ejecuta la función de calculo() .
MBarraL = (SeekBar)findViewById(R.id.ABarraL);
MTextoL = (TextView)findViewById(R.id.A_Tlongitud);



MBarraL.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
        {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
            {
                longitud=progress+1;
                MTextoL.setText(longitud +" mm  Longitud");
                calculo();
            }
           

            @Override
            public void onStartTrackingTouch(SeekBar seekBar)                      {            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar)                      {            }           
        });


PROGRAMA

Saludos
Juan Galaz


Bibliografía:
https://danielme.com/tip-android-13-el-widget-seekbar/
http://www.jtech.ua.es/dadm/2011-2012/restringido/android/sesion03-apuntes.html

miércoles, 11 de mayo de 2016

ANDROID- WebView, Visión de páginas desde android


Android

ANDROID
WebView
Visión de páginas desde android

El poder ver páginas web, ya sean de tipo local o de internet, desde una aplicación de android permite dar mucho juego.
Mediante la utilización de WebView es muy fácil, pero muy vistoso.
activity_setaw_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <WebView
        android:id="@+id/Aweb"
        android:layout_width="317dp"
        android:layout_height="322dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>

SetawMainActivity.java
Vemos la dirección que se ve al abrir la aplicación.
package com.example.appweb;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class SetawMainActivity extends Activity {

    private WebView MWeb;
   
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setaw_main);
       
        MWeb=(WebView)findViewById(R.id.Aweb);
        MWeb.loadUrl("http://www.seta43.hol.es/androhx.html");    
    }      
}

AndroidManifest.xml
Debemos cambiar los permisos para acceder a internet.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.appweb"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".SetawMainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Visión del programa en un dispositivo físico.


Saludos
Juan Galaz


Bibliografía:
https://amatellanes.wordpress.com/2013/06/01/android-ejemplo-de-webview-en-android-parte-1/

jueves, 5 de mayo de 2016

ANDROID - ARDUINO - Programación JAVA - MAX7219 - Bluetooth - HC05 Conexión serie.


Android

ANDROID - ARDUINO
Anunciador con matriz de led controlado por android
Programación JAVA
MAX7219
Bluetooth  HC05
Conexión serie

En un montaje de electrónica, había realizado un marcador con el chip MAX7219. En este montaje el control lo había hecho utilizado un interprete de basic  en su modo trial  BASIC4Android. Me quedó las ganas de realizarlo en java, pero no había programado nunca en java. Ahora que tengo un poco de idea lo he realizado, quitándome la espina.
He de decir que ha sido difícil la programación, buscando por aquí y por allí encontré algún que otro ejemplo que me ayudo bastante. He de decir que al estar muy extendido android, existen infinidad de páginas y tutoriales que te ayuda a la programación.
El programa hace uso del bluetooth para manda los textos que se representan en la matriz de led. Utiliza la comunicación serie para transmitir la información, en el otro lado se encuentra el módulo HC05 que es un convertidor de bluetooth a serie.
En el terminal android debemos tener activado el bluetooth y emparejados los dispositivos.
Escribimos lo que queramos y lo mandamos a la matriz de caracteres.

Mediante eclipse diseñamos el interface gráfico.


activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText
        android:id="@+id/Aentrada"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="22dp"
        android:ems="10"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:inputType="text"
        android:text="@string/entrada"
        android:textSize="@dimen/abc_action_bar_subtitle_text_size" />

    <EditText
        android:id="@+id/Asalida"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/Aentrada"
        android:layout_below="@+id/Aentrada"
        android:layout_marginTop="26dp"
        android:ems="10"
        android:inputType="text"
        android:text="@string/salida"
        android:textSize="@dimen/abc_action_bar_title_text_size" >

    </EditText>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/Asalida"
        android:layout_marginTop="60dp"
        android:gravity="center" >

        <Button
            android:id="@+id/Aboton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend1"
            android:text="@string/boton1" />

        <Button
            android:id="@+id/Aboton2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend2"
            android:text="@string/boton2" />

        <Button
            android:id="@+id/Aboton3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="FunSend3"
            android:text="@string/boton3" />
    </LinearLayout>

    <Button
         android:id="@+id/Asalir"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="34dp"
        android:onClick="FunSalir"
        android:text="@string/salir" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/Aentrada"
        android:layout_alignParentTop="true"
        android:text="@string/hello_world" />

</RelativeLayout>

También hay que modificar el ficheros AndroidManifest.xml para poder utilizar el bluetooth.
Además impedimos que rote la pantalla.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.seta43blue"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />


    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>



La totalidad de los fichero los he comprimido y los he colocado en el enlace que se ve al final de página.
El programa en java es largo y solo explicare algún trozo.
El programa empieza con la función onCreate donde se mira si el dispositivo android tiene bluetooth, y si lo tiene activado.
Después lanzamos una función FunConectar2 donde se realiza la conexión al dispositivo.
 protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        Wentrada=(EditText)findViewById(R.id.Aentrada);
        Wsalida=(EditText)findViewById(R.id.Asalida);  
        Miblue = BluetoothAdapter.getDefaultAdapter();
                 
        if (Miblue == null)
        {
              AlertDialog.Builder dialog = new AlertDialog.Builder(this);
              dialog.setMessage("Sin soporte bluetooth");
              dialog.setCancelable(false);
              dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
                  {
                  public void onClick(DialogInterface dialog, int which)   { finish(); }                                            
                });
                dialog.show();
        }
       
        if (!Miblue.isEnabled())
        {
              AlertDialog.Builder dialog = new AlertDialog.Builder(this);
              dialog.setMessage("Activar bluetooth");
              dialog.setCancelable(false);
              dialog.setPositiveButton("OK", new DialogInterface.OnClickListener()
                  {
                  public void onClick(DialogInterface dialog, int which)   { finish(); }                                            
                });
                dialog.show();
        }
       
        AlertDialog.Builder dialog0 = new AlertDialog.Builder(this);
        dialog0.setMessage("Programa para conectar android y arduino.\nManda frases a la matriz de led.\nSETA43");
        dialog0.setCancelable(false);
        dialog0.setPositiveButton("OK", new DialogInterface.OnClickListener()
              {
              public void onClick(DialogInterface dialog, int which)   { FunConectar2(); }                                            
            });
        dialog0.show();
              
    }
La función FunConectar2 es la que realiza la conexión al dispositivo ya emparejado.
Crea un lista de dispositivos emparejados.
ArrayList <String> list = new ArrayList<String>();

Prueba a crear un createBluetoothSocket al dispositivo emparejado. Esto me creó una confusión debido a que no daba error aunque no existiese ese dispositivo, pero lo que creo que comprueba si dispone de conexión serie.
btSocket = createBluetoothSocket(device);

Prueba a crear un  btSocket.connect();  ,y si se se puede indica en pantalla ok->dirección desl dispositivo.
btSocket.connect();
Log.d(TAG, "....Conexion ok...");
Wentrada.setText("ok->" + address);

Para terminar creamos una clase donde se realiza la escritura y la lectura desde el bluetooth. ConnectedThread.
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();                          

La clase ConnectedThread tiene varias funciones: la própia de creación ConnectedThread  que se inicia con start, la run que no la usamos para nuestro ejemplo, y la write utilizada para mandar la cadena.
 private class ConnectedThread extends Thread
     {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
 
        public ConnectedThread(BluetoothSocket socket)
         {
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
            try
                {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
                }
            catch (IOException e) { }
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
         }
 
        public void run() {
           byte[] buffer = new byte[256]; 
           int bytes; 
            // Keep listening to the InputStream until an exception occurs
            while (true)
             {
                try {
                         bytes = mmInStream.read(buffer);
                         bytes=bytes+1; //No sirve para nada es para quitar aviso
                    //h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
                    }
                catch (IOException e) { break; }
             }
        }
 
        /* Call this from the main activity to send data to the remote device */
        public void write(String message) {
            Log.d(TAG, "...Data to send: " + message + "...");
            byte[] msgBuffer = message.getBytes();
            try
                {  mmOutStream.write(msgBuffer);  }
            catch (IOException e)
                {  Log.d(TAG, "...Error data send: " + e.getMessage() + "...");  }
        }

    }

Para termina creamos las funciones que mandan la cadena mediante la pulsación de los botones.
public void FunSend1(View view)
    {
        mConnectedThread.write(Wsalida.getText()+ "        " + "\n");
    }
public void FunSend2(View view)
    {
        mConnectedThread.write("/" + Wsalida.getText() + "\n");
    }  
public void FunSend3(View view)
    { 
        mConnectedThread.write("&"+ Wsalida.getText() + "\n");       
    }  

Perdonar si no explico muy bien los programa, estoy aprendiendo java y android.

Captura de pantalla del dispositivo físico.


PROGRAMA


Notas
Para depurar los programas  utilizamos la consola de eclipse.
  private static final String TAG = "bluetooth2";
 
Log.d(TAG, "...Conectando...");

Con el comando Log.d(TAG, "...Conectando..."); mandamos la cadena bluetooth2  ...Conectando...   a la consola android.
Para poder filtra todos los mensaje, que son muchos, configuramos de la siguiente forma:

Observamos  en la pantalla LogCat todos los mensajes que lleven la cadena bluetooth2.

Saludos
Juan Galaz


Bibliografía:
http://code.tutsplus.com/es/tutorials/create-a-bluetooth-scanner-with-androids-bluetooth-api--cms-24084
http://developer.android.com/intl/es/guide/topics/connectivity/bluetooth.html
http://www.tutorialspoint.com/android/android_bluetooth.htm
http://solderer.tv/data-transfer-between-android-and-arduino-via-bluetooth/
http://www.intorobotics.com/how-to-develop-simple-bluetooth-android-application-to-control-a-robot-remote/
http://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/
https://examples.javacodegeeks.com/category/android/core/bluetooth/