domingo, 29 de marzo de 2020

Transmisión de datos, vía láser mediante arduino.


LASER

Arduino

Transmisión de datos


Hace tiempo que quería realizar esta práctica, pero nunca tenía tiempo y ganas.
Con la reclusión debido al coronavirus, he tenido mucho tiempo, y me he puesto a ello.
Mi intensión en esta práctica era la transmisión de datos entre dos placa de arduino mediante un pequeño láser.
Las premisas eran no tener que utilizar ni driver para el láser, ni circuitería externa, solo utilizar componentes pasivos conectados al arduino.
Está claro que utilizar circuitos externos, incluido utilizar algún tipo de portadora, mejoraría bastante la transmisión, pero no era el caso.

En un primer momento a modo de prueba empecé a utilizar una LDR a modo de receptor.
Enseguida me di cuenta que debía tratar la señal de forma analógica para luego pasarla a digital.
Pero el mayor problema era que el cambio del valor de su resistencia era bastante lento.
A partir de los 25 Hz la señal cuadrada se transformaba en señal de diente de sierra.
La utilización de una LDR a modo de receptor, solo se puede utilizar como corte de luz en procesos lentos.

Como no dispongo de un fototransistor para el montaje, me fui a la caja de despiece de aparatos.
En artículos anteriores he explicado mi afición a reciclar aparatos, de donde saco muchas piezas para mis montajes.
De una de las miles de piezas que dispongo, tenía interruptores de luz que se utilizan en impresoras y vídeos antiguos.
Estos pequeños interruptores esta compuestos de un diodo emisor de luz y un diodo receptor de luz, para este montaje utilizo el diodo receptor de luz.
El láser que utilizo es uno pequeño que compré a China. Son muy baratos, 6 unidades por 3€. También se puede utilizar los punteros láser que se suelen ver como llaveros. Comprobar primero que no tienen condensadores, ni ningún tipo de electrónica añadida.

  Láser utilizado, y fotodiodo.


Colocación del láser y fotodiodo para las pruebas.


  Láserfuncionando.

Llegado a este punto, debía se utilizar un protocolo de comunicación unidireccional.
Mirando entre mis anteriores montajes, encontré que había utilizado el protocolo VirtualWire en transmisión de datos de sensores de temperatura y humedad. Para estos montaje el modo de transmisión eran dos pequeños módulos de 433MHz.
La biblioteca VirtualWire se diseño en un principio para transmitir datos en equipos de radioaficionado.
Esta biblioteca tiene CCR16,  detección de errores de código, y una señal de pulsos previa a los datos, muy útil en la radiofrecuencia.
De las pruebas realizadas utilizando virtualWire , he observado que funciona bien hasta los 10000 Bps.

Como no estaba conforme con esto, decidí emplear la comunicación serie de toda la vida.
Como los arduinos que tengo, Nano, no disponen de mas de un puerto serie, he utilizado los puerto serie virtuales por software, utilizando la biblioteca SoftwareSerial.

  Circuito realizado.

Esta biblioteca funciona bien para velocidades bajas, y para pocos datos continuados, el buffer es pequeño y rápidamente se llena.
Para las pruebas se utilizan 50 bytes cada 1 segundo.

Señales del láser emisor y fotodiodo, además del protocolo USART.

En las pruebas realizadas he conseguido 28800 Bps , a velocidades superiores empiezan los errores.
En el osciloscopio se pueden ver que los pulsos cuadrados se transforman en pulsos de diente de sierra.
Esto puede ser debido a que modulo el láser directamente con la señal que procede de pin del arduino, además de utilizar unos fotodiodos que no están diseñados para este fin.

PROGRAMA EMISOR
//  Emisor

#include <SoftwareSerial.h>

int contador;
char VARI[100];

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() 
{

  Serial.begin(9600);
  Serial.println("setup EMISOR");
  mySerial.begin(28800);
}

void loop()
{
  digitalWrite(13, true);
  sprintf(VARI,"PRUEBA DE TRANSMISION  Hola mundo %d  \n",contador);
  mySerial.println(VARI);
  digitalWrite(13, false);
  Serial.print("SEND=");
  Serial.println(contador);
  delay(1000);
  contador++;   
}

PROGRAMA RECEPTOR
// Receptor

#include <SoftwareSerial.h>

int contador;
char VARI[100];

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() 
{

 Serial.begin(9600);
 Serial.println("setup RECEPTOR");
 
  mySerial.begin(28800);
}

void loop() // run over and over
{
   while (mySerial.available() > 0)
   {
      digitalWrite(13, true);
      char c = mySerial.read();
      Serial.print(c);     
   }
   digitalWrite(13, false);
}


Instantánea de la pantalla en las pruebas.

En las siguientes pruebas de distancia, utilice espejos para mandar la señal láser con rebotes, la casa se me hacía pequeña.
Lo mejor es utilizar  espejos con base que se pueden mover en horizontal y vertical,  es difícil enfocar a 12 metros como hacía yo.
El resultado era muy bueno, salvo cuando pasaba gente que interrumpía la señal.

Este experimento es de lo mas entretenido y práctico, lo recomiendo.

Saludos.
Juan Galaz



Bibliografía:
   

    http://www.bolanosdj.com.ar/TEORIA/SENSORESOPTICOS.PDF

sábado, 21 de marzo de 2020

Programando con SFML

El otro día descubrí la API SFML compilando algunos de sus ejemplos.
La verdad es que me gustó bastante y me propuse hacer algunos artículos explicando su funcionamiento. No soy un experto en SFML , por lo cual mis explicaciones y artículos son un tanto simples, y sin muchas pretensiones.
 Los 3 primeros son:

20/03/2020 - Introducción. sfcap0
20/03/2020 -
Hola mundo. sfcap1

 
 21/03/2020 - Reloj digital y analógico. sfcap2


21/03/2020 - Reloj analógico con esfera, texturas. sfcap3




.

22/03/2020 - Nave en un cielo de estrella. sfcap4

 

23/03/2020 - Nave en un cielo de estrella, con asteroides y disparos. sfcap5


.

24/03/2020 - Sonido y presentación. sfcap6



miércoles, 18 de marzo de 2020

Nueva versión de osciloscopio con Arduino, portable.

18/03/2020 _ portable
Estaba el otro día viendo este antiguo montaje, y pensando en una mejora, he añadido una nueva opción, cambiar el voltaje de referencia a 1.1V, lo cual produce una ganancia de x4,5.
Además aprovechando la oportunidad he realizado una nueva versión de Linux,  versión portable.
Esta versión funciona tanto en 32bits como en la versión 64bits.
Para entender como se realiza la versión portable, mirar este artículo. wxport.html

Funcionando la versión portable de Linux.

También el programa detecta automáticamente el puerto USB donde está conectado el Arduino.
En algunos Windows, el puerto virtual Serie lo coloca muy alto, me encontrado en algunas ocasiones que estaba en Com23, el programa solo mira si existe entre el Com1 y Com5. Si es vuestro caso deberéis cambiar el lugar  para que este en el rango buscado. Se hace como administrador y en configuración de los puertos serie.
Para esta versión deberéis instalar el programa arduino que viene en el archivo comprimido.

PROGRAMA LINUX -WINDOWS

Arduino Control salidas. wxwidgets - Portable - Linux _ Windows

Página principal
Arduino
Control salidas

wxwidgets
Portable - Linux _ Windows


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 wxwidgets, tanto en Linux como en Windows.
Además aprovechando la oportunidad he realizado una nueva versión de Linux,  versión portable.
Esta versión funciona tanto en 32bits como en la versión 64bits.

Circuito.


Funcionando en Windows 10


Funcionando en Linux ,versión portable.

En algunos Windows, el puerto virtual Serie lo coloca muy alto, me encontrado en algunas ocasiones que estaba en Com23, el programa solo mira si existe entre el Com1 y Com5. Si es vuestro caso deberéis cambiar el lugar  para que este en el rango buscado. Se hace como administrador y en configuración de los puertos serie.
En la versión Windows la detección de los puertos se hace un poco lenta, debéis esperar algo (3-4 segundos).


PROGRAMA LINUX -WINDOWS

Saludos.
Juan Galaz



Bibliografía:

Arduino_Uno 1.0.1  programado por Rolfdahl-skogstade

miércoles, 11 de marzo de 2020

Portables - wxwidgets - LINUX


Portables


wxwidgets

LINUX


Como suelo programar con wxwidgets alguna vez, me he encontrado que debido a las múltiples distribuciones y entornos de 32bits o 64bits, el poder compilar un programa y poderlo ejecutar en diferentes entornos, se hace bastante difícil.
Para salvar este problema podemos hacer uso de las aplicaciones portables, que en teoría funcionarán en todas las distribuciones.
En un artículo anterior había realizado un portable para gambas porta.html , este artículo es una continuación.

Para este artículo he tomado como ejemplo mi anterior montaje de detección pulso max30.html , en la versión con wxwidgets.
En la compilación normal el fichero binario ocupa 190Kbytes , un tamaño bastante reducido.
El problema es que está compilado en Debian9 y en 32bits. Este binario no se puede ejecutar en entornos de 64bits, además de no poderse ejecutar en versiones donde no esté instaladas las librerías
wxwidgets v3.
Lo normal es que el usuario no se preocupe en qué entorno se esté ejecutando el binario, lo lo primero que percibe es frustración al no funcionar.

Existe un método para crear un entorno donde se encuentren todas las librerías que necesite la aplicación, utilizar el programa cde.

Antes de nada he retocado el Makefile de compilación de nuestro binario.
La versión
wxwidgets v3 utiliza librerías que nuestro programa no utiliza, pero que de serie la incluye en la compilación.
Cambiar la línea donde aparece
CONFIWX y cambiarlo según lo siguiente:

#CONFIWX =  `wx-config --cppflags --libs`
CONFIWX =  -I/usr/lib/i386-linux-gnu/wx/include/gtk2-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -L/usr/lib/i386-linux-gnu -pthread   -lwx_gtk2u_xrc-3.0  -lwx_gtk2u_qa-3.0 -lwx_gtk2u_adv-3.0 -lwx_gtk2u_core-3.0 -lwx_baseu_xml-3.0 -lwx_baseu_net-3.0 -lwx_baseu-3.0


De esta forma el binario será del mismo tamaño, pero quitaremos las librerías no necesarias -lwx_gtk2u_webview-3.0   -lwx_gtk2u_html-3.0  , y reduciremos en 100Megas el entorno necesario.

cde
El verdadero protagonista de este artículo es  cde_2011-08-15_32bit ,
    http://www.pgbovine.net/cde.html
este pequeño programa de 900 Kbytes crea un directorio donde recrea todo el entorno de librerías y demás programas que utiliza el programa que queremos que sea portable.
Colocamos el programa  cde_2011-08-15_32bit en el directorio /home/arduino/bin/pulsowxALL3  junto con  el programa binario, en este caso programaLinux.
Entramos en una consola y tecleamos:

/home/arduino/bin/pulsowxALL3
./cde_2011-08-15_32bit     /home/arduino/bin/pulsowxALL3/programaLinux


Después  de ejecutar el programa y cerrarlo, veremos que nos ha creado un directorio llamado cde-package , lo cambiamos de nombre con la orden:  mv cde-package  wxpulso
En el directorio wxpulso  se habrá creado un entorno donde se encuentra todas las librerías y ficheros que ha necesitado el programa.
El tamaño del directorio  es de 50M , aunque parezca mucho, si no hubiéramos retocado el Makefile el tamaño sería de 130M.
Podemos ejecutar  el fichero  wxpulso/cde-root/home/arduino/bin/pulsowxALL3/programaLinux.cde
en cualquier entorno y distribución, funcionando perfectamente.

Aquí podríamos terminar el artículo, pero se puede mejorar aún mas.

makeself
Si no se necesita acceder a ningún fichero después de ejecutar el programa (se destruye el entorno al terminar de ejecutar el programa) se puede compactar y distribuirlo en un fichero.
Para esto utilizaremos el programa makeself , que compacta un ejecutable con su entorno.
Creamos un fichero llamado programa en el directorio wxpulso con lo siguiente:

#!/bin/sh
cd
cde-root/home/arduino/bin/pulsowxALL3
./
programaLinux.cde

Damos permiso de ejecución con chmod ugo+x  programa
Ahora podemos probar el programa ejecutando el fichero programa.

Las opciones que se deben usar para utilizar el programa makeself  es:

makeself directorio nombrePrograma_a_crear "ETIQUETA" ejecutable

En nuestro, estando en el directorio pulsowxALL3 caso sería:

makeself wxpulso pulsowx.run "PULSOWX" ./programa

Si todo fue bien nos habrá creado un fichero ejecutable llamado pulsowx.run con un tamaño de 20M.
El fichero pulsowx.run al ejecutarse se auto-descomprime en el directorio /tmp del sistema , donde ejecutara el fichero programa.
Podemos comprimir el fichero algo mas con la orden:
    makeself --bzip2 wxpulso pulsowx.run "PULSOWX" ./programa            18M
o
    makeself --xz  wxpulso pulsowx.run "PULSOWX" ./programa                14,5M

Pero debemos entender que debemos tener el descompresor instalado  en el sistema.


Lo normal es que no se utilice todas las funciones de la biblioteca 
wxwidgets 3.x en nuestro programa, por lo cual podemos compilarlo con la versión de wxwidgets 2.8 , bastante mas liviana.
Para este caso he creado una máquina virtual con VBOX instalando Debian7 , la cual lleva de serie la versión de
wxwidgets 2.8 .
Después de realizar todos los procesos anteriores, podemos conseguir un fichero ejecutable de 9M.
Este fichero ejecutable se puede utilizar en cualquier entorno (32bit o 64bits) y cualquier distribución.

Lo que habíamos intentado lo hemos conseguido, distribuir programas en linux que se pueden ejecutar en cualquier entorno.
Si nuestro programa no accede a ningún fichero local, podemos comprimir con makeself.
Si nuestro programa tiene que acceder a ficheros locales nos tenemos que quedar en el paso donde creamos un entorno con cde.

Como curiosidad, también recree con cde un entorno de compilación para
wxwidgets 2.8 . Este entorno lo puedo ejecutar en cualquier distribución, sin necesidad de utilizar VBOX.

Programa compilado en Debian7 32bits y ejecutado en openSuse 64bits.
Librerías
wxwidgets 2.8

PROGRAMA


Saludos.
Juan Galaz

Bibliografía:
     porta.html