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.
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.
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
//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.