Descripción: Panel interactivo con arduino que representa de forma gráfica las operaciones matemáticas a realizar en el paso de unidades de medidas recomendado para nivel escolar de primaria.

Materiales empleados


Funcionamiento

Como bien aprendimos en primaria, al pasar de una unidad de longitud a otra es necesario multiplicar o dividir por la unidad seguida de tantos ceros como escalones, pero con este artefacto le otorgaremos un añadido visual al concepto.

Pulsaremos la unidad de la que partimos y pulsaremos la anidad a la que queremos llegar, estas se iluminarán de color verde y rojo para mostrar el salto de forma visual. En ese momento en el panel numérico se mostrará la cantidad que debemos usar para multiplicar o dividir y esto último lo indicará un letrero luminoso.

Visión finalizada del artefacto

Esquema eléctrico

Esquema eléctrico

Se muestran 8 pulsadores, de los cuales, 7 corresponden a las unidades de medida (km, hm, dam, etc) y uno de ellos será el reset que permitirá poner a cero el aparato para empezar una nueva muestra. Estos pulsadores irán conectados a los pines D2, D3, D4, D5, D6, D7, D8 y D9. Como se aprecia en la imagen no usaremos resistencias y nos beneficiamos de la función Pull_up del arduino.

Por otro lado, usaremos los pines D10, D11 y D12 para controlar el display de 7 segmentos que mostrará la cantidad de la operación.

Los pines A0 y A1, controlarán transistores que manejarán 4 leds cada uno. Estos iluminará unos paneles que indicarán la operación a realizar (multiplicar o dividir) según el caso.

leds de los letreros de multiplicar o dividir controlados por transistores.

Y por último, reservamos el pin D13 para los leds WS2812b, encargados de iluminar los escalones.


Ensamblaje leds de la escalera.

Usaremos los WS2812b  conectamos de al pin D13 directamente aunque en algunos foros se recomienda poner una pequeña resistencia. Usaremos 49 de ellos repartidos en 7 tramos de 7 leds para representar los escalones de la escalera. Los dispondremos como se muestra en las imágenes. 

Para tapar estos leds que irán pegados a una tabla, fabricaremos estas piezas en 3D a como de embellecedor y a ser posible con material translúcido. Nótese que las piezas se solapan unas encima de otras.

Puedes descargar las piezas STL pulsando aquí abajo.


Pulsadores

Solo recordar que cada pulsador comparte un terminal a tierra y por eso se ha cableado como se muestra en la imagen.

Nótese ya colocada la fuente de alimentación de 5V en la parte trasera del artefacto.


Ensamblaje de display y leds de operación.

Aquí se colocará el display de 7 segmentos y encima la placa que fabricamos antes con los 8 leds y 2 transistores.

Puedes descargar los archivos STL para imprimir estas piezas.


Soporte para la PCB

Por último puedes imprimir el soporte para albergar la PCB que contiene la electrónica junto a la fuente de 5V. Para ello puedes usar esta pieza que irá atornillada con 3 tornillos a la base de madera.


Programación

Para la programación he usado la librería LedControl y Adafruit_NeoPixel

//We always have to include the library
#include "LedControl.h"
#include <Adafruit_NeoPixel.h>
#define PIN        13
#define NUMPIXELS 50
#define DELAYVAL 500
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
/*
  Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
  pin 12 is connected to the DataIn
  pin 11 is connected to the CLK
  pin 10 is connected to LOAD
  We have only a single MAX72XX.
*/
LedControl lc = LedControl(12, 11, 10, 1); //el 1 es el número de chips MAX7912
int pulsado1;
int pulsado2;
char *multiplo[] = {"km", "hm", "dam", "m", "dm", "cm", "mm"};
int operacion;
int ceros;
int multiplica = A0;
int divide = A1;
void setup() {
  Serial.begin (9600);
  Serial.println ("Saludos");
  /*
    The MAX72XX is in power-saving mode on startup,
    we have to do a wakeup call
  */
  lc.shutdown(0, false);
  /* Set the brightness to a medium values (8) */
  lc.setIntensity(0, 14);
  /* and clear the display */
  lc.clearDisplay(0);

  pinMode (2, INPUT_PULLUP);
  pinMode (3, INPUT_PULLUP);
  pinMode (4, INPUT_PULLUP);
  pinMode (5, INPUT_PULLUP);
  pinMode (6, INPUT_PULLUP);
  pinMode (7, INPUT_PULLUP);
  pinMode (8, INPUT_PULLUP);
  pinMode (9, INPUT_PULLUP);
  pinMode (multiplica, OUTPUT);
  pinMode (divide, OUTPUT);
  digitalWrite (multiplica, LOW);
  digitalWrite (divide, LOW);
  pixels.begin();
  pixels.clear();
  ceros = 0;
  ///////////////////////////////////////////////////////////// luces azules
  for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 50));
    pixels.setPixelColor(i - 1, pixels.Color(0, 0, 0));
    pixels.show();
    delay(15);
  }
  for (int i = NUMPIXELS; i > 0; i--) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 50));
    pixels.setPixelColor(i + 1, pixels.Color(0, 0, 0));
    pixels.show();
    delay(15);
  }
  pixels.clear();
  pixels.show();
  ////////////////////////////////////////////////////////// luces azules
  delay (100);
  digitalWrite (multiplica, HIGH);
  digitalWrite (divide, HIGH);
  delay (500);
  digitalWrite (multiplica, LOW);
  digitalWrite (divide, LOW);

  lc.setDigit (0, 8, 0, true);
  lc.setDigit (0, 7, 0, true);
  lc.setDigit (0, 6, 0, true);
  lc.setDigit (0, 5, 0, true);
  lc.setDigit (0, 4, 0, true);
  lc.setDigit (0, 3, 0, true);
  lc.setDigit (0, 2, 0, true);
  lc.setDigit (0, 1, 0, true);
  lc.setDigit (0, 0, 0, true);
  delay (200);
  lc.clearDisplay(0);



}


void loop() {
  // lc.clearDisplay(0);
  // delay(1000);
  while (pulsado1 == 0) {

    if (digitalRead (2) == LOW) {
      pulsado1 = 1;
    }
    if (digitalRead (3) == LOW) {
      pulsado1 = 2;
    }
    if (digitalRead (4) == LOW) {
      pulsado1 = 3;
    }
    if (digitalRead (5) == LOW) {
      pulsado1 = 4;
    }
    if (digitalRead (6) == LOW) {
      pulsado1 = 5;
    }
    if (digitalRead (7) == LOW) {
      pulsado1 = 6;
    }
    if (digitalRead (8) == LOW) {
      pulsado1 = 7;
    }
    if (digitalRead (9) == LOW) {
      pulsado1 = 0;
      Serial.print ("RESET!");
      for (int i = 0; i < NUMPIXELS; i++) {
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
      }
      pixels.show();
      pixels.clear();
      lc.clearDisplay(0);
      digitalWrite (multiplica, LOW);
      digitalWrite (divide, LOW);


    }
    Serial.print ("Primera pulsación:");
    Serial.print (pulsado1);
    Serial.println (multiplo [7 - pulsado1]);
    for (int i = (pulsado1 * 7) - 7; i < pulsado1 * 7; i++) {
      pixels.setPixelColor(i, pixels.Color(0, 50, 0));
    }


    pixels.show();

  }

  delay (300);


  while (pulsado2 == 0) {
    if (digitalRead (2) == LOW) {
      pulsado2 = 1;
    }
    if (digitalRead (3) == LOW) {
      pulsado2 = 2;
    }
    if (digitalRead (4) == LOW) {
      pulsado2 = 3;
    }
    if (digitalRead (5) == LOW) {
      pulsado2 = 4;
    }
    if (digitalRead (6) == LOW) {
      pulsado2 = 5;
    }
    if (digitalRead (7) == LOW) {
      pulsado2 = 6;
    }
    if (digitalRead (8) == LOW) {
      pulsado2 = 7;
    }
    if (digitalRead (9) == LOW) {
      pulsado1 = 0;
      pulsado2 = 9;
      Serial.print ("RESET!");
      pixels.clear();
      lc.clearDisplay(0);
      digitalWrite (multiplica, LOW);
      digitalWrite (divide, LOW);




    }
    Serial.print ("Segunda pulsación:");
    Serial.print (pulsado2);
    Serial.println (multiplo [7 - pulsado2]);
    for (int i = (pulsado2 * 7) - 7; i < pulsado2 * 7; i++) {
      pixels.setPixelColor(i, pixels.Color(50, 0, 0));
    }

    for (int i = (pulsado1 * 7) - 7; i < pulsado1 * 7; i++) {
      pixels.setPixelColor(i, pixels.Color(0, 50, 0));
    }



    pixels.show();


  }
  delay (300);
  if (pulsado2 > pulsado1 && pulsado2 <= 8) {
    digitalWrite (divide, HIGH);
    digitalWrite (multiplica, LOW);
    ceros = pulsado2 - pulsado1;
  }
  if (pulsado1 >= pulsado2 && pulsado2 <= 8) {
    digitalWrite (divide, LOW);
    digitalWrite (multiplica, HIGH);
    ceros = pulsado1 - pulsado2;
  }
  if (pulsado2 <= 8) {

    Serial.print ("ceros:");
    Serial.print (ceros);
    if (ceros == 0) {
      lc.setDigit (0, 0, 1, false);

      for (int i = 0; i < pulsado2 * 7; i++) {
        pixels.setPixelColor(i, pixels.Color(50, 50, 0));
      }
      for (int i = 0; i < (pulsado2 - 1) * 7; i++) {
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
      }
      pixels.show();
    }

    if (ceros == 1) {
      lc.setDigit (0, 1, 1, false);
      lc.setDigit (0, 0, 0, false);

    }
    if (ceros == 2) {
      lc.setDigit (0, 2, 1, false);
      lc.setDigit (0, 1, 0, false);
      lc.setDigit (0, 0, 0, false);

    }
    if (ceros == 3) {
      lc.setDigit (0, 3, 1, true);
      lc.setDigit (0, 2, 0, false);
      lc.setDigit (0, 1, 0, false);
      lc.setDigit (0, 0, 0, false);

    }
    if (ceros == 4) {
      lc.setDigit (0, 4, 1, false);
      lc.setDigit (0, 3, 0, true);
      lc.setDigit (0, 2, 0, false);
      lc.setDigit (0, 1, 0, false);
      lc.setDigit (0, 0, 0, false);

    }
    if (ceros == 5) {
      lc.setDigit (0, 5, 1, false);
      lc.setDigit (0, 4, 0, false);
      lc.setDigit (0, 3, 0, true);
      lc.setDigit (0, 2, 0, false);
      lc.setDigit (0, 1, 0, false);
      lc.setDigit (0, 0, 0, false);

    }
    if (ceros == 6) {
      lc.setDigit (0, 6, 1, true);
      lc.setDigit (0, 5, 0, false);
      lc.setDigit (0, 4, 0, false);
      lc.setDigit (0, 3, 0, true);
      lc.setDigit (0, 2, 0, false);
      lc.setDigit (0, 1, 0, false);
      lc.setDigit (0, 0, 0, false);

    }
  }
  if (digitalRead(9) == LOW) {
    pulsado1 = 0;
    pulsado2 = 0;
  }


}

Proyecto en fusión 360

Solo para el autor está disponible el fichero original en formato Fusión 360 protegido con contraseña.