10 de septiembre de 2024
El Martes 27 Tomamos en cuenta el consejo de Santiago de diseñar una mascota para el juego y también de Aarón para que esta fuera una morsa, ya que suena parecido a la palabra “Morse”.
El Martes 3 de septiembre explicamos a Santiago y Tiare como habíamos hecho la división de nuestra pieza 3D, porque nos preguntaron en qué tolerancia habíamos hecho el encaje.
durante el mismo día (6 de septiembre) Emilia intentó ayudarnos a solucionar un problema con el código del speaker pero no funcionó :(
También ayudamos a Emi haciéndole una breve introducción al slicer Ultimaker cura, para que ella pudiera ayudar a las personas que irían al laboratorio el día sábado.
Hicimos pequeñas “cápsulas” tutoriales que fuimos grabando a lo largo de nuestro proceso y las compartimos.
El lunes 9 de septiembre estuvimos hablando mucho con el grupo de la Sofi y el Moss y con el Santiago. Entre nosotros estuvimos respondiendo dudas sobre el código. Por un lado la Sofi nos mostró un código en donde lograba establecer un estado STANDBY y romperlo al apretar el pulsador.
Después Aarón enseñó cómo agregar archivos .h adjuntos a un código, a partir de eso surgieron más problemas al intentar “llamar” el archivo .h, lo cuál pudimos solucionar y comentamos la solución a nuestros compañeros en sala que no estaban avanzando en sus códigos por el mismo problema.
También le enseñamos a Moss a soldar los cables al arduino.
MarcaMorsa es un objeto interactivo en donde las personas pueden aprender a escribir de forma lúdica una palabra en código morse.
En cuanto a su dimensión física, este objeto tiene una forma más orgánica en la parte inferior, para lograr una mejor ergonomía con las manos y un agarre más cómodo. Su materialidad es de madera terciado 3mm e impresión 3D con plástico PLA (rojo para el exterior y negro para algunas partes de fijación interna). Tendrá a la vista un gran botón rojo (que combina con el PLA rojo), una matriz led y unos orificios hacia su interior con la forma de la mascota del juego, que permitirán la salida del sonido. En el interior se encontrarán escondidos el arduino, un parlante y las demás conexiones.
MarcaMorsa es un objeto en donde las personas pueden visualizar una animación de un HOLA en español, seguido de un HOLA en clave morse.
En cuanto a su dimensión física, logramos nuestro cometido descrito anteriormente
Primeros bocetos y lluvia de ideas que hicimos en un moodboard de nuestro Figjam colaborativo
Después de la corrección comenzó la etapa de modelado 3D y prototipado, para ver posibles dimensiones, formas y disposición de los elementos.
Este fue el primer modelo realizado en clase, algunos elementos fueron cambiados, como que en vez de modelar un botón que se adaptara a las dimensiones del pulsador disponible en sala decidimos comprar un pulsador de arcade, también el tamaño del speaker fue redefinido. Todo lo anterior nos llevó a variar su forma. Andrés nos sugirió que cambiáramos la forma de los agujeros para el speaker, por lo que se decidió que fuera con la forma de la mascota para incluirla de forma más natural en el diseño físico.
Imagen del primer modelo previo a los cambios mencionados anteriormente
Este primer modelo, contaba con un visor, cuyo principal elemento sería una lupa, esto tomando en cuenta la idea del proyecto de Santiago e Ivo para “agrandar/acercar la pantalla led” a la visión del usuario. Estaba compuesto por un soporte desmontable, que permitía ubicar la lupa en la parte superior de la carcasa. Este visor fue descartado por la alta probabilidad de distorsión de la pantalla que podía provocar dependiendo del ángulo en que fuera visto, además de que pensamos que no era muy sensato con respecto al tiempo que teníamos que construirlo. Fue por eso que decidimos hacer una pieza de color negra que centrara, aislara y resaltara la luz de la Matriz LED (esta misma pieza fue la que le dimos al grupo de Moss y Sofi).
Pieza visor primer prototipo
Pieza nueva visor aislante
También comenzamos a hacer experimentaciones con las animaciones de la LED en https://ledmatrix-editor.arduino.cc/
https://github.com/user-attachments/assets/9075fb73-d20f-4405-bf96-9e03a68bdeac
Materiales
Partes del pulsador LED Arcade que armamos según el tutorial de youtube: https://m.youtube.com/watch?v=sRhLCAXLlMc
Carcasa de prototipo armada para la entrega del 3
https://github.com/user-attachments/assets/9c6cbb66-ea07-461d-8140-be1caa0b029b
https://github.com/user-attachments/assets/1f3a5074-9eed-4b16-b4d5-b453018efe68
Después de la corrección, se decidió centrar la morsa para que el objeto fuera completamente simétrico, no quisimos cambiar el botón ya que el que sea un único botón y grande te tienta a apretarlo, por lo que definimos la formalidad final del prototipo y la ubicación de sus componentes
Hicimos pruebas para ver que nuestros componentes funcionaran, con ayuda del Arduino, del multímetro y Aaron.
https://github.com/user-attachments/assets/926fe974-6d12-47e7-9c0a-9a0f67151f40
Mediante ayuda del profesor, tutoriales y códigos de arduino, logramos descubrir los pines más convenientes, donde conectar ambos componentes. El puerto positivo del speaker se conectó al pin 8 digital y su puerto negativo se conecta a GND (ground) y con respecto al pulsador, el puerto positivo su led se conecta al pin de 5V y el negativo a un GND, finalmente el puerto positivo del pulsador se conecta al pin 12 digital y a un GND.
Fuentes:
Cuando descubrimos dónde van las conexiones negativas y positivas, cortamos los cables y luego los soldamos a sus respectivos componentes.
https://github.com/user-attachments/assets/6ba302c7-f9ce-47a3-a28b-e3b3d07060a4
Logramos hacer funcionar el speaker y el botón con los códigos de arduino mencionados arriba ;)
https://github.com/user-attachments/assets/2fdbcc98-151c-4b4e-977c-5c91b9a841e2
Tuvimos pequeños errores de impresión y corte láser, ya que uno de los agujeros quedó muy chico y la tapa superior quedó un poco grande. Para corregir esos errores tuvimos que lijar el plástico con una lima y la madera con lija. Pero gracias a eso la tapa dejó una línea led muy al margen del visor.
Limando y lijando
Animaciones muy al margen :(
Para fijar internamente el Arduino y el parlante se hicieron pequeñas impresiones 3d a su medida para que quedaran encajadas.
También aprendimos a sacar soldadura usando el cautín y el “Solder Sucker”.
Primero, a pesar de que logramos que el parlante pudiera hacer sonar diferentes notas musicales de la biblioteca que descargamos, sonaban 2 notas o la nota sonaba dos veces, probamos muchas cosas e incluso le pedimos ayuda a la Emi, pero no logramos solucionarlo. Finalmente, decidimos probar la parte de los pulsadores.
https://github.com/user-attachments/assets/adfaf161-2e5a-4e76-badc-ffefb40fe282
Otro de los problemas que tuvimos, fue que a una de las dos no podía agregar la biblioteca de “Led_Matrix”, ya que no podía descargarla como carpeta zip ni la encontraba dentro de la biblioteca, pero después aprendimos cómo hacerlo de otra manera que sí funcionaba.
https://github.com/user-attachments/assets/375cdfef-48b0-4d82-8a78-d4ac9a09118e
Después entendimos cómo poner la función de presentar una animación, pegar una animación hecha por nosotras en el archivo headline (.h). Descubrimos que a veces tira error cuando el #include “__.h”, el ___ no coincide con el nombre del documento .h. Mucha gente le arrojaba error por esto, cuando vimos que ese era el problema, todos pudimos seguir avanzando en lo suyo.
https://github.com/user-attachments/assets/10622ea5-fe27-47b3-b934-a4ebd92164ba
Aquí se ve el error antes de ser solucionado.
Como dijimos antes, tuvimos problemas para adaptar nuestro código con el de la Sofi. Logramos agregar exitosamente las bibliotecas de “PushButton”, pero no pudimos incluir sus comandos como constantes, lo que nos arrojaba error. La biblioteca explorada fue: https://github.com/caiofrota/cf-arduino-lib-pushbutton
Conectar el objeto interactivo “MarcaMorsa” a una fuente de alimentación para encenderlo.
La pantalla te va a recibir en un estado “STANDBY” en donde aparecerá escrita en la Matriz Led la palabra “HOLA” escrito en español seguido de un “HOLA” en clave morse (escrito y sonoro).
Para que el usuario pueda salir del estado “STANDBY” y comenzar el juego, debe apretar el botón mínimo una vez.
Después la pantalla mostrará un punto con su respectivo sonido (C1) para que el usuario lo recree presionando el botón, al hacer el click sonará el sonido C1 también.
Si lo consigue, aparecerá una animación de logro con el sonido C1 y pasará a la siguiente fase, sino, aparecerá una animación de una cruz (X) con un sonido C4 y deberá repetirlo.
En la siguiente fase la pantalla mostrará una línea con su respectivo sonido (C2) y para que el usuario lo recree manteniendo presionado el botón, al hacer el hold sonará el sonido C2.
Si lo consigue, aparecerá una animación de logro con el sonido C2 y pasará a la siguiente fase, sino, aparecerá la animación de la cruz y deberá repetirlo.
En la siguiente fase se reproducirá un sonido en clave morse de la letra M ( - - ) con el sonido (C2 C2), para que el usuario lo recree. Si lo logra, aparecerá la letra M en la pantalla, escrita estándar y en morse. Si no lo logra, aparecerá la animación de fallo estándar con su cruz y su sonido de fallo.
En la siguiente fase se reproducirá otro sonido en clave morse de la letra O ( - - - ) con el sonido (C2 C2 C2), para que el usuario lo recree. Si lo logra aparecerá la letra O en la pantalla, escrita estándar y en morse. Si no lo logra, aparecerá la animación de cruz y su sonido de fallo.
En la siguiente fase se reproducirá otro sonido en clave morse, la letra R (. - .) con el sonido (C1 C2 C1), para que el usuario lo recree. Si lo logra aparecerá la letra R en la pantalla, escrita estándar y en morse. Si no lo logra, aparecerá la animación y sonido de fallo.
En la siguiente fase se reproducirá otro sonido en clave morse, la letra S (. . .) con el sonido (C1 C1 C1), para que el usuario lo recree. Si lo logra aparecerá la letra S en la pantalla, escrita estándar y en morse. Si no lo logra, aparecerá la animación y un sonido de fallo.
En la siguiente fase se reproducirá otro sonido en clave morse, la letra A (. -) con el sonido (C1 C2), para que el usuario lo recree. Si lo logra aparecerá la letra A en la pantalla, escrita estándar y en morse. Si no lo logra, aparecerá la animación y sonido de fallo.
Al lograr superar todos los niveles mencionados anteriormente, aparecerá una animación de la mascota del juego, una morsa que te guiñará el ojo en señal de felicitación por saber escribir su nombre.
Finalmente el juego se reiniciará.
/*
Button
Turns on and off a light emitting diode(LED) connected to digital pin 13,
when pressing a pushbutton attached to pin 2.
The circuit:
- LED attached from pin 13 to ground through 220 ohm resistor
- pushbutton attached to pin 2 from +5V
- 10K resistor attached to pin 2 from ground
- Note: on most Arduinos there is already an LED on the board
attached to pin 13.
created 2005
by DojoDave <http://www.0j0.org>
modified 30 Aug 2011
by Tom Igoe
This example code is in the public domain.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button
*/
// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
} else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
}
/*
Melody
Plays a melody
circuit:
- 8 ohm speaker on digital pin 8
created 21 Jan 2010
modified 30 Aug 2011
by Tom Igoe
This example code is in the public domain.
https://www.arduino.cc/en/Tutorial/Tone
modified 30 Aug 2011
by Tom Igoe
This example code is in the public domain.
https://www.arduino.cc/en/Tutorial/Tone
*/
#include "pitches.h"
// notes in the melody:
int melody[] = {
NOTE_C6
};
// note durations: 3 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
3
};
void setup() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}
void loop() {
// no need to repeat the melody.
}
/*
Play Animation
Sketch shows animation defined in animation.h
See the full documentation here:
https://docs.arduino.cc/tutorials/uno-r4-wifi/led-matrix
*/
#include "Arduino_LED_Matrix.h" //Include the LED_Matrix library
#include "animation.h" //Include animation.h header file
// Create an instance of the ArduinoLEDMatrix class
ArduinoLEDMatrix matrix;
const int BUTTON_PIN = 2;
void setup() {
if (BUTTON_PIN, IMPUT, PULLUP);
digitalread (2);
}
else {
Serial.begin(115200);
// you can also load frames at runtime, without stopping the refresh
matrix.loadSequence(animation);
matrix.begin();
// turn on autoscroll to avoid calling next() to show the next frame; the paramenter is in milliseconds
// matrix.autoscroll(300);
matrix.play(true);
}
void loop() {
delay(500);
Serial.println(millis());
}
const uint32_t animation[][4] = {
{
0x30c30c30,
0xc3fc3fc3,
0xc30c30c,
600
},
{
0x3fc3fc30,
0xc30c30c3,
0xc3fc3fc,
600
},
{
0xc00c00c,
0xc00c00,
0xc00f80f8,
600
},
{
0x3fc3fc30,
0xc30c3fc3,
0xfc30c30c,
600
},
{
0x0,
0x1540,
0x0,
600
},
{
0x0,
0x36c0,
0x0,
600
},
{
0x0,
0x5a80,
0x0,
600
},
{
0x0,
0xb00,
0x0,
600
}
};
#include "Arduino_LED_Matrix.h"
#include "gallery.h"
#include "PushButton.h"
#include "Nivel4.h"
// Código de referencia del repositorio de la Sofi Etchepare
// lenguaje de c++ para detectar posibles errores en el código y valores
//por lo que lo usamos ahora para definir los estados de nuestro dispositivo
enum State {
// estado de reposo
STANDBY,
// primer nivel introductorio
NIVEL_PUNTO,
// segundo nivel introductorio
NIVEL_LINEA,
// en este nivel el usuario deberá mantener presionado o clikear el boton, respectivamente para escribir una letra M en morse
NIVEL1,
// en este nivel el usuario deberá mantener presionado o clikear el boton, respectivamente para escribir una letra O en morse
NIVEL2,
// en este nivel el usuario deberá mantener presionado o clikear el boton, respectivamente para escribir una letra R en morse
NIVEL3,
// en este nivel el usuario deberá mantener presionado o clikear el boton, respectivamente para escribir una letra s en morse
NIVEL4,
// en este nivel el usuario deberá mantener presionado o clikear el boton, respectivamente para escribir una letra A en morse
NIVEL5,
// al lograr pasar todos los niveles, el usuario visualizara una pequeña morsa guiñando el ojo en felicitación
NIVEL_FINAL
};
// el pin es donde se conecta el botón al arduino, en este casi en la ranura número 2
const int BOTON_ENTRADA = 2;
//estado actual en espera
State currentState = STANDBY;
// comandos utilizados de edgar pon para usar botones en arduino con if-else https://edgarpons.com/botones-en-arduino-y-comandos-if-else/
void setup() {
// configurar las entradas
pinMode(BOTON_ENTRADA, INPUT_PULLUP);
Serial.begin(9600);
}
// aquí se ponen todos los comandos que el arduino debe de ejecutar haciéndolos que están en continua funcionamiento, que pase más de una vez
void loop() {
//sirve para leer un valor (o poner en un estado) un pin digital.
switch (currentState) {
// en este estado esperamos la acción del usuario
// 'presionar cualquier botón para que empiece el juego' y asi cambie a un estado activo
case STANDBY:
{
Serial.println("En estado STANDBY");
int lecturaA = digitalRead(BOTON_ENTRADA);
// presiona cualquier boton para salir del estado standby y pasa a estado NIVEL4
if (!lecturaA) {
currentState = NIVEL4;
}
break;
}
case NIVEL4:
{
Serial.println("En estado NIVEL4");
//if (animacionA) aparece en la pantalla{
//se presiona lecturaA
//}
void update();
bool (BOTON_ENTRADA.isClicked(3);)
//Código de referencia de Santiago Gaete.
matrix.loadFrame(Nivel4);
};
/*
MIT License
Copyright (c) 2018 Kristian Klein Jacobsen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef PUSHBUTTON_H
#define PUSHBUTTON_H
class PushButton
{
public:
PushButton(int pin);
void update();
bool isActive();
bool isClicked();
bool isDoubleClicked();
bool isHeld();
bool isReleased();
void disableDoubleClick();
void enableDoubleClick();
void setDebounceTime(int ms);
void setHoldTime(int ms);
void setDoubleClickTime(int ms);
void setActiveLogic(int high_or_low);
private:
int state_;
long lastClickTime_;
long lastReleaseTime_;
int pin_;
bool doubleClickable_;
bool activeLogic_;
bool debounced_;
int debounceTime_;
int holdTime_;
int doubleClickTime_;
};
#endif
// Código usado desde los ejemplos de led matrix de arduino, este código, logra llamar a los códigos de animación realizados en led matrix editor, para proyectarlos en los leds.
/*
Play Animation
Sketch shows animation defined in animation.h
See the full documentation here:
https://docs.arduino.cc/tutorials/uno-r4-wifi/led-matrix
*/
#include "Arduino_LED_Matrix.h" //Include the LED_Matrix library
#include "animation.h" //Include animation.h header file
// Create an instance of the ArduinoLEDMatrix class
ArduinoLEDMatrix matrix;
void setup() {
Serial.begin(115200);
// you can also load frames at runtime, without stopping the refresh
matrix.loadSequence(animation);
matrix.begin();
// turn on autoscroll to avoid calling next() to show the next frame; the paramenter is in milliseconds
// matrix.autoscroll(300);
matrix.play(true);
}
void loop() {
delay(500);
Serial.println(millis());
}
// Punto de partida, Animación de un Hola en código morse y español, hecho en led matrix editor .
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x30c30c30,
0xc3fc3fc3,
0xc30c30c,
600
},
{
0x3fc3fc30,
0xc30c30c3,
0xc3fc3fc,
600
},
{
0xc00c00c,
0xc00c00,
0xc00f80f8,
600
},
{
0x3fc3fc30,
0xc30c3fc3,
0xfc30c30c,
600
},
{
0x0,
0x1540,
0x0,
600
},
{
0x0,
0x36c0,
0x0,
600
},
{
0x0,
0x5a80,
0x0,
600
},
{
0x0,
0xb00,
0x0,
600
}
};
// Nivel introductorio, animación de un punto, hecho en led matrix editor.
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x0,
0x400,
0x0,
250
}
};
// Nivel introductorio, animación de una linea, hecho en led matrix editor.
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x0,
0x600,
0x0,
66
}
};
// Animación letra M en español y código morse, hecha en Led matrix editor.
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x39c3f,
0xc36c36c3,
0xc30c30c,
250
},
{
0x0,
0x1b00,
0x0,
250
}
};
// Animación letra O en español y código morse, hecha en Led matrix editor.
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x1f818,
0x81881f81,
0xb019818c,
250
},
{
0x0,
0x3580,
0x0,
250
}
};
// Animación letra R en español y código morse, hecha en Led matrix editor.
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x1f818,
0x1801f80,
0x180181f8,
250
},
{
0x0,
0x1500,
0x0,
250
}
};
// Animación letra S en español y código morse, hecha en Led matrix editor.
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x1f81f819,
0x81981f81,
0x98198198,
250
},
{
0x0,
0x1600,
0x0,
250
}
};
// Animación letra A en español y código morse, hecha en Led matrix editor.
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x1f81f819,
0x81981f81,
0x98198198,
250
},
{
0x0,
0x1600,
0x0,
250
}
};
// al lograr pasar todos los niveles, el usuario visualizara una pequeña morsa guiñando el ojo en felicitación
// https://ledmatrix-editor.arduino.cc/
const uint32_t animation[][4] = {
{
0x31831811,
0x4e42483,
0xb8110110,
66
},
{
0x1839801,
0xe42483,
0xb8110110,
250
},
{
0x0,
0x0,
0x0,
250
}
};
Links Visitados
https://docs.arduino.cc/built-in-examples/digital/toneMelody/
https://docs.arduino.cc/built-in-examples/digital/Button/
https://www.profetolocka.com.ar/2024/07/22/tutorial-usando-la-matriz-led-del-arduino-uno-r4-parte-1/
https://www.profetolocka.com.ar/2024/07/22/tutorial-usando-la-matriz-led-del-arduino-uno-r4-parte-1/
Al realizar el código, muchas veces surgieron problemas respecto a bibliotecas que eran necesarias para los códigos que debíamos usar, ya que estas se encontraban disponibles, pero no en todas las ocasiones se encontraban comprimidas como archivo zip y al comprimirlo costaba que arduino pudiese abrirla.
(Acabamos de descubrir que discord funciona con lenguaje markdown y documentos de Google igual :o)
Por alguna razón al utilizar el código de prueba del pulsador, sucedió que al acercar nuestra mano o un objeto, la luz del arduino reaccionaba como si estuviéramos pulsando el botón, no sabemos si el imán del speaker interfirió o si es algo relacionado a la conexión.hg
https://github.com/user-attachments/assets/d36848d5-d107-4345-9b57-94f9a4a42a05
https://github.com/user-attachments/assets/2b67bed5-d17c-456f-a424-9ba466fdab67
https://github.com/user-attachments/assets/e19130f4-d286-47d3-a05c-7821752b7b1f