Escame Room : le détecteur de fréquences secrètes

Escame Room : le détecteur de fréquences secrètes

Le détecteur de fréquences va permettre au joueur de découvrir quelle fréquence écouter sur le poste de radio pour avoir l’indice qui va le mener à l’énigme suivante. Problème, pour pouvoir s’en servir il lui faut l’alimenter, or il n’a pas de batterie ni de pile sous la main… le poste de radio fonctionne sur secteur, sinon ça serait trop facile !

Pour le faire fonctionner le joueur doit fabriquer la batterie à partir du papier d’alu, du morceau de tube de cuivre, du sel et de l’eau qu’il trouvera dans la pièce. Cette batterie a une tension trop faible et ne délivre pas assez de courant pour alimenter correctement l’arduino et l’écran. Pour éviter l’utilisation de produit plus dangereux qui permettrait de fabriquer une batterie plus puissante, on va tricher… En réalité, le circuit est alimenté par une batterie lithium et on ne fait que détecter la tension de la batterie artisanale avec l’ADC (convertisseur analogique numérique). Si elle est validée, on allume l’écran avec la suite des instructions.

Pour corser l’énigme on peut augmenter la valeur limite comparée à la mesure de l’ADC pour qu’il soit nécessaire de mettre deux cellules de batteries en série pour débloquer le mécanisme. Il y a environ 470mV aux bornes de la pile Cuivre-Aluminium dans une solution de chlorure de sodium.

 

Le principe est simple, un écran graphique 128×64 basé sur le chip ST7920, et l’utilisation de l’ADC pour détecter la tension d’alimentation, un n-mos pour allumer le rétro-éclairage de l’écran.

L’écran

On utilise un écran graphique de 128×64 basé sur le chip ST7920. Il peut être utilisé en mode parallèle (PSB=1) ou en mode SPI (PSB=0). L’écran était livré en mode parallèle avec un jumper sous forme de résistance de zéro ohm (R9) reliant la broche PSB à VDD. Pour l’utilisation en mode SPI il est nécessaire de la déssouder, puis de relier PSB à la masse.

 

Le programme Arduino

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

#define ADC_LIMIT  650
#define LED_PIN  7

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 8);

void setup() {
  analogReference(INTERNAL);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  u8g2.begin();
}

void loop() {
  if(checkAdc()){
    digitalWrite(LED_PIN, HIGH);
    draw();
  }
  else{
    u8g2.clearBuffer();
    u8g2.sendBuffer();
    digitalWrite(LED_PIN, LOW);
    delay(500);
  }
}

bool checkAdc(){
  u16 volt = analogRead(A0);
  return (volt >= ADC_LIMIT);
}

void draw(){
  u8g2.setFont(u8g2_font_5x7_tr); 
  u8g2.drawStr(0,10,"Frequency scanner starting...");
  u8g2.sendBuffer();
  delay(1000);

  u8g2.drawStr(0,20,"Loading...");
  u8g2.sendBuffer();
  delay(1000);

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_helvB10_tr);
  u8g2.drawStr(10,28,"Ready to scan");  
  u8g2.drawFrame(10,32,108,15);
  u8g2.sendBuffer();
  delay(2000);

  u8g2.clearBuffer();
  u8g2.drawStr(10,28,"Scanning...");  
  u8g2.drawFrame(10,32,108,15);
  u8g2.sendBuffer();
  delay(500);

  //loading bar
  for(u8 i = 0; i < 108; i++){
    u8g2.drawBox(10,32,i, 15);
    u8g2.sendBuffer();    
    if(!checkAdc()){
      digitalWrite(LED_PIN, LOW);
      return;
    }
    delay(200);
  }
  u8g2.clearBuffer();
  u8g2.drawStr(10,28,"1 found :");
  u8g2.drawStr(10,44,"- 102.9 MHz");
  u8g2.sendBuffer();

  delay(1000);
  delay(1000);
  delay(1000);
  delay(1000);

  u8g2.clearBuffer();
}

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *