domingo, 24 de diciembre de 2017

Wifi no funciona en dispositivos USB en DEBIAN 9

Wifi no funciona en dispositivos USB en DEBIAN 9


Llevo usando Debian durante muchos años, y el otro día después de instalar Debian 9.3 no funcionaban los adaptadores externos de USB Wifi.
El caso que se podían ver todas los puntos de acceso ( las redes de alrededor) , pero cuando das para conectar e introducir la contraseña nunca llega a conectar.
Como había instalado antes las versiones 9.0  - 9.1 y 9.2 y las tenía aún en particiones, probé si se conectaba, y nada.
También por si las moscas probé en Debian 8 , y se conectaba perfectamente.
Tengo una colección de adaptadores wifi, y en todos pasa lo mismo, por lo cual es un error del propio Debian 9.
Como curiosidad, en ordenadores que tienen el adaptador wifi integrado (portátiles),  se conecta perfectamente. Pero si a ese mismo ordenador pinchas el adaptador wifi USB, para probarlo no se conecta con el adaptador pinchado.

Mirando por internet encontré la solución:

Añadir en /etc/NetworkManager/NetworkManager.conf 
 
[device]
wifi.scan-rand-mac-address=no


Hago reiniciar las redes con:

/etc/init.d/network-manager restart
/etc/init.d/networking restart

Ahora funciona, ya puedo probar todos mis adaptadores USB-WIFI

Saludos
JUAN

miércoles, 13 de diciembre de 2017

Coche teledirigido con fpv - nRF24L01 - L293D - Arduino

Página principal


Coche teledirigido con fpv 
nRF24L01
L293D
Arduino

xsetaseta@gmail.com

En este montaje sustituyo los relés del anterior montaje por el CI L293D. De la misma forma que comente en el anterior montaje, este montaje es una continuación del montaje  autofel.html , en el cual manejaba el dispositivo mediante un móvil android.
El utilizar un nRF24L01 proporciona la posibilidad de utilizar el módulo con mas potencia, llegando a poder controlarlo a mas de 700m en visión directa.
Añado además dos resistencia variable para regular la velocidad y la dirección.



Esquema del emisor. (Realizado con https://easyeda.com/ )


Esquema del receptor. (Realizado con https://easyeda.com/ )


Circuito emisor montado.
Si queremos ampliar el radio de acción deberíamos emplear el módulo con antena.




Circuito receptor montado.
Podemos observar la doble alimentación del receptor.
Esto es debido a la multitud de interferencias que genera el circuito de los motores en el circuito receptor.
Se podría haber evitado la doble alimentación mediante un circuito regulador y varios filtros, pero como este circuito es un prototipo lo he dejado así.


Detalle del L293D.

El utilizar el L293D como regulador de velocidad de motores mediante el cambio de ancho de pulso, no es un modo demasiado preciso en este tipo de motores.
Para regular la velocidad hubiese sido mejor emplear MOSFET , pero este circuito es un prototipo y no he querido complicarlo mas.


PROGRAMA


Como curiosidad, he realizado los esquemas mediante la página web https://easyeda.com/ . Es curioso como se puede crear esquemas eléctricos mediante el navegador, además tiene bastantes componentes. Les recomiendo probar esta excelente página web.
Espero que le guste a alguien este montaje, o que pueda proporcionar ideas.

Saludos.
Juan Galaz


Bibliografía:

Mando a distancia de 4 reles (relay)
Arduino-Android-Bluetooth-hc05-Manejando un coche-mediante nRF24
Coche teledirigido

martes, 28 de noviembre de 2017

Coche teledirigido con fpv - nRF24L01 - Arduino

Página principal



Coche teledirigido con fpv 
nRF24L01
Arduino

xsetaseta@gmail.com

En este montaje mezclo varios montajes anteriores, Mando a distancia de 4 reles (relay)Arduino-Android-Bluetooth-hc05-Manejando un coche-mediante nRF24 .
Además he incorporado un móvil android a modo de fpv, utilizando la aplicación  .IP Webcam ( Pavel Khlebovich ).
Con todo lo anterior conseguimos un coche con mando a distancia que además podemos ver en fpv en nuestro navegador.
Para el control de los motores utilizamos relés. Tienen pros y contras, la mayor ventaja es poder controlar motores de hasta 220V, y el aislamiento eléctrico. Las contras son varias, la principal es el desgaste del propio relé al utilizarlo muchas veces, además de no poder controlar la velocidad de los motores.


Emisor.


Montaje del emisor




Montaje del receptor



Conexionado de los motores.


Conjunto montado.


Como no tengo ninguna cámara para hacer fpv, una forma fácil de hacer fpv es utilizar un móvil a modo de cámara y ver la imagen en el ordenador.
Existen bastantes programas para transformar un móvil en una webcam IP , el que me ha funcionado mejor es .IP Webcam ( Pavel Khlebovich ).
Tiene bastantes opciones que se pueden configurar, además hasta puede tomar fotos y videos. Existe tambien la versión de pago, pero para lo que hemos hecho nos sirve la versión gratuita.

Visión de la cámara IP.




VIDEO DE FUNCIONAMIENTO

Programa

Como el nRF24  funciona a 2.4GHz y la red Wifi también funciona a esa frecuencia, puede ocurrir que esporádicamente  se puede perder el control.
Ante este problema y para evitar posibles accidente, el coche se queda parado si no recibe señal después de 100mS desde la última orden.
Como se puede ver en la imagen utilizo doble fuente de alimentación, para el arduino y para los motores. Se puede usar una sola, cada uno que pruebe.

Como se puede ver en las imágenes  existen dos diodos, y alguno dirá para que sirven.
El nRF24 puede llegar a consumir hasta 28mA, está dentro del rango que proporciona el arduino en el ping 3.3V, pero si colocamos un nRF24 con antena que proporciona mas alcance, el consumo aumenta y puede provocar el mal funcionamiento del montaje.
Existen dos opciones, utilizar un alimentador externo de 3.3V, o emplear un viejo truco de electrónicos, el utilizar la caída de tensión (0.7V) de los diodos de silicio. He empleado dos diodos en serie que producen una caída de tensión de 1,4V que restados a los 5V del arduino nos proporciona una tensión de 3.6V con la que podemos alimentar el módulo. Normalmente este tipo de módulos tiene una cierta tolerancia en cuanto a la alimentación, el que no se quiera arriesgar que utilice otro diodo en serie, bajando de esta forma la alimentación a 2.9V. He colocado un condensador en los 3.6V para aplanar la alimentación.
Recordar que debéis colocar un condensador de 16uF o mas en el nRF24, en muchos módulos falla por ese motivo.

El circuito emisor se puede alimentar a baterías de 3.6V. Entonces  debéis alimentar directamente el módulo nRF24 a los 3.6V.
El módulo nRF24 funciona con tensiones entre 2V y 3.6V.

Espero que le guste a alguien este montaje, o que pueda proporcionar ideas.

Saludos.
Juan Galaz


Bibliografía:

Mando a distancia de 4 reles (relay)
Arduino-Android-Bluetooth-hc05-Manejando un coche-mediante nRF24


jueves, 9 de noviembre de 2017

Creador de programas para Arduino con interface gráfica hecha con Gambas

Página principal


Creador de programas
para
Arduino
con interface gráfica hecha
con
 Gambas

xsetaseta@gmail.com


En un anterior artículo había descubierto Visualino , una curiosa aplicación para hacer programas de arduino en forma gráfica. En este artículo había realizado un semáforo, y la verdad me gusto hacerlo de esta manera, gráficamente.
Picado por la curiosidad, y preguntándome si yo podía hacer este tipo de programa, me puse manos a la obra.
En un principio pensé hacerlo en C, pero como tenía Gambas una especie de VB para Linux elegí la forma fácil, realizarlo en el Basic de Gambas.
Se realizo mediante Gambas 3.5.4  bajo Debian 8 ,no he probado si funciona en otras versiones.
Fueron días y días de pruebas, de creación de bloques enlazados. Tuve que rehacer completamente el programa por problemas de diseño.
Como conclusión puedo decir que me quedó un programa digno, sin mas ambiciones.
Se podría haber añadido muchas mas funciones y librerías, pero lo he dejado en las funciones básicas.
Si queremos añadir alguna orden mas, podemos emplear el texto literal, que nos dará la posibilidad de hacer lo que queramos.
Como prueba práctica he realizado un semáforo, se puede ver el vídeo de su creación.
Espero que le guste a alguien y que le de ideas para hacer otros programas.
Mi idea es realizar el programa en C con las librerías wxwidgets , pero ahora tengo que recuperarme de este complicado programa.
El programa está limitado a 100 bloques, por lo que se puede quedar un poco corto para algunos programas. El que quiera puede aumentarlo todo lo que quiera cambiando las líneas de FMain.class  donde figuran la creación del numero de bloques:
Public Const MaxBloque As Integer = 99
Public Braiz[100] As Integer
.........
No arrastrar mas de un bloque sobre otro, aún no está implementado y produce errores.


Interface gráfico


Comandos posibles




VIDEO


 En el fichero del programa se encuentra el fichero fuente, la versión binaria ejecutable, y el paquete DEB por si quieres instalarlo.
Programa


Saludos.
Juan Galaz

lunes, 2 de octubre de 2017

Reloj con Arduino y el chip CT1642

Página principal



Arduino
CT1642
Reloj

xsetaseta@gmail.com

De vez en cuando me gusta desmontar aparatos electrónicos para reciclar.
En el interior de un TDT estropeado encontré la placa con display junto con los botones controlados por un CT1642.
Manos a la obra me puse a buscar información de CT1642, había muy poca, y además estaba en chino.
Por ahora el aprender chino no está en mis aficiones, por lo que traduje con el Google.
Donde encontré la verdadera ayuda fue en https://github.com/arkroan/CT1642, una librería para arduino.
En esta librería además de tener ejemplos, también dispone de documentación y fotos. Como ocupaba 15M por las fotos y los pdf, la he rebajado quedando en 10K, que es el tamaño de la librería en si. CT16lib.zip
Este chip no mantiene los display automáticamente, se los tienes que refrescar tu en el programa arduino. No es un buen chip, yo lo remplazaría por TM1638 que lo hace todo y fácil, pero bueno es lo que toca con el chip CT1642.
En  este montaje he realizado un reloj, donde la base de tiempos la tomo de las interrupciones. No es muy exacta pero para la práctica vale. El que quiera el tiempo exacto se podría emplear el chip DS1302.

1-8 Q2-Q9 segmento de salida, P-ch abierto de drenaje, a continuación, el ánodo del tubo digital, tire hacia abajo 50k de resistencia.
9-12 C1-C4 bits de salida, N-ch abierto de drenaje, a continuación, el cátodo digital del tubo, la máxima corriente de 400mA, pull up 50k resistencia.
13 CLK borde ascendente para escribir datos, built-in 10k pull-up resistor.
14 Señal de datos DATA, escrita en el registro IC, resistor pull-up incorporado de 10k.
15 VDD conectado a la fuente de alimentación del sistema 3.3V o 5.0V.
16 GND


Como vemos entran los datos por el pin DATA sincronizados con la señal CLK.
Cuando se producen dos estados 0 de DATA, en el mismo ciclo de reloj en estado 1, se activan los datos al display.


En la placa del TDT la conexión suele ser esta, puede variar, debéis comprobarlo.


Montaje eléctrico.

Conexiones del arduino
CLOCK_PIN     pin 6  arduino
DATA_PIN      pin 7  arduino
KEY_PIN  -> 330 ohmios -> pin 3  arduino

Como suelo ser precavido, yo coloco un resistencia de 330 ohmios entre KEY_PIN y el pin 3 del arduino .

Este montaje es simple y sencillo de unas 3 horas .

PROGRAMA

Saludos.
JUAN GALAZ


Bibliografía:
https://github.com/arkroan/CT1642
http://seta43.duckdns.org/artime.html

sábado, 30 de septiembre de 2017

Realizar un semáforo con arduino gráficamente con Visualino

Página principal



Arduino
Visualino
Semáforo

xsetaseta@gmail.com

Visualino es una curiosa aplicación para hacer programas de arduino en forma gráfica. Es un programa creado por  Victor R. Ruiz.
http://www.visualino.net/
Después de haber probado Visualino para hacer una luz parpadeante, sentí la necesidad de hacer algo mas complejo.
Me propuse realizar un semáforo sencillo en el tiempo mas rápido posible (menos de 30 minutos).
Lo primero que debe hacer un programador es coger un lápiz y un papel y realizar un organigrama.
En este organigrama se planteará la estructura del programa con sus variables.
Todos sabemos que cuando nos sentamos al ordenador aparecen cosa que no habíamos previsto, pero os aseguro que facilita y ahora muchos minutos de teclear si hemos hecho un planteamiento antes.
No os enseño mi organigrama debido que es algo muy personal que normalmente solo entiende el que lo realizó, además contiene muchos tachones.

Esquema.


Montaje eléctrico.





/***   Global variables   ***/
int VERDE=1;
int VERDEP=2;
int AMARILLO=2;
int ROJO=3;
int z=0;
int PARPADEO=300;

/***   Function declaration   ***/
void Semaforo (int color);
void Peaton (int color);

void setup()
{
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  Peaton(ROJO);

}

void loop()
{
    Semaforo(AMARILLO);
    delay(5000);
    Semaforo(ROJO);
    delay(1000);
    Peaton(VERDE);
    delay(10000);
    Peaton(VERDEP);
    Peaton(ROJO);
    delay(1000);
    Semaforo(VERDE);
    delay(20000);

}

/***   Function definition   ***/
void Semaforo (int color) {
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  if (color == 1) {
    digitalWrite(2,HIGH);
   }
  if (color == 2) {
    digitalWrite(3,HIGH);
   }
  if (color == 3) {
    digitalWrite(4,HIGH);
   }
 }
void Peaton (int color) {
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  if (color == 1) {
    digitalWrite(5,HIGH);
   }
  if (color == 3) {
    digitalWrite(6,HIGH);
   }
  if (color == 2) {
    for (z = 0; z <= 10; z++) {
      digitalWrite(5,HIGH);
      delay(PARPADEO);
      digitalWrite(5,LOW);
      delay(PARPADEO);
    }
   }
 }

Nota: Después de realizar el programa gráficamente con Visualino, lo realice  manualmente.
Está claro que al programarlo manualmente lo optimizas mucho mejor, empleando #define conseguí reducir su tamaño.
Visualino no es programa perfecto, le faltan muchas cosas, pero personalmente me gusta bastante.
Gracias Victor R. Ruiz


Saludos.
JUAN GALAZ

Enlaces:
http://www.visualino.net/
http://seta43.blogspot.com.es/2017/09/visualino.html

jueves, 28 de septiembre de 2017

Arduino TM1638 Medidor de Condensadores - Capacímetro - Capacimeter

Página principal


Arduino
TM1638
Medidor de Condensadores
Capacímetro -
Capacimeter

xsetaseta@gmail.com


En este montaje vamos a realizar un medidor de condensadores.
Como cualquier aparato de medida la precisión debe ser alta, y  este no es el caso, el error puede ser de hasta un 8%.
Hace unos años había realizado un medidor de capacidad utilizando un microcontrolador PIC. Este medidor funcionaba perfectamente, y empleaba la circuteria interna del propio PIC.
Para este montaje  he utilizado el arduino, haciendo mucho mas simple el circuito, aunque no tan preciso.
El circuito consiste en la carga de un condensador a través de una resistencia, midiendo el tiempo que tarda en llegar a un valor de tensión.
La tensión de carga la proporciona una puerta de salida del arduino, que proporciona alrededor de 4.60V.
La resistencia es elegida por la escala:
Escala 1 - 1 K ohmio        C>1µF
Escala 2 - 100K ohmio       C>1nF
Escala 4 - 1M ohmio         C>12pF


En la imagen  se puede observar como se carga un condensador de 330 nF a través de una resistencia de 100K.
Como todos bien sabemos la carga de un condensador es logarítmica, pero si tomamos la primera parte de la carga del condensador, podemos observar que es casi lineal.
El cambio de estado de una puerta de entrada del arduino a una tensión de alimentación de 5V suele ser de 2.32V . Esta tensión de cambio de estado puede cambiar en el  tipo de fabricación del Chip. El montaje se realizó con un arduino nano que utiliza el ATMEGA328P-AU .
En el programa existen varias constantes que se utilizan para tarar las distintas escalas.
//Configuraciones de retardo
#define TESCALA1  42
#define TESCALA2  65
#define TESCALA4  63

De la misma forma, el propio sistema tiene una capacidad intrínseca que hay que corregir en el montaje
// Capacidad propia del sistema
#define CZERO  27

Hubiese sido fácil hacer el montaje de autorrango y con botón de auto-tara, pero eso se lo dejo a otro. ;)


Carga del condensador de 330nF a través de una resistencia de 100K.



Nomenclatura de condensadores


Esquema de conexión.



Montaje del circuito



PROGRAMA

NOTA:
He estado midiendo bastantes condensadores en un buen polímetro que tengo y los he comparado con el montaje, las diferencias no llegan nunca a un 8% .
De todas formas, es curioso ver la diferencia entre el valor marcado  en el condensador y el valor real. Esta diferencia es muy grande con condensadores antiguos, ya se sabía, algún tipo de material dieléctrico se deteriora con el paso del tiempo, sobre todo en los condensadores electrolíticos.
En un capacitor además de la corriente de carga  existe otra corriente llamada corriente de fuga, debido a imperfecciones en el dieléctrico que no es un aislante perfecto. Esta corriente de fuga es muy apreciable en los condensadores electrolíticos viejos. En algunos condensadores que tenía antiguos, debido a que la corriente de fuga era tan grande,  no los he podido medir.

Saludos.
JUAN GALAZ

http://seta43.duckdns.org/frecap.html

martes, 19 de septiembre de 2017

Óhmetro , medidor de resistencias con arduino

Página principal


Arduino
TM1638
Medidor de Resistencias


xsetaseta@gmail.com


En este montaje vamos a realizar un medidor de resistencias.
Como cualquier aparato de medida la precisión debe ser alta, y  este no es el caso, el error puede ser de hasta un 5%.
La idea es colocar una resistencia de referencia con valor conocido, y colocarla en serie con la resistencia a medir. Se conecta un voltaje entre las dos resistencia puestas en serie,  y se mide el valor de tensión en la unión de las dos resistencias. Hacemos proporción entre la tensión suministrada y la tensión medida y sacamos el valor de la resistencia a medir.

En un primer momento se realizó con cambio de escalas, pero al final se decidió hacer un autorrango, bastante mas cómodo.


Esquema de conexión.



Montaje del circuito



PROGRAMA

Nota: Procurar programar el arduino antes de montar el circuito. Debido a que se conectan entre si varias entradas y salidas del arduino, puede que si se utilizó antes el arduino, tambien puede que se connecten dos salidas entre si y podemos averiar alguna patilla.

Saludos.
JUAN GALAZ

jueves, 14 de septiembre de 2017

Visualino

Visualino

Creador del programa Victor R. Ruiz.


Curiosa aplicación para hacer programas de arduino en forma gráfica.
Ir a la página web:  www.visualino.net
Bajar la versión de la distribución que tengáis, en mi caso ubuntu.
http://www.visualino.net/downloads/ubuntu/
La versión mas nueva es 0.7 , fecha 2016.
Instalar el programa, yo lo suelo hacer con gdeb.
Existe un tutorial en la página web que explica los pasos.
http://www.visualino.net/docs/ubuntu.es.html
Debemos de tener instalada la versión 1.6 de arduino , con la 1.8 no funciona bien.
La instalación de arduino debera ser similar a:
/home/Nombre de usuario/bin/arduino-1.6/
Dentro de ese directorio, deberá seleccionar el fichero ejecutable arduino.

Abrimos una consola y tecleamos visualino.
Si todo fue bien arrancará el programa.
En el menú  archivo->preferencias
    Cambiar el idioma.
    Cambiar IDE-      /home/usuario/bin/arduino-1.6.2/arduino
En la ventana principal seleccionar el tipo de placa (nano, uno,...) y la conexión (ttyUSB0 ,ttyUSB1)
Ya está todo para programarlo visualmente.


Saludos.
Juan Galaz

Reproducir MP3 con arduino y DFPLayer Mini

Página principal


Arduino
TM1638
MP3
DFPLayer Mini


xsetaseta@gmail.com


Siguiendo con la serie de montajes con el TM1638, ahora realizamos un reproductor de MP3.
Después de la serie de montajes con el TM1638 he de reconocer que hace muy fácil cualquier tipo de montaje, tiene de todo, leds, displays, y botones,  recomiendo encarecidamente su uso.
Para el montaje utilizamos el módulo llamado DFPLayer Mini, cuesta menos de 3€.
Para ver mas detalles recomiendo mi montaje MP3 - DFPLayer Mini - Arduino.
Los botones se utilizan:
    S1 y S2 seleccionan el directorio.
    S3 y S4 seleccionan el archivo mp3.
    S5  - para PLAY y PAUSA
    S6  - STOP
    S7  - Bajar volumen.
    S8  - Subir volumen.


Esquema de conexión.


Montaje del circuito




PROGRAMA

VIDEO


Saludos.
JUAN GALAZ


Bibliografía:
armpg.html
remson.html
https://github.com/DFRobot/DFRobotDFPlayerMini .
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299
https://www.luisllamas.es/arduino-mp3-dfplayer-mini/
http://stonez56.blogspot.com.es/2015/03/arduino-dfplayer-mini-mp3-module.html


martes, 12 de septiembre de 2017

Voltímetro y Amperímetro - Arduino - TM1638

Página principal


Arduino
TM1638
Voltímetro y Amperímetro
xsetaseta@gmail.com


En este artículo realizo un voltímetro y un medidor de intensidad.
Para medir la intensidad del circuito se inserta una resistencia de pequeño valor en serie con el circuito a medir.
Para no interferir en la tensión del circuito a medir, se debería utilizar una resistencia de valor mas bajo posible.
Como la caída de tensión en la resistencia es demasiado baja con una resistencia de por ejemplo 3 ohmios para poder ser medida por el arduino sin emplear otro componente adicional, empleamos una de 18 ohmios.
Con una resistencia de 18 ohmios y con una intensidad de 30 mA, producimos una caída de tensión de 0.5V en la tensión que ofrecemos al circuito a medir.
Por ejemplo : si tenemos de alimentación de 5V con un consumo de 30mA, entregaríamos solo 4.5V.
Como vemos debemos sopesar la resistencia a colocar en serie con circuito a mediar, y ajustarla a que la caída de tensión no sea grande.
Si quisiéramos medir en una escala de hasta 5mA ,deberíamos utilizar una resistencia de 100 ohmios para que la caída de tensión fuera como máximo de 0.5V .
Las 3 resistencias de 1K son a modo de protección del arduino, por si metemos un arduino mal programado.
Los 3 condensadores se utilizan para filtrar la alimentación, con unos 100uF 5V servirían.


Esquema teórico.


Esquema eléctrico.


Esquema de conexión.



Montaje del circuito y con una carga de 1K.


/*
xsetaseta@gmail.com
Juan Galaz
8/SEP/2017
*/


#include <TM1638.h>

//data(I/O) pin 8, clock(CLK) pin 9 , strobe(STB) pin 7
TM1638 module(8, 9, 7);

#define ENTRADA1 A0
#define ENTRADA2 A1

char cadena[50];
unsigned int vv1,vv2,test3v3;

#define RESISTENCIA 18

void setup()
 {
  //Serial.begin(9600);
  pinMode(ENTRADA1, INPUT);
  pinMode(ENTRADA2, INPUT);
  pinMode(A7, INPUT);
  //intensidad al minimo
  module.setupDisplay(1,0);
  module.setDisplayToString("vol    ",0,0);
  delay(500);
  //toma la referencia de 3.3V
  test3v3=analogRead10(A7);
 }

void loop()
{
 byte keys;
 long voltios1,voltios2;
 unsigned int z1,z2;
 
  vv1=analogRead10(ENTRADA1);
  delay(150);

  vv2=analogRead10(ENTRADA2);
  delay(150);

  voltios1=vv1*33; voltios1*=10; voltios1/=test3v3;
  voltios2=vv2*33;  voltios2*=1000; voltios2/=test3v3;
 
  z1=voltios1;    //Voltios
  z2=voltios2/RESISTENCIA; //intensidad

  sprintf(cadena,"%03du%03di",z1,z2);
   
  module.setDisplayToString(cadena,0,0);
  module.setDisplayDigit(cadena[0]-48,0,1);
  module.setDisplayDigit(cadena[5]-48,5,1);
/*
  Serial.println(cadena); 
  sprintf(cadena,"vv1=%05d  vv2=%05d  test=%05d  mA*10=%d ",vv1,vv2,test3v3,voltios2/RESISTENCIA);
  Serial.println(cadena);
*/
}

//lectura de 10 medidas y hace la media
int analogRead10(int entrada)

{
 int z,v;
  for(z=0,v=0;z<10;z++)v+=analogRead(entrada);
  v/=10;
  return(v);
}

Nota: Debemos tener encuenta que no es un circuito muy preciso, que depende de muchos factores, no hay que hacerse muchas ilusiones al respecto.

Hasta pronto.
JUAN GALAZ

Bibliografía:
https://github.com/rjbatista/tm1638-library

jueves, 7 de septiembre de 2017

Probador nivel de batería con arduino y TM1638

Página principal


Arduino
TM1638
Probador nivel de batería
xsetaseta@gmail.com


En mi anterior artículo había realizado un voltímetro con el CHIP TM1638.
Aprovechando el medidor de tensión realizo un comprobador de baterías.
En este montaje mido el voltaje de la batería a comprobar, con una resistencia de carga 470 ohmios.
Los 8 LEDS del módulo son utilizados como señalador de nivel de batería.
Para cambiar de escala se utilizan los botones S1 al S4.
Las escalas son:
S1 - escala 1.2V - Niveles 1.20V a 1.00V
S2 - escala 1.5V - Niveles 1.50V a 1.10V
S3 - escala 3.0V - Niveles 3.00V a 2.40V
S4 - escala
3.7V
- Niveles 3.70V a 3.00V



Esquema de conexión.



Montaje del circuito.


/*
xsetaseta@gmail.com
Juan Galaz
7/SEP/2017
Nivel de carga de bateria
*/


#include <TM1638.h>

//data(I/O) pin 8, clock(CLK) pin 9 , strobe(STB) pin 7
TM1638 module(8, 9, 7);


#define ENTRADA1 A0


char cadena[50];
unsigned int vv1,test3v3;
// modo=12 1.2V
// modo=15 1.5V
// modo=30 3.0V
// modo=37 3.7V

char modo=12;

void setup()
 {
  //Serial.begin(9600);
  pinMode(ENTRADA1, INPUT);
  pinMode(A7, INPUT);
  //intensidad al minimo
  module.setupDisplay(1,0);
  module.setDisplayToString("test bat",0,0);
  delay(500);
  //toma la referencia de 3.3V
  test3v3=analogRead10(A7);
  modo=15;
 }


void loop()
{
  byte keys;
  long voltios1;
  int z1;
 
  vv1=analogRead10(ENTRADA1);
  voltios1=vv1*33; voltios1*=10;  voltios1/=test3v3;
 
  z1=voltios1;  
  
  switch(modo)
  {
   case 12:
      sprintf(cadena,"12u %03du",z1);
       module.setLEDs(vumeter(z1,120,100));
   break;
   case 15:
      sprintf(cadena,"15u %03du",z1);
      module.setLEDs(vumeter(z1,150,110));
   break;
   case 30:
      sprintf(cadena,"30u %03du",z1);
      module.setLEDs(vumeter(z1,300,240));
   break;
   case 37:
      sprintf(cadena,"37u %03du",z1);
      module.setLEDs(vumeter(z1,370,300));
   break;
  }
 
  module.setDisplayToString(cadena,0,0);
  module.setDisplayDigit(cadena[0]-48,0,1);
  module.setDisplayDigit(cadena[4]-48,4,1);
//  Serial.println(cadena); 
//  sprintf(cadena,"vv1=%05d   test=%05d ",vv1,test3v3);
//  Serial.println(cadena);
 
  keys = module.getButtons(); 
  switch(keys)
  {
   case 1:
      modo=12;
   break;
   case 2:
      modo=15;
   break;
   case 4:
      modo=30;
   break;
   case 8:
      modo=37;
   break;
  }
 // while( 0 != module.getButtons());
 
  delay(300);
}

// vumeter
unsigned char vumeter(int vol,int ini, int fin)
{
 unsigned int z,z1,z2,led,vu;
 
   z=ini-fin;   z/=8;
   z1=1; z2=0; vu=0;
   for(led=0;led<8;led++)
     {
       if(vol>fin) vu=vu+z1;
       fin+=z;
       z1+=z1;
     }
     return(vu);
}
//lectura de 10 medidas y hace la media
int analogRead10(int entrada)
{
 int z,v;
  for(z=0,v=0;z<10;z++)v+=analogRead(entrada);
  v/=10;
  return(v);
}



Hasta pronto.
JUAN GALAZ

Bibliografía:
https://github.com/rjbatista/tm1638-library
tm16vol.html

miércoles, 6 de septiembre de 2017

Doble voltímetro 0-15V con Arduino y TM1638

Página principal


Arduino
TM1638
Doble voltímetro 0-15V
xsetaseta@gmail.com


Siguiendo con esta serie de artículos que emplean el TM1638, en este haremos un doble voltímetro.
Hay que mencionar que el voltaje del USB debería ser siempre de 5V, pero en la práctica se encuentra entre 4.5V y 5V . Como el conversor A/D toma la referencia sobre la tensión del USB , la medida real puede variar. Para solucionar este problema se hace una medida de referencia sobre los 3.3V del pin del arduino. Con la referencia tomada, se hace un cálculo con la medida tomada de la entrada de A0 y A1 y la referencia, corrigiéndose el valor.
En todas las medidas de voltaje, se hace una media de 10 medidas consecutivas, de esta forma se hace mas exacto la medida.
Como el arduino solo puede medir hasta 5V, para medir hasta 15V colocamos un divisor por 3 mediante 3 resistencias de 10K.
He utilizado el botón S1 para cambiar entre 1 y 2 decimales, algunas veces se necesitan 2 decimales.
En las pruebas prácticas se ha comprobado que las medidas son bastante exactas.


Esquema de conexión.


Montaje del circuito.


Visión con 2 decimales.

/*
xsetaseta@gmail.com
Juan Galaz
6/SEP/2017

*/


#include <TM1638.h>

//data(I/O) pin 8, clock(CLK) pin 9 , strobe(STB) pin 7
TM1638 module(8, 9, 7);


#define MULTIPLO 3
#define ENTRADA1 A0
#define ENTRADA2 A1

char cadena[50];
unsigned int vv1,vv2,test3v3;
char modo=1;

void setup()
 {
  //Serial.begin(9600);
  pinMode(ENTRADA1, INPUT);
  pinMode(ENTRADA1, INPUT);
  pinMode(A7, INPUT);
  //intensidad al minimo
  module.setupDisplay(1,0);
  module.setDisplayToString("VOL    ",0,0);
  delay(500);
  //toma la referencia de 3.3V
  test3v3=analogRead10(A7);
 }


void loop()
{
  byte keys;
  long voltios1,voltios2;
  int z1,z2;
 
  vv1=analogRead10(ENTRADA1);
  delay(150);

  vv2=analogRead10(ENTRADA2);
  delay(150);
 
  voltios1=vv1*33; voltios1*=MULTIPLO; voltios1*=modo; voltios1/=test3v3;
  voltios2=vv2*33; voltios2*=MULTIPLO; voltios2*=modo; voltios2/=test3v3;
  z1=voltios1;    z2=voltios2;
 
  if(modo==1)
       { sprintf(cadena,"%03du%03du",z1,z2);  }
      else
       { sprintf(cadena,"%04d%04d",z1,z2);    }
 
  module.setDisplayToString(cadena,0,0);
  module.setDisplayDigit(cadena[1]-48,1,1);
  module.setDisplayDigit(cadena[5]-48,5,1);
//  Serial.println(cadena); 
//  sprintf(cadena,"vv1=%05d  vv2=%05d  test=%05d ",vv1,vv2,test3v3);
//  Serial.println(cadena);
 
  keys = module.getButtons();
  if(keys==1)
    {
     if(modo==10)
       {
        modo=1;
        module.setLEDs(0);
       }
      else
       {
        modo=10;
        module.setLEDs(1);
       }
     while( 0 != module.getButtons());
    } 
}

//lectura de 10 medidas y hace la media
int analogRead10(int entrada)
{
 int z,v;
  for(z=0,v=0;z<10;z++)v+=analogRead(entrada);
  v/=10;
  return(v);
}



Hasta pronto.
JUAN GALAZ

Bibliografía:
https://github.com/rjbatista/tm1638-library

martes, 5 de septiembre de 2017

Temporizador 1 a 9999 segundos con Arduino y TM1638

Página principal


Arduino
TM1638
Temporizador 1 a 9999 segundos
xsetaseta@gmail.com

Siguiendo con el módulo que empleaba el CHIP TM1638, ahora hago un temporizador de 1 a 9999 segundos.
Es un contador que va desde el numero de segundos prefijado en los cuatro primeros  displays hasta cero.
El numero de segundos es fijado con los 4 primeros pulsadores.
Cuando queramos que se inicie la cuenta atrás pulsaremos el botón S8.
Si queremos detener la cuenta atrás deberemos pulsar el botón S5.
Cuando el contador llegue a cero, parpadeará el display y se activará el pin D13 del arduino.
También he colocado un altavoz piezoeléctrico en el pin D12 del arduino a modo de aviso, esto es accesorio. Si queremos colocar otro tipo de altavoz deberéis colocar una resistencia en serie.

Esquema de conexión.


Montaje del circuito.

/*
xsetaseta@gmail.com
Juan Galaz
5/SEP/2017

*/

#include <TM1638.h>
// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);


byte display[8];
char cadena[20];
int alarma,contador,time1;

#define MILED 13
#define PIN_SOUND 12
#define RETRASO 597

char fcontador;

void setup()
{
 pinMode(MILED, OUTPUT);
 pinMode(PIN_SOUND, OUTPUT);
 digitalWrite(MILED, LOW);
 module.setupDisplay(1,0);
 module.setDisplayToString("TIMER  ",0,0);
 delay(500);
 
 module.setDisplayToString("0060----",0,0);
 display[2]=6;
 alarma=60;
}

void loop()
{
 byte keys;
 int z;
 
 keys = module.getButtons();
 
 switch(keys)
 {
  case 1:
     if(fcontador==0)
       {display[0]++; if(display[0]>9) display[0]=0;}
  break;
  case 2:
     if(fcontador==0)
       {display[1]++; if(display[1]>9) display[1]=0;}
  break;
  case 4:
     if(fcontador==0)
       {display[2]++; if(display[2]>9) display[2]=0;}
  break;
  case 8:
     if(fcontador==0)
       {display[3]++; if(display[3]>9) display[3]=0;}
  break;
  
  case 16:
    fcontador=0;
    contador=alarma;
    digitalWrite(MILED, LOW);
    module.setLEDs(16);
  break;
  
  case 128:
    fcontador=1;
    contador=alarma;
    time1=RETRASO;
    digitalWrite(MILED, LOW);
    module.setLEDs(128);
  break;
   
 }
 if(fcontador==0 && keys>0)
   {
    alarma=display[0]*1000+display[1]*100+display[2]*10+display[3];
    sprintf(cadena,"%04d%04d",alarma,contador);
    module.setDisplayToString(cadena,0,0);
    delay(300);
   }
   
   time1--;
   if(fcontador==1 && time1<=0)
     {
       module.setLEDs(0);
       time1=RETRASO;
       contador--;
       sprintf(cadena,"%04d%04d",alarma,contador);
       module.setDisplayToString(cadena,0,0);
       
       if(contador<1)
         {
           fcontador=0;
           for(z=0;z<10;z++)
             {
               sprintf(cadena,"%04d0000",alarma);
               module.setDisplayToString(cadena,0,0);
               delay(200);
               sprintf(cadena,"%04d    ",alarma);
               module.setDisplayToString(cadena,0,0);
               delay(200);                
             }
            sprintf(cadena,"%04d----",alarma);
            module.setDisplayToString(cadena,0,0);
            digitalWrite(MILED,HIGH);             
            for(z=0;z<300;z++)
              {
                digitalWrite(PIN_SOUND, HIGH);
                delay(1);
                digitalWrite(PIN_SOUND, LOW);
                delay(1);
              }          
         }
     }
   
 delay(1);
}



VIDEO DE FUNCIONAMIENTO





Hasta pronto.
JUAN GALAZ

Bibliografía:
https://github.com/rjbatista/tm1638-library


lunes, 4 de septiembre de 2017

Arduino - TM1638 -Visor de temperatura y humedad

Página principal


Arduino
TM1638
Modulo  LED&KEY
Temperatura y humedad

xsetaseta@gmail.com


Hace tiempo compré un módulo que empleaba el CHIP TM1638 , y no lo había utilizado hasta ahora. Estoy preparando una serie de montajes que utilizarán el mencionado módulo, y el primero en realizar es un visualizador de temperatura y humedad.
El módulo llevaba 8 led , 8 display, y 8 botones.
Este módulo se controla a través de 3 líneas;  strobe(STB) , clock(CLK), data(I/O).
Aparte de las líneas de control necesita los cables de alimentación +5V y GND.
Hay que tener en cuenta que con lo máxima luminosidad puede llegar a consumir 150 mA . Se puede regular el consumo mediante el comando oportuno al TM1638.
El montaje es muy sencillo, se puede realizar en menos de 30 minutos.
Para el sensor de temperatura y humedad emplearemos  el AM2302, que se comunica con el arduino mediante 1 sola línea.
Para la comunicación entre el arduino y el AM2302 se emplea la librería Wire . Se une el pin de datos  del AM2302 con el pin del arduino D3 . También debemos colocar una resistencia de 10k entre el pin de datos del AM2302 y la alimentación.
Para controlar el TM1638 empleamos la librería https://github.com/rjbatista/tm1638-library
La comunicación entre el CHIP TM1638 y el arduino se hace mediante la siguiente conexión:
STB-> D7
CLK-> D8
DIO-> D9

Esquema de conexión.


Montaje del circuito.


Medida después de meter el circuito al congelador.

/*
xsetaseta@gmail.com
Juan Galaz
4/SEP/2017
*/

#include <TM1638.h>

//data(I/O) pin 8, clock(CLK) pin 9 , strobe(STB) pin 7
TM1638 module(8, 9, 7);

#include <Wire.h>
#include <VirtualWire.h>
#include "DHT.h"

#define DHTPIN 3     // what pin we're connected to
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

float h,t;
int hi,ti;

char cadena[20];

void setup()
{
 Serial.begin(9600);
  dht.begin();
//activa intensidad con nivel 2
 module.setupDisplay(1,0);
 module.setDisplayToString("SENSOR  ",0,0);
 delay(500);
}

void loop()
{
 h = dht.readHumidity();
 t = dht.readTemperature();

if (isnan(t) || isnan(h))
   {
   Serial.println("Failed to read from DHT");
   }
 else
   {      
     hi=h;
     ti=t*10;
     
     Serial.print("Humedad="); Serial.print(hi);
     Serial.print("     Temperatura="); Serial.println(ti);
    
     sprintf(cadena,"H%2d %3d*",hi,ti);
     if(ti>-100)
       {module.setDisplayToString(cadena,4,0);}
       else
       {module.setDisplayToString(cadena,2,0);}
     Serial.println(cadena);      
   }
   
delay(1000);
}

Hasta pronto.
JUAN GALAZ

Bibliografía:
https://github.com/rjbatista/tm1638-library
https://blog.3d-logic.com/2015/01/10/using-a-tm1638-based-board-with-arduino/
http://www.reuk.co.uk/wordpress/using-the-buttons-on-a-tm1638-module-with-arduino/
http://tronixstuff.com/2012/03/11/arduino-and-tm1638-led-display-modules/
http://www.reuk.co.uk/wordpress/arduino-code-for-displaying-numbers-on-tm1638-module-display/