Escape Room – Phone Dial Arduino

Para preparar nuestro Escape Room vamos a atender por un momento al attrezzo y a la puesta en escena. Un Escape Room debe de disponer de una historia y un enlace entre cada una de las pistas que hemos diseñado.

Pero esto puede ser más difícil de lo que parece, así que para seguir unos consejos podéis acceder a nuestro Escape Room online y poner a prueba vuestras habilidades.

En este tutorial vamos a realizar un pequeño proyecto en el que vamos a aprender algo de programación y además vamos a construir un modelo de enigma utilizando un teléfono de los antiguos.

The Phone Dial

Los marcadores telefónicos de ahora son táctiles, pero recordemos por un momento cómo eran antes esas reliquias mecánicas y circulares que debían de girar para traducir el movimiento a un número. Nos referimos a esos teléfonos de antaño con un complicado sistema analógico más moderno que el software de la época.

 

 

 

 

 

 

 

 

 

Lo primero que deberemos de hacer es conectar los dos cables que dispone en la parte trasera con el siguiente circuito para leer los pulsos que realiza el sistema en su movimiento.

 


Probaremos a programar solamente la salida de pulsos con el Serial Plotter para visualizar la señal con este sencillo programa y después elaborar un programa que se ajuste a nuestras necesidades.

int reading;

void setup() {
    Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  reading = digitalRead(2);
  Serial.println(reading);
}

La respuesta que obtenemos es simplemente una entrada digital de pulsos de la forma que aparece en la siguiente imagen.

A este nivel de pulsos le corresponderá el número 4 como es evidente.

Programar con Ardublockly

Desde nuestra plataforma vamos a programar el módulo con bloques . En esencia hay que medir la temporalidad de la señal y definir un intervalo de tiempo en el que podemos diferenciar cada uno de los pulsos que se suceden durante el movimiento de retorno del marcador rotatorio.

El truco de este programa es la de medir la lectura actual con la lectura anterior y en el momento que sean distintas, detectaremos un cambio en la señal de subida o de bajada. En el momento que ocurra eso, empezaremos a medir el tiempo y en intervalos de 100 ms establecemos si el marcador ha leido ya el patron completo.

Mientras tanto en intervalos de 10 ms, determinaremos el contador y el estado de cambio con respecto a otra variable para sumar 1 cada vez que se detecte un estado alto en la secuencia, y activar la variable que habilita el estado de impresión en pantalla.

Lo que ocurrirá es que una vez que detecte el primer pulso, despues de los próximos 10 ms detectará un nuevo pulso o habrá terminado la secuencia. Si detecta otro pulso,  se suma 1 al contador  y la referencia temporal vuelve a 0 y comienza a medir si aparece otro nuevo pulso o termina.

Em esecia, siempre detectamos un cambio de la señal y si este cambio se dirije a un estado alto, sumaremos uno al contador

Si es capaz de llegar a 100 ms sin detectar nada, eso significará que no hay más pulsos por leer y volverá a comenzar de nuevo.

Desde el siguiente código se puede copiar el resultado.

int reading;
int counter;
int lastState;
int trueState;
int printNumber;
long lastStateChange;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);

  reading = (int)(0);
  counter = (int)(0);
  lastState = (int)(false);
  trueState = (int)(false);
  printNumber = (int)(false);

}

void loop() {
  reading = digitalRead(2);
  if (millis() - lastStateChange > 100) {
    if (printNumber) {
      Serial.println(counter);
      counter = 0;
      printNumber = 0;
    }
  }
  if (reading != lastState) {
    lastStateChange = millis();
  }
  if (millis() - lastStateChange > 10) {
    if (reading != trueState) {
      trueState = reading;
      if (trueState == true) {
        counter = counter + 1;
        printNumber = 1;
      }
    }
  }
  lastState = reading;

}

Con este código podemos hacer que nuestro marcador lea los números y los pase por el puerto serie.
Ahora lo que deberemos hacer es almacenar los datos para realizar un juego para mover motores o conectarle una pantalla.

 

Descubre la contraseña

Ahora queremos realizar un programa que detecte cuántos dígitos forman nuestra contraseña para hacer que otro dispositivo se mueva y crear una consigna secreta con la que comparar.

Añadimos la longitud de nuestra contraseña y cuando queramos que algún aparato se active solamente tendremos que introducirlo en la zona condicional en el que nuestra contraseña se ha integrado.


 



int reading;
int counter;
int lastState;
int trueState;
int printNumber;
int length;
String pass;
long lastStateChange;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);

  reading = (int)(0);
  counter = (int)(0);
  lastState = (int)(false);
  trueState = (int)(false);
  printNumber = (int)(false);
  length = (int)(4);
  pass = (String)("");

}

void loop() {
  reading = digitalRead(2);
  if (millis() - lastStateChange > 100) {
    if (printNumber) {
      Serial.println(counter);
      pass = String(pass) + String(counter);
      if (String(pass).length() >= length) {
        Serial.println(pass);
        pass = "";
      }
      counter = 0;
      printNumber = 0;
    }
  }
  if (reading != lastState) {
    lastStateChange = millis();
  }
  if (millis() - lastStateChange > 10) {
    if (reading != trueState) {
      trueState = reading;
      if (trueState == true) {
        counter = counter + 1;
        printNumber = 1;
      }
    }
  }
  lastState = reading;

}


Con éste código ya podemos crear un elemento de Escape Room hackeando un teléfono antiguo si comparamos nuestra contraseña con una que nosotros hayamos definido y una vez detectada la contraseña activar el siguiente elemento de nuestro Escape Room.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

seis − uno =

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.