Skip to main content

Reto del telégrafo

📖 wikipedia

Como ejercicio, vamos a tratar de utilizar un sensor y un actuador para transmitir información entre dos puntos.

El reto consiste en utilizar una fotoresistencia (LDR en inglés) que nos permite conocer de forma relativa el nivel de luz en el ambiente, o específicamente en algún area hacia donde la apuntemos. Si alineamos nuestra fotoresistencia con un LED, comparando los niveles de luz, nos es fácil saber si el LED está encendido o apagado y de esta forma transmitir pulsos que representen información, algo así como un telégrafo óptico.

Como primer protocolo podemos utilizar la clave morse y sólo definir una duración diferente para los puntos y las líneas.

Nuestro Arduino debe recibir letras o palabras a través del puerto Serial y convertirlas en pulsos largos y cortos del LED. Además cuando detectemos pulsos con la fotoresistencia, debemos acumularlos y convertirlos en letras para enviarlos por el puerto Serial y poder visualizarlos en el ordenador.

Leyendo la luz

Lo primero que tenemos que hacer es ser capaces de leer el nivel de luz frente a nosotros, en la documentación que hemos usado previamente hay un ejemplo que podemos utilizar para empezar.

Con un código muy simple, podemos empezar a entender los niveles de luz con los que trabajaremos:

void setup() {
pinMode(A0, INPUT);
Serial.begin(115200);
}

void loop() {
int light = analogRead(A0);
Serial.println(light);
delay(50);
}

Escribiendo con la luz

También podemos revisar la documentación para el caso del led, el circuito es muy sencillo y el código, ¡aún más!.

int ledPin = 9;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
por separado

Lo mejor es montar este cricuito en un segundo breadboard (por separado) de forma que podamos alinear nuestro led con el LDR y así podamos hacer pruebas con el mismo arduino antes de interactuar con los de los demás equipos.

Protocolo

Cada equipo debe construir sus circuitos e implementar el código necesario para ser capaces de enviar y recibir información de forma simultánea. La idea es desarrollar el código y probarlo con un sólo Arduino (como se muestra en el GIF de arriba) y una vez que todo nos funcione correctamente probarlo con los demás!

protocolo

Para que nuestros telégrafos sean compatibles entre ellos vamos a definir algunas reglas que debemos respetar:

  • El largo del pulso que representa el punto es de 100 milisegundos
  • El de la línea es de 300 ms
  • Para separar pulsos usamos también 100 ms y 300 para separar letras.
  • En el código morse no está definido el espacio, lo representaremos con cuatro líneas: - - - -

Recomendaciones

Algunas recomendaciones:

Thresholds: Alinear el led y el LDR para poder ver cuanto varían los niveles de luz y definir los thresholds para poder entender cuando el led está apagado o encendido.

NO delay: Escribir el código sin usar la función delay(), para poder leer el sensor de luz tan rápido como podamos. Se pueden utilizar timers, por ejemplo:

period = 1000;
...
if (millis() - start > period) {
// Execute your code
start = millis();
}

Arreglos: Utiliza arreglos (arrays) para guardar las combinaciones de puntos y líneas de las letras, así podrás buscarlas dentro de un loop.

const char letters[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ' };
const String morse[] = {
".-", // a
"-...", // b
"-.-.", // c
"-..", // d
".", // e
"..-.", // f

...etc.

Parte por parte: Divide las tareas y resuelvelas una por una, es mucho más fácil! Recuerda verficar que todo va funcionando correctamente en cada paso, el puerto Serial es tu amigo!

recursos

Guía sobre fotoresistencias en learn.adafruit
Tutorial para realizar multiples tareas simultáneamente (controlar el led y leer el sensor de luz) en el Arduino en learn.adafruit.com
Un artículo muy interesante: A Brief History Of Optical Communication