Reloj de agujas manejado a distancia para enseñar la hora analógica en el colegio

Idea base

Este reloj de agujas se puede poner en la pared para mostrar cómo se ajusta y corresponden la hora digital y la analógica.

El ajuste se realiza de a distancia y será usado por el alumno para experimentar cómo funciona un reloj analógico real mientras los compañeros observan.

Además se pueden programar juegos educativos para que el alumno coloque las agujas del reloj analógico según la propuesta en el mando con reloj digital.

El reloj está diseñado para imprimirlo en una impresora 3D excepto la corona será realizada a parte con madera o PVC impreso. Usará un solo motor paso a paso para las dos agujas y un sensor de infrarrojos para indexar el paso de inicio.

El terminal de control será mínimo pues contará solo con una pantalla led de 7 segmentos y 4 dígitos, un potenciómetro encoder para variar la hora hacia delante o hacia atrás y usará una pila de 9v enviando la información por Bluetooth.

Proyecto finalizado

Materiales:

  • 1 Motor paso a paso Nema 17 (de impresora HP)
  • 2 Arduino
  • 1 Driver para motor paso a paso A4988
  • 1 Display de 7 segmentos TM1637
  • 2 Bluetooth HC-05
  • 1 Sensor infrarrojo (de impresora HP)
  • 2 Interruptores
  • Resistencias
  • 1 Conexión entrada DC.
  • Rodamientos (opcional)
  • 2 Placas de soldaduras.
  • 1 Encoder rotativo
  • 1 Pila de 9V
  • 6 tornillos M5 de 30mm y tuercas
  • 2 tornillos M3 de 10mm y tuercas
  • Conectores USB hembra u miniUSB macho (opcional).
Materiales empleados en el reloj receptor
Materiales necesarios para el mando de control emisor.

Electrónica

El sistema está compuesto por un aparato emisor que contará de un simple encoder rotativo y poco más que será alimentado por una pila de 9V y el aparato receptor que será el reloj de pared.

Receptor: Reloj

La parte más trabajosa de este proyecto ha sido el diseño de los engranajes para que con un solo motor paso a paso pudiéramos manejar las dos agujas del reloj.

Hay mucha información sobre este asunto en internet. El diseño se ha basado en proyectos ya iniciados ahorrándonos ciertos cálculos, aunque la complejidad para realizar un diseño compacto es patente.

Apuntes y esbozos para el diseño de los engranajes.

Sensor barrera IR

Añadiremos este pequeño sensor que para el proyecto inicial no tiene demasiado sentido, pero para añadir futuras funcionalidades puede resultar imprescindible para poner a hora el reloj o para saber exactamente la hora que marca.

Como ejemplo, podrían ser juegos que requieran colocar una hora dada, o simplemente para usarlo como reloj real.

Para este fin, he colocado en el engranaje de la aguja de las horas una pequeña pestaña que hará las veces de reset y así poder calibrar el reloj.

Emplearé un sensor que extraje de una impresora HP para reutilizarlo.

Detalle de la rueda de la aguja de las horas (verde) que contiene una pestaña para marcar el paso.

El sensor irá conectado al pin analógico D2 de Arduino lo que nos permitirá usarlo como interrupción si fuese necesario.

Esquema de conexiones del sensor de infrarrojos para la detección de paso.

Motor paso a paso

Este elemento también lo recuperé del una impresora HP para reutilizarlo. Se trata de un motor paso a paso bipolar robusto de 40mm de lado. 

Para su funcionamiento es necesario un driver que en mi caso usaré el conocido L298N, que tiene como inconveniente de tener un gran tamaño, pero no es un problema en este proyecto. Una de las ventajas que tiene este módulo es que posee un regulador de tensión que emplearemos para alimentar el Arduino a 5 voltios. El motor se alimentará a 12 voltios o menos.  Usaremos en este caso el módulo A4988 para controlar el motor paso a paso de cuatro cables.

Esquema de conexión del módulo A4988 y motor paso a paso bipolar.

Para el control del motor usaremos los pines digitales D4, D5, D6, D7, D8, D9  del arduino que se conectarán a IN1, IN2, IN3 e IN4 respectivamente. Nótese que mantendremos puenteados con un puente a 5V la entrada ENA (activación de la etapa A) y ENB (activación de la etapa B). Además, dejaremos otro jumper colocado entre 12V y GND, lo que nos permitirá usar el regulador de tensión para alimentar el microcontrolador con 5 voltios a través de la salida así marcada. Por último recordar que las masas de las alimentaciones deben ser compartidas para evitar daños en la electrónica.

Usaremos la opción de micropasos que nos ofrece el pequeño driver A4988, el que debemos ajustar el nivel de corriente mediante el potenciómetro que trae incorporado.

Estos micropasos nos permiten un movimiento más fluido y preciso, ya que consiguen incrementar los 200 pasos del motor PaP por 64, lo que nos permite manejar 3200 pasos por vuelta.

El motor PaP encajará en la pieza roja, que trasmitirá el movimiento al eje metálico de 3mm conectado a la aguja de las horas.

Tener en cuenta los dientes de la rueda de tracción del motor, en mi caso 15.  Usaremos un eje de metal de 3mm que irá a presión con la rueda roja de tracción aunque podemos usar algo de pegamento para asegurar la fijación.

Disposición de la rueda de tracción del motor y eje de las horas.

Bluetooth

El módulo BT será el conocido HC-05, que permite trabajar como master y esclavo. Además permite cambiar muchas más configuraciones a través del comando AT en comparación con su hermano el HC-06.

Para poder acceder al modo AT es necesario activar el pin EN en el momento de alimentar el módulo, por este motivo, he decidido alimentar el módulo usando un pin de salida del arduino. Esto permitirá entrar en modo configuración sin tener que trastear en el interior del reloj.

Conexiones al módulo bluetooth

Para conectarlo al módulo microcontrolador usaremos los pines A2, A1, D12 y A0, que se emparejarán con RX, TX, Vcc y EN respectivamente. La masa se conectará a la masa del sistema.

A continuación vemos el esquema completo del reloj con todos sus módulos.

Esquema completo del reloj.

Emisor: Mando de control

Funcionará alimentado con una pila de 9V. Para ello se ha diseñado una cavidad especial con tapadera de fácil acceso. La pila durará relativamente poco pues debe alimentar a la pantalla led, un BT HC-05 y un arduino que recibirá la alimentanción pasando por un regulador de voltaje L7805 que como sabemos es equivalente a despilfarro. Por este motivo aconsejaría usar un convertidor de voltaje menos consumista.

Pondremos un interruptor de encendido y apagado. 

La pila alimentará arduino a través del pin VIN que acepta hasta 12V(gracias al L7805). Los demás módulos que funcionan a 5V serán alimentados por arduino.

En el interior tendremos una pantalla led de 7 segmentos controlada por el chip TM1637 conectada a los pines D2 y D3, CLK y DIO respectivamente.

El encoder rotativo que incorpora un interruptor pulsador irá conectado a D7, D8, D9, a SW, DT, y CLK respectivamente.

El bluetooth usará los pines D6, D10, D11, D12 conectados a RX, EN, +5V y TX. Nótese que la alimentación dependerá del pin D11. Esto será así para poder encender el módulo a nuestro antojo en caso de tener que activar el modo AT de configuración como hicimos en el reloj (cambiar contraseñas, etc).

Esquema electrónico completo del mando de control del reloj.

USB exterior de fácil acceso

Como norma general en los artefactos que tienen un difícil acceso para insertar un USB para programar Arduino intento añadirles un puerto USB hembra en el exterior. 

La disposición de los cables es la siguiente y evita desmontar cajas bien cerradas porque olvidé programar algo o porque necesitan alguna actualización de software.

En el diseño de la caja hay un lugar dispuesto para este puerto que irá sujeto con tornillos M3.


Programación

Bibliotecas

Usaremos:

  • SoftwareSerial.h : ya incorporada en el IDE de arduino, que servirá para comunicar con el módulo de bluetooth sin ocupar el puerto serie natural (Rx-TX). Pudiendo así usar cualquier pin para ello.
  • Button2.h : Se encargará de la presión del botón pulsador del encoder.
  • TM1637Display.h: Se encargará de controlar la pantalla LED de forma sencilla.
  • ESPRotary.h : Se ocupará de controlar el uso del encoder rotativo.

En cuanto al motor paso a paso, preferí no usar ninguna librería para controlarlo aunque existe gran variedad a este respecto. 

A continuación puedes descargar las librerías mencionadas. 

Programación del reloj

/************************************************
   Nombre del proyecto: Relog didáctico analógico.

   Programado por Juan Carlos Pedrajas del Molino

   Https:\\www.geniero.es
   pedrajas@geniero.es        afelio11@hotmail.com

   Fecha de inicio: 21/04/21

   Fecha de finalización: 08/05/21

   ESQUEMA DE CONEXION

                                      +-----+
         +----[PWR]-------------------| USB |--+
         |                            +-----+  |
         |         GND/RST2  [ ][ ]            |
         |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |
         |          5V/MISO2 [ ][ ]  A4/SDA[ ] |
         |                             AREF[ ] |
         |                              GND[ ] |
         | [ ]N/C                    SCK/13[ ] |
         | [ ]IOREF                 MISO/12[ ] |
         | [ ]RST                   MOSI/11[ ]~|  Enable
         | [ ]3V3    +---+               10[ ]~|  M0
         | [ ]5v    -| A |-               9[ ]~|  M1
         | [ ]GND   -| R |-               8[ ] |  M2
         | [ ]GND   -| D |-                    |
         | [ ]Vin   -| U |-               7[ ] |  Reset
         |          -| I |-               6[ ]~|  Sleep
  EN BT  | [ ]A0    -| N |-               5[ ]~|  Step
  Tx BT  | [ ]A1    -| O |-               4[ ] |  Dirección
  Rx BT  | [ ]A2     +---+           INT1/3[ ]~|  driver Vcc (modificado)
         | [ ]A3                     INT0/2[ ] |  IR sensor
         | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |
         | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |
         |            [ ] [ ] [ ]              |
         |  UNO_R3    GND MOSI 5V  ____________/
          \_______________________/


*/
#include <SoftwareSerial.h>
int A4988on = 3;
int dirPin = 4;
int pasoPin = 5;
int sleepPin = 6;
int resetPin = 7;
int M0 = 8;
int M1 = 9;
int M2 = 10;
int enablePin = 11;
//int pasos = 2400;
int pausa = 600;
int desfase = 297;
bool para;
int posicion = 0;
float angulo = 0;
int minuto = 0;
int pasos = 0;

int incremento = 0;
int banderita = 0;
boolean sincro = 0;
int TX = A1;
int RX = 12;
int Status = A3;
boolean conectado;
String cmd;
boolean x = 0;
SoftwareSerial BT1(TX, RX); // RX | TX
void setup() {
  pinMode (A4988on, OUTPUT);
  pinMode (sleepPin, OUTPUT);
  pinMode (resetPin, OUTPUT);
  pinMode (M0, OUTPUT);
  pinMode (M1, OUTPUT);
  pinMode (M2, OUTPUT);
  pinMode (enablePin, OUTPUT);
  pinMode (Status, INPUT);
  pinMode (dirPin, OUTPUT);
  pinMode (pasoPin, OUTPUT);
  digitalWrite (A4988on, HIGH);
  pinMode (2, INPUT);
  // digitalWrite (sleepPin, HIGH);
  delay (10);
  digitalWrite (M0, HIGH);
  digitalWrite (M1, HIGH);
  digitalWrite (M2, HIGH);
  //  digitalWrite (sleepPin, LOW);




  Serial.begin(9600);
  Serial.println(F("Inicio Reloj"));
  BT1.begin(38400);
  digitalWrite (sleepPin, HIGH);
  digitalWrite (resetPin, HIGH);
  digitalWrite (enablePin, LOW);


}

void loop() {
  conectado = digitalRead (Status);  //Estado del BT
  if (conectado == 0) {     //Si existe desconexión x=0;
    x = 0;
    digitalWrite (sleepPin, LOW);
  }

  if (conectado == 1 && x == 0) {   //Si se conecta... recalibra.
    x = 1;
    digitalWrite (sleepPin, HIGH);
    para = digitalRead(2);
    if (para == 1) {                      //Si está la pestañita en sensor IR  Mover a la derecha un tramo largo
      for (int k = 0; k < 450;  k ++) {   
        digitalWrite(dirPin, LOW);        // dirección a la derecha
        digitalWrite(pasoPin, HIGH);
        delayMicroseconds(400);
        digitalWrite(pasoPin, LOW);
        delayMicroseconds(400);
      }
      delay (100);
      para = 0;
      while (para == 0) {             //Recolocar en posición pestañita en IR
        para = digitalRead(2);

        digitalWrite(dirPin, HIGH);  // dirección a la izquierda
        digitalWrite(pasoPin, HIGH);
        delayMicroseconds(400 );
        digitalWrite(pasoPin, LOW);
        delayMicroseconds(400 );
      }

      for (int k = 0; k < desfase;  k ++) {   //Desfase en mi caso (ajustable dependiendo de la rueda impresa).
        digitalWrite(dirPin, HIGH);
        digitalWrite(pasoPin, HIGH);
        delayMicroseconds(400);
        digitalWrite(pasoPin, LOW);
        delayMicroseconds(400);
      }
    }
    else                                  //Si no se encuentra la pestañita en el sensor IR.
    {
      while (para == 0) {                 //Mover a la izquierda hasta pestañita en IR.
        para = digitalRead(2);
        conectado = digitalRead (Status);
        digitalWrite(dirPin, HIGH);  // dirección a la izquierda
        digitalWrite(pasoPin, HIGH);
        delayMicroseconds(400 );
        digitalWrite(pasoPin, LOW);
        delayMicroseconds(400 );
      }
      for (int k = 0; k < desfase;  k ++) {   //Desfase en mi caso (ajustable dependiendo de la rueda impresa).
        digitalWrite(dirPin, HIGH);
        digitalWrite(pasoPin, HIGH);
        delayMicroseconds(400);
        digitalWrite(pasoPin, LOW);
        delayMicroseconds(400);
      }

      posicion = 0;
      minuto = 0;
      banderita = 0;
      angulo = 0;
      incremento = 0;
      pasos = 0;
      sincro = 1;
    }
  }

  if (BT1.available() > 0) {
    char c = BT1.read();
    digitalWrite (sleepPin, HIGH);

    if (c == '2') {
      digitalWrite(dirPin, LOW);  // dirección a la derecha
      minuto++;
      banderita = incremento;
      angulo = minuto * 6;
      incremento = (angulo / 0.1125);
      pasos = incremento - banderita;

      for (int k = 0; k < pasos;  k ++) {
        digitalWrite(pasoPin, HIGH);
        delayMicroseconds(pausa);
        digitalWrite(pasoPin, LOW);
        delayMicroseconds(pausa);
      }


      /*
        Serial.print("minuto= ");
        Serial.println (minuto);
        Serial.print("angulo= ");
        Serial.println (angulo);
        Serial.print("incremto= ");
        Serial.println (incremento);
        Serial.print("banderita= ");
        Serial.println (banderita);
        Serial.print("pasosssss a pasar= ");
        Serial.println (pasos);
        Serial.println("_____________________");
      */

    }

    if (c == '1') {
      digitalWrite(dirPin, HIGH);  // dirección a la isquierda
      minuto--;
      banderita = incremento;
      angulo = minuto * 6;
      incremento = (angulo / 0.1125);
      pasos = banderita - incremento;
      for (int k = 0; k < pasos;  k ++) {
        digitalWrite(pasoPin, HIGH);
        delayMicroseconds(pausa);
        digitalWrite(pasoPin, LOW);
        delayMicroseconds(pausa);
      }
    }

    if (c == '3') {         /////// mete un paso más, debe suceder cada 3 minutos. (se programa en el Master)
    }

    if (c == '4') {
      para = digitalRead(2);
      if (para == 1) {
        for (int k = 0; k < 450;  k ++) {   //Desfase en mi caso (ajustable dependiendo de la rueda impresa).
          digitalWrite(dirPin, LOW);
          digitalWrite(pasoPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(pasoPin, LOW);
          delayMicroseconds(400);
        }
        delay (100);
        para = 0;
        while (para == 0) {
          para = digitalRead(2);

          digitalWrite(dirPin, HIGH);  // dirección a la izquierda
          digitalWrite(pasoPin, HIGH);
          delayMicroseconds(400 );
          digitalWrite(pasoPin, LOW);
          delayMicroseconds(400 );
        }

        for (int k = 0; k < desfase;  k ++) {   //Desfase en mi caso (ajustable dependiendo de la rueda impresa).
          digitalWrite(dirPin, HIGH);
          digitalWrite(pasoPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(pasoPin, LOW);
          delayMicroseconds(400);
        }
      }
      else
      {
        while (para == 0) {
          para = digitalRead(2);
          conectado = digitalRead (Status);
          digitalWrite(dirPin, HIGH);  // dirección a la izquierda
          digitalWrite(pasoPin, HIGH);
          delayMicroseconds(400 );
          digitalWrite(pasoPin, LOW);
          delayMicroseconds(400 );
        }
        for (int k = 0; k < desfase;  k ++) {   //Desfase en mi caso (ajustable dependiendo de la rueda impresa).
          digitalWrite(dirPin, HIGH);
          digitalWrite(pasoPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(pasoPin, LOW);
          delayMicroseconds(400);
        }
      }
      posicion = 0;
      minuto = 0;
      banderita = 0;
      angulo = 0;
      incremento = 0;
      pasos = 0;
      sincro = 1;
      BT1.print(5);       //envía "5" al mando para que sepa que ya está a 0:00
    }
  }



}

/*
  ///********************************

  if (BT1.available()) {
    Serial.write(BT1.read());
  }
  if (Serial.available()) {
    BT1.write(Serial.read());
  }
  }
  /////////////////////////////
*/

Programación del mando de control


/************************************************
   Nombre del proyecto: Mando a distancia para controlar relog didáctico analógico.

   Programado por Juan Carlos Pedrajas del Molino

   Https:\\www.geniero.es
   pedrajas@geniero.es        afelio11@hotmail.com

   Fecha de inicio: 21/04/21

   Fecha de finalización: 08/05/21

   ESQUEMA DE CONEXION

                                      +-----+
         +----[PWR]-------------------| USB |--+
         |                            +-----+  |
         |         GND/RST2  [ ][ ]            |
         |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |
         |          5V/MISO2 [ ][ ]  A4/SDA[ ] |
         |                             AREF[ ] |
         |                              GND[ ] |
         | [ ]N/C                    SCK/13[ ] |
         | [ ]IOREF                 MISO/12[ ] |  TX BT
         | [ ]RST                   MOSI/11[ ]~|  5V BT
         | [ ]3V3    +---+               10[ ]~|  EN BT
         | [ ]5v    -| A |-               9[ ]~|  CLK enconder
         | [ ]GND   -| R |-               8[ ] |  DT encoder
         | [ ]GND   -| D |-                    |
         | [ ]Vin   -| U |-               7[ ] |  SW encoder
         |          -| I |-               6[ ]~|  RX BT
         | [ ]A0    -| N |-               5[ ]~|
         | [ ]A1    -| O |-               4[ ] |
         | [ ]A2     +---+           INT1/3[ ]~|  DIO TM1637
         | [ ]A3                     INT0/2[ ] |  CLK TM1637
         | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |
         | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |
         |            [ ] [ ] [ ]              |
         |  UNO_R3    GND MOSI 5V  ____________/
          \_______________________/


*/
#include <Button2.h>
#include <TM1637Display.h>
#include <SoftwareSerial.h>
#include "ESPRotary.h";
SoftwareSerial BT1(12, 6); // RX | TX
#define ROTARY_PIN1  8
#define ROTARY_PIN2 9
#define BUTTON_PIN  7
ESPRotary r = ESPRotary(ROTARY_PIN1, ROTARY_PIN2, 4);   //el 4 es por la peculiaridad de mi encoder, que cuenta 4 pasadas en cada salto.
Button2 b = Button2(BUTTON_PIN);
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
int EN = 10;
int VCC = 11;
boolean pulsado = 0;
boolean selec;
int hora = 12;
int minuto = 0;
int total;
int mando;

const uint8_t SEG_DONE[] = {SEG_G, SEG_G, SEG_G, SEG_G};

uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };

void setup() {
  pinMode (EN, OUTPUT);
  pinMode (VCC, OUTPUT);
  //  digitalWrite (EN, HIGH);    //AT modo
  delay (500);
  digitalWrite (VCC, HIGH);  //On BT
  display.setBrightness(0x0f);
  Serial.begin(9600);
  Serial.println(F("Inicio MANDO"));
  BT1.begin(38400);
  // r.setChangedHandler(rotate);
  b.setTapHandler(click);
  b.setLongClickHandler(resetPosition);
  r.setLeftRotationHandler(showDirection);
  r.setRightRotationHandler(showDirection);
  total = hora * 100 + minuto;
  display.showNumberDecEx(total, (0x80 >> 1), true);
}

void loop() {
  /*  /////////////////////// Programación comandos AT para el bluetooth
      if (BT1.available()) {
       Serial.write(BT1.read());
      }
      if (Serial.available()) {
       BT1.write(Serial.read());
      }
    }
  */  ///////////////////////////



  r.loop();
  b.loop();
}



//cuando se rota
void rotate(ESPRotary& r) {
  Serial.println(r.getPosition());
}

// Cuando se gira a izquierda=255, cuando se gira a derecha=1
void showDirection(ESPRotary& r) {
  // Serial.println(r.getDirection());
  if (r.getDirection() == 255) {                //////////////////hay que eter 3,3,4 pasos por cada 3 minutos para tener 10 pasos por cada 3 minutos. esto haría 100 pasos cada 30 min y 200 pasaos cada 60 min.
    minuto--;
    mando = 1;
  }
  if (r.getDirection() == 1) {
    minuto++;
    mando = 2;
  }
  if (minuto > 59) {
    minuto = 0;
    hora++;
  }
  if (minuto < 0) {
    minuto = 59;
    hora--;
  }
  if (hora > 12) {
    hora = 1;
  }
  if (hora < 1) {
    hora = 12;
  }
  total = hora * 100 + minuto;
  display.showNumberDecEx(total, (0x80 >> 1), true);         //(0x80>>1) corresponde a los dos puntos del reloj. True corresponde a llenar los huecos con 0

  BT1.print(mando);
  mando = ' ';


}

//click corto
void click(Button2& btn) {
  Serial.println("Click!");
  BT1.print(3);

}

// click largo
void resetPosition(Button2& btn) {
  r.resetPosition();                  //////a ver si puedo cambiar esto, proboca inxactitud en la rotacion.
  Serial.println("Reset!");
  BT1.print(4);

  display.setSegments(SEG_DONE);

  while (BT1.available() == 0) {
  }
  char c = BT1.read();
  if (c == '5') {
    Serial.print ("ok");
  }
  hora = 12;
  minuto = 00;
  total = hora * 100 + minuto;
  display.showNumberDecEx(total, (0x80 >> 1), true);
  delay (100);
 
}

Conexiones Bluetooth

Es momento de empaparse algún tutorial de comandos AT para bluetooth. En esencia, hay configurar el bluetooth del reloj como esclavo y el  del mando como master.

Recordar que debemos descomentar la línea que pone en HIGH el pin EN del módulo BT para entrar en modo de comandos AT. Otro recordatorio fundamental es que el terminal serie debe estar funcionando con el retorno de carro y línea nueva al final de línea.

Usaremos AT+ROLE=0  para esclavo y AT+ROLE=1 para Master.

AT+NAME=CRONOS_RELOJ para el reloj y AT+NAME=CRONOS_MANDO para el control (cambia el nombre).

AT+PSWD=1234 para ambos. (asigna el password de acceso).

AT+ADDR? solicita la dirección MAC del módulo esclavo que usaremos después para vincularlos. Responde una MAC parecida a esto: 1234:56:7890

El proceso de configuración del esclavo ha terminado. Debe ser reiniciado y comentar de nuevo la línea del código que activa el EN.

Seguimos con el master al que pondremos en modo de vinculación obligatoria.

AT+CMODE=0

Posteriormente, vincularemos al esclavo conocido.

AT+BIND=1234,45,7890

Nótese el cambio de los «:» por la coma «,».

Ahora debemos resetear el master, comentando también la línea del código que lo pone en modo AT.


Diseño 3D.

El proyecto está compuesto de dos artefactos que se comunican entre sí por radiofrecuencia.

Diseño del reloj.

Constará de 4 engranajes, dos de ellos simples y uno doble. La rueda amarilla estará prisionera por un eje de metal (usé un tornillo de 3mm aunque valdría cualquier eje fijo). 

Disposición de las ruedas de engranaje y ejes de metal.

La rueda roja recibe la tracción directamente del motor y el eje metálico se pega a esta rueda por presión. Será el eje de la aguja de las horas. Este eje cuenta con una ranura que facilita y coloca la aguja de las horas en la posición correcta. 

La rueda verde será traccionada por la amarilla y será el eje de la aguja de los minutos. Esta aguja ha de ajustarse con un tornillo teniendo la precaución de que coincidan las dos agujas en la posición vertical lo más perfectamente posible.

Se pueden añadir rodamientos para mejorar el rozamiento de las piezas.

Los engranajes se colocarán con sus respectivos ejes en el interior de una estructura sujeta por 6 tornillos M5.

El motor, la electrónica se colocarán en la parte trasera. Se añade un interruptor y una toma de DC.

Por último se coloca la corona del reloj anclada con 5 tornillos.

Modelo real montado.

Impresión de la corona

Se ha impreso en PVC de 5mm de grosor y el tamaño es de 60×60 cm pues las agujas no superan los 23 cm de largo.

El tamaño es de 60×60 cm.

Diseño del control

El mando debe ser compacto, robusto y simple. Consta de una caja que contiene el display, un encoder rotativo, un Bluetooth HC-05 para el enviar los comandos de control, una cavidad para una pila de 9V con tapadera y un puerto USB de programación de fácil acceso.

La tapadera de atornillará al cuerpo de la caja con 6 tornillos de 2,5×10 mm. 


Conclusiones y problemas encontrados.

Uno de los problemas es que una vez inmerso en el proyecto y casi acabando me dí cuenta que el motor paso a paso no admitía números decimales lo que supone un grave problema a la hora de sincronizar los relojes analógico y digital.

Seguramente habrá una manera mejor de solucionar este asunto. Pero lo solucionaremos haciendo algo de trampa.

El motor que tengo es de 200 pasos por revolución. Esto hace que cada paso complete 1.8º (360º:200 pasos). 

Para el reloj necesitaba que la aguja horaria completara una vuelta cada…………………………………………..

(Longitud de la aguja y potencia del motor

ajuste de AMPerios del driver del motor

Problemas con la aceleración del motor y vibración en aguja de minutos

problemas con microsteps

Consumo de la pila 9V)

…………………………………………..