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