Tue. Jun 28th, 2022
blanco

¡En este Instructable te mostraré cómo hice mi PCB Farkle Game! Farkle, también conocido como 10000, Zilch, 6 Dice y Ten Thousand, es un divertido y desafiante juego de dados con múltiples variaciones y opciones de puntuación. Primero obtuve la inspiración de mi hermano gemelo, el juego de PCB Liar's Dice de Sunyecz06 en el que utilizó un chip MAX7219 para "lanzar" 5 dados LED electrónicos. Pensé que su producto final era increíble y quería crear algo utilizando componentes similares. Además, mientras crecía, mi familia y yo jugábamos bastante al juego tradicional de Farkle (con 6 dados, bolígrafo y papel) y siempre nos divertíamos jugando, especialmente en los momentos en que alguien realmente "Farkle" durante el juego y nosotros todos gritan “¡FAARRKKLEE!”

En algún momento durante la cuarentena, estaba buscando diferentes juegos para jugar y me acordé de Farkle. Fue solo unas pocas vueltas en las que se reavivó la emoción que tenía cuando era niño. Poco después de eso, mis ruedas de retoque comenzaron a girar y pensé en diseñar un juego Farkle portátil hecho en casa que pudiera incorporar a varios jugadores y llevarnos la puntuación. ¡Además, podría usar los mismos chips MAX7219 que mi hermano usó para manejar 6 dados LED electrónicos necesarios para el juego!

Después de muchas horas de dibujo esquemático, diseño de PCB, programación del juego y diseño de la carcasa y el troquel, ¡creé exactamente lo que tenía en mente! Pude terminarlo justo a tiempo para las fiestas y, después de probarlo con la familia, ¡el juego funcionó perfectamente! ¡No podría estar más feliz con cómo resultó!

Aquí hay un resumen rápido de algunas de las características de diseño de mi juego Farkle:

– 6 sensores táctiles capacitivos para seleccionar/deseleccionar matriz

– 2 pulsadores para continuar la ronda o pasar al siguiente jugador

– 6 dados LED electrónicos

– Pantalla de 7 segmentos de 4 dígitos que muestra la puntuación actual durante la ronda de un jugador

– Pantalla OLED de 128×64 que mantiene la puntuación total de cada jugador durante el juego

– Opción para que 2-6 jugadores jueguen el juego (trabajando en crear un juego de 1 jugador contra la computadora)

– Zumbador piezoeléctrico que crea sonidos durante el juego

– Combinaciones de puntuación impresas en la placa de circuito como referencia

– Portátil y alimentado con una batería LiPo

En general, me lo pasé genial haciendo este juego. Esta fue mi primera experiencia creando un PCB y la programación fue definitivamente divertida y desafiante. Si quieres hacer este divertido juego, ¡síguelo!

Suministros

Electrónica :

– Pantalla de 4 dígitos y 7 segmentos

– Pantalla OLED de 128 × 64

– Arduino Pro Mini 5V

– 2 circuitos integrados MAX7219

– 42 LED rojos de 3 mm

– 2x Pulsadores (6x6mm)

– 6 sensores táctiles capacitivos

– Zumbador piezoeléctrico

– 2 condensadores cerámicos (100 nF)

– 2x Resistencia (30kOhm)

– 2x Resistencia (10kOhm)

– Resistencia (100 ohmios)

– Banco de energía recargable de 2600 mAh

– Cambiar

– Sunyecz22 Farkle PCB Board (Envíame un mensaje y puedo enviar los archivos Gerber)

Otro:

– Impresora 3D (opcional)

– Filamento PLA blanco y negro (opcional)

– Envirotex Lite Vierta el acabado brillante

– Pintura en aerosol negra

– Llenador de madera

– Papel de lija (~80 grano – 1200 grano)

– Hoja de acrílico transparente (cuadrado de 12 x 12 pulgadas)

Diverso:

– Alambre calibre 28

– Cortacables/pelacables

– Soldador

– Soldadura

– Pequeñas limas de precisión

– Pegamento caliente

Paso 1: ¡Farkle! Reglas y jugabilidad

blanco

Antes de comenzar, puede ser útil comprender cómo se juega Farkle y las reglas del juego. Hay algunas variaciones diferentes del juego, pero me quedé con las reglas y las combinaciones de puntuación de este sitio web. Esto se parece más a las reglas que recuerdo haber jugado cuando era niño.

Objetivo:

Para anotar un mínimo de 10,000 puntos y superar a tus oponentes

Equipo:

– Seis dados de 6 caras

– Una hoja de puntuación y un lápiz para llevar la puntuación.

Número de jugadores:

Farkle tradicional se juega con al menos dos jugadores, pero idealmente se juega con 3-8 jugadores.

Cómo jugar:

Nota: esto es directamente desde https://www.dicegamedepot.com/farkle-rules/. Explican las reglas mejor en términos de simplicidad.

Las siguientes reglas de Farkle son las más utilizadas, pero hay numerosas variaciones para elegir (me quedé con el juego básico para mi juego, pero algunas de las variaciones podrían implementarse fácilmente sin codificación adicional). Antes de que comience el juego, los jugadores deben establecer qué reglas o variaciones se utilizarán.

Se elige un jugador para comenzar y el juego se mueve en el sentido de las agujas del reloj alrededor de la mesa. Cada jugador, por turno, tira los seis dados y comprueba si ha tirado algún dado o combinación de puntuación. (Consulte Puntuación a continuación). Cualquier dado que puntúe se puede dejar de lado y luego el jugador puede optar por tirar todos los dados restantes. El jugador debe dejar de lado al menos un dado de puntuación de su elección si es posible, pero no está obligado a dejar de lado todos los dados de puntuación.

Por ejemplo, si un jugador sacó 1-2-2-5-5-6 en su turno, podría dejar de lado el 1 y los dos 5 para anotar, o podría elegir dejar de lado solo el 1. Cualquier dado de puntuación que no se dejan de lado se pueden volver a tirar junto con los dados que no puntúan.

Si los seis dados se han reservado para puntuar (lo que se conoce como "dados calientes"), el jugador puede optar por lanzar los seis dados nuevamente y continuar sumando a su puntaje acumulado o puede depositar sus puntos, terminar su turno y pasar. los dados al siguiente jugador.

El turno de un jugador continúa hasta que decide detenerse (momento en el que obtiene sus puntos acumulados) o hasta que no tira ningún dado de puntuación en un lanzamiento.

Si un jugador no obtiene puntos en una tirada, esto se conoce como Farkle. Todos los puntos ganados hasta ese momento en ese turno se pierden y los dados se pasan al siguiente jugador.

Al final del turno de un jugador, se anotan los puntos que haya obtenido y los dados se pasan al siguiente jugador.

Puntuación:

**Consulte las Pautas de puntuación en la imagen de arriba**

Tenga en cuenta que las combinaciones de puntuación solo cuentan cuando se realizan con un solo lanzamiento. (Ejemplo: si un jugador saca un 1 y lo deja a un lado y luego saca tres 1 en su próximo lanzamiento, solo obtiene 400 puntos, no 1000).

A veces, una sola tirada proporcionará múltiples formas de anotar. Por ejemplo, un jugador que saca 1-2-4-5-5-5 podría obtener uno de los siguientes:

100 puntos para el 1

150 puntos por el 1 y el 5

500 puntos por los tres 5

600 puntos por el 1 y los tres 5

VICTORIOSO:

El primer jugador en anotar un total de 10,000 o más puntos gana, siempre que ningún otro jugador con un turno restante pueda superar ese puntaje.

Paso 2: esquema y cableado

blanco

Entonces, para comenzar este viaje, comencé por averiguar qué componentes quería usar para este juego. Sabía que tenía que haber una manera de seleccionar o anular la selección de dados durante cada ronda. En lugar de utilizar solo botones, pensé que sería genial usar algunas placas de sensores táctiles capacitivos que tenía por ahí. Me quedé con la idea de utilizar dos pulsadores para la función “roll” y la función “pass”.

Para mostrar el puntaje de la ronda actual y el puntaje total de cada jugador, elegí usar una pantalla de 7 segmentos de 4 dígitos y una pantalla OLED de 128 × 64 respectivamente. Agregué un zumbador piezoeléctrico para efectos de sonido. También planeé usar un Arduino Pro Mini como mi microcontrolador para el juego.

Para los 6 dados necesarios para el juego, elegí usar LED estándar de 3 mm (42 LED en total). El problema en este punto era cómo controlar los LED y la pantalla de 7 segmentos. Este increíble sitio web de Eberhard Fahle explica cómo utilizar los chips IC MAX7219 para controlar varios LED e incluso una pantalla de 7 segmentos. Recomiendo encarecidamente visitar ese sitio web para obtener información más completa sobre el hardware y el software de estos chips. Esencialmente, los chips implementan una interfaz SPI que solo requiere 3 pines de salida digital del Arduino, además de Vcc y GND. Cada chip puede manejar hasta 64 LED y debido a que estoy usando un total de 42 LED para el dado (6 dados x 7 LED por dado) y 28 LED para el segmento 7 (7 LED por segmento sin incluir el punto decimal x 4 segmentos ), elegí usar dos chips MAX7219 separados para esto. El uso de dos chips separados también facilitó mucho la programación del troquel y el segmento 7, ya que tenía el control individual de ambos.

Después de decidir qué componentes quería usar, creé un esquema en EasyEDA. Al usar la hoja de datos de la pantalla de 7 segmentos, así como el sitio web de Eberhard Fahle, averiguar a qué pines conectar los LED y la pantalla fue bastante sencillo. También me aseguré de encontrar mis componentes específicos en la biblioteca EasyEDA para que los pines fueran correctos y el tamaño apropiado. Adjunto el esquema como referencia.

Una vez que se completó el esquema, comencé a cablear el proyecto en mi tablero y ejecuté un código de prueba para ver si mi cableado era correcto. Si bien el OLED, el segmento 7, los dados y el sensor táctil capacitivo único funcionaron, fue un nido de ratas enorme, como se puede ver en las imágenes. En lugar de continuar trabajando a partir del prototipo de la placa de prueba, opté por crear una placa de circuito impreso para él. Esto me permitiría incorporar todos los componentes y facilitaría mucho la programación del juego.

Paso 3: Diseño y fabricación de PCB

blanco

Esta fue la primera vez que diseñé una PCB y elegí usar EasyEDA ya que era mi programa de elección para el esquema. Fue bastante intuitivo de usar, pero ciertamente usé algo de ayuda para comenzar. Aquí hay un buen video que me ayudó a comenzar. Una vez que se completó el esquema, presioné "convertir a PCB" en la barra de herramientas EasyEDA. A partir de ahí, se trataba de organizar los componentes de la manera que yo quería. Esto se logró seleccionando cada componente, arrastrándolo a donde deseaba y seleccionando en qué capa quería colocarlo.

Tenía la idea de que el juego sería portátil y pensé que sería mejor colocar los sensores táctiles capacitivos en los bordes exteriores de la PCB. Mi idea era colocar las placas del sensor táctil en la parte inferior de la PCB y crear un corte circular en la placa donde se mostraría el panel táctil. Luego coloqué los dados asociados de cada sensor en el medio, asegurándome de mantener cada LED del dado consistente en el tablero (por ejemplo, el primer LED para cada dado (A0, A1, A2, A3, A4 y A5) se colocó en la esquina superior derecha). También coloqué los dos botones en el frente, centré el segmento 7 y creé un recorte que encajaría en la pantalla OLED. También agregué el piezoeléctrico, las resistencias y los capacitores a la capa superior porque pensé que se veía genial. Finalmente, imprimí el logotipo de Farkle y la hoja de combinación de puntuación en la capa superior de seda para que los jugadores pudieran consultarlo según fuera necesario.

La parte posterior de la PCB contenía los 2 chips MAX7219, el Arduino Pro Mini, los sensores táctiles y el OLED. También agregué pines para un conector de barril y un conector JST para alimentar la placa. En el momento de diseñar la PCB, no estaba exactamente seguro de cómo quería potenciar el juego, así que me di esas dos opciones.

Una vez satisfecho con el diseño, utilicé la función de ruta automática para conectar cada componente según el esquema. ¡Luego generé los archivos Gerber y ordené los PCB a través de JLCPCB! Llegaron en tiempo y forma y quedé muy feliz con su aspecto.

Si está interesado en los archivos Gerber, ¡hágamelo saber y con gusto se los enviaré!

Paso 4: Programa Arduino

blanco

En mi opinión, crear el código fue la parte más desafiante de esta compilación. Hubo muchos aspectos, incluida la impresión en el segmento 7, la iluminación y el "lanzamiento" del dado, la creación de imágenes y la visualización de la puntuación en el OLED, el sonido del zumbador y, finalmente, la creación del juego en sí. Adjuntaré mi código a continuación e hice todo lo posible para comentar cada sección. ¡Está abierto para que lo uses y critiques! Voy a repasar cada componente principal brevemente:

7 segmentos y dados:

Una vez más, el sitio web de Eberhard Fahle sobre el uso de los chips MAX7219 fue crucial al escribir el código para controlar tanto el segmento 7 como el dado LED. En primer lugar, describe cómo inicializar cada chip y seguí esas instrucciones después de instalar sus bibliotecas "LEDControl.h", "binary.h" y "SPI.h". Incluyó un código de muestra en su sitio web sobre cómo imprimir números en el segmento 7 y lo modifiqué para mi uso. La función es "printNumber ()" en mi código.

En cuanto a los dados, esto fue un poco más complicado. Una forma sencilla de explicar cómo iluminar cada pipa de los dados es pensar en términos de una pantalla de 7 segmentos. Adjunté una imagen arriba, pero esencialmente cada segmento de una pantalla de 7 segmentos se puede asignar a la de un dado de 6 lados (ya que un solo dado de 6 lados requiere 7 LED). Una vez mapeado correctamente, pude determinar qué segmentos debían cambiarse a ALTO para crear los números 1-6. Esto me proporcionó los valores binarios para cada número. A partir de ahí, simplemente usé las funciones prefabricadas de Eberhard de su biblioteca para controlar el dado individual.

OLED:

Usé las bibliotecas GFX y SSD1306 de Adafruit, así como "Wire.h" para ayudar a mostrar puntajes/imágenes en el OLED. El OLED tenía un par de propósitos y creé algunas funciones para hacerlo. Esos propósitos incluían:

-Animación de bienvenida al inicio

-Pantalla para instruir a los jugadores sobre la selección de cuántos jugadores por juego

-Pantalla de puntuación que actualiza la puntuación de cada jugador después de una ronda de jugadores

-Pantalla "Farkle" mostrada cuando un jugador Farkles

-Pantalla de animación ganadora

Zumbador piezoeléctrico:

Usé las funciones tone() y noTone() de Arduino para agregar elementos de sonido a mi juego. Específicamente, agregué sonido en el inicio de la animación de bienvenida, cuando un jugador Farkles y en la animación ganadora. Además, agregué un breve sonido intermitente cuando un jugador pasa al siguiente jugador.

Jugabilidad de Farkle:

En mi opinión, lo más importante al diseñar el código del juego fue crear una función para evaluar la puntuación de los jugadores. Por ejemplo, digamos que un jugador "tira" el dado al comienzo de una ronda y el resultado es {1, 4, 5, 5, 6, 2}. Necesitaba crear una forma en la que el jugador pudiera seleccionar cualquier dado que quisiera, ejecutarlo a través de la función de puntuación y mostrar el valor del punto en el segmento 7 en tiempo real. Para hacer esto, un jugador tocaría el sensor táctil del dado asociado, ese dado individual se apagaría y el número seleccionado se colocaría en una nueva matriz que se organizaría en orden ascendente. Esa nueva matriz, ordenada de menor a mayor, luego se ejecutaría a través de mi función de puntuación para evaluar los puntos. Creé un algoritmo arriba que muestra este proceso.

Empecé comparando la matriz con las combinaciones con la mayor cantidad de dados necesarios para puntuar. Por ejemplo, comencé por ver si la matriz cumplía con los criterios para una escalera de 1-6, luego 6 iguales, luego 5 iguales, luego 4 iguales…, etc. Mi idea aquí era que un jugador con una escalera completa, por ejemplo {1, 2, 3, 4, 5, 6}, debe recibir 1500 puntos por la escalera en lugar de 150 puntos por el 1 y el 5. Si se cumplen los criterios para ser una escalera, entonces no incluso puntos de control para 1 y 5 individuales. En resumen, el programa funciona y procesa lo suficientemente rápido para un ritmo de juego regular. Estoy seguro de que existen métodos de programación más eficientes para realizar esta tarea y me encantaría saber de usted si tiene alguna idea. Si tiene otras preguntas sobre cómo/por qué hice algo en el código, también me complacerá responderlas.

Otra parte complicada fue la codificación de un jugador que quería continuar su ronda presionando el botón "tirar" si tenía una combinación de dados que resultó en puntos. Para esto, solo necesitaba animar la "tirada" del dado que no se seleccionó mientras mantenía igual la puntuación en el segmento 7. La verificación de puntos para esta "nueva" ronda es independiente de cualquier ronda anterior. Si no se otorgaban puntos después de cualquier lanzamiento/pase, ocurriría un Farkle y los puntos de los jugadores para esa ronda serían eliminados. Los ajustes de puntuación correctos debían tenerse en cuenta en el OLED.

Después de que finalicé la función de puntuación, el resto del juego fue bastante fácil de codificar. Solo estaba asegurándome de que el flujo del juego fuera correcto de un jugador a otro. Agregué una función para verificar si algún jugador anotó más de 10,000 puntos, momento en el cual los jugadores restantes tuvieron una última oportunidad de superar a su oponente. Finalmente, agregué una animación ganadora con sonido.

Descarga el código y súbelo a Arduino:

He adjuntado tanto el código ".ino" como el archivo ".c". Asegúrese de descargar ambos y colocarlos en la misma carpeta antes de cargarlos en su Arduino Pro Mini.

Nota : Tuve éxito al cargar mi código al Arduino Pro Mini usando Arduino versión 1.8.12. Cuando intenté cargarlo usando la versión 1.8.13, recibí un mensaje de "Error en la asignación de SSD1306" en el monitor serie. Esto me lleva a creer que hay algún problema con la memoria RAM (a pesar de que el programa no exceda el espacio disponible) que no permitirá que el programa se ejecute correctamente en la versión más reciente. Actualmente estoy trabajando en la optimización del programa para ahorrar espacio. Por ahora, cargue el programa usando 1.8.12 y no debería tener ningún problema.

Fuente: Farkle! Consola de juegos de PCB de mano

By Erica Flores

Enamorada de la tecnología. Apasionada de la velocidad que la información puede adquirir en este mundo cambiante. Actualmente residiendo en Barcelona.