Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Breadboard to PCB Part 1 - Making the Simon Says Game

Composants et fournitures

Arduino UNO
× 1
Planche à pain sans soudure pleine grandeur
× 1
LED (générique)
× 4
Interrupteur à bouton-poussoir SparkFun 12mm
× 4
Sonnerie
× 1
Câbles de raccordement (générique)
× 12
Résistance 10k ohm
× 4
Résistance 330 ohm
× 4
Câble USB-A vers B
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

Présentation

Nous avons tous vu le vieux jeu Simon Says, où vous essayez de copier une séquence de lumières en appuyant sur le bouton qui correspond à la bonne séquence de lumières. Pour Hackster Live, nous avons présenté un outil de conception de PCB appelé Upverter. Il s'agit d'un projet amusant et simple à créer et à transformer en PCB. Vous trouverez ci-dessous le projet de base montrant la création du jeu avec le matériel et le code.

Il y a trois parties à cette série de projets.

  • Partie 1 : Créer le jeu Simon Says
  • Partie 2 : Concevoir un PCB basé sur le jeu Simon Says en utilisant Upverter
  • Partie 3 : Fraisez votre propre PCB à partir de la conception que vous avez créée sur Upverter

Ce que vous apprendrez dans cette série

  • Comment mettre en place un projet de base sur une maquette
  • Comment disposer un PCB dans Upverter
  • Comment fraiser votre propre PCB à l'aide d'une machine CNC

Logiciel

Si vous n'avez pas l'IDE Arduino pour écrire et télécharger du code sur votre Arduino, téléchargez la dernière version pour votre système d'exploitation ici.

Configuration du matériel

J'ai utilisé l'exemple du kit de l'inventeur de Sparkfun comme source d'inspiration pour ma configuration matérielle et je l'ai légèrement ajusté. Consultez le diagramme de Fritzing ci-dessous.

Code

La chose amusante à propos de ce jeu est que vous pouvez avoir tellement de variantes. Comme je l'ai mentionné ci-dessus, j'ai utilisé l'exemple de Sparkfun comme point de départ pour ma configuration matérielle et j'ai écrit le code à partir de zéro. Si écrire votre propre code ne vous intéresse pas, vous pouvez utiliser le mien ci-dessous, utiliser le code de Sparkfun dans l'exemple mentionné ci-dessus avec quelques ajustements, ou rechercher d'autres jeux/codes Simon qui fonctionneront avec votre configuration matérielle .

J'ai inclus des commentaires détaillés et les lignes d'impression Serial de débogage dans mon code, afin que vous puissiez voir ce qui se passe sur le moniteur Serial pendant que le jeu est en cours d'exécution. Regardez la vidéo du jeu Simon Says en action ci-dessous !

Simon dit vidéo de jeu

*Remarque :Dans cette vidéo, j'ai défini le nombre de lumières d'affilée dont j'avais besoin pour gagner à 5. Cela peut être modifié pour rendre le jeu plus difficile, mais je voulais que ma vidéo soit relativement courte :).

Vous êtes maintenant prêt à transformer votre maquette en PCB ! Apprenez comment dans Breadboard to PCB Part 2 - Concevoir un PCB à l'aide d'Upverter.

Code

  • Simon dit le code Arduino
Simon dit le code ArduinoArduino
 int ledArray[] ={12, 9, 5, 2} ;// ledArray[0] est vert, ledArray[1] est rouge, ledArray[2] est jaune et ledArray[3] est bleu. int buttonArray[] ={13, 10, 6, 3};// buttonArray[0] est vert, buttonArray[1] est rouge, buttonArray[2] est jaune et buttonArray[3] est bleu. int pinCount =4; // les deux ledArray et buttonArray ont le même pinCount --> utilisez ceci pour les deux boutons et leds int buzzer =8; int ledState =0; int gameState =0; #define NUMBERTOWIN 5 //Nombre de lumières que vous devez faire correspondre pour gagner --> Vous pouvez modifier ce nombre pour rendre le jeu plus ou moins difficile à gagner int gameValues[NUMBERTOWIN]; int roundNum =0; non signé long précédentMillis =0 ; // besoin de ceci pour l'état d'avant-jeu pour les lumières clignotantes sans délai --> si vous utilisez le délai, votre appui sur le bouton pour démarrer le jeu peut ne pas être remarqué intervalle long non signé1 =500 ; //en a besoin pour le temps entre les clignotements //déclare les fonctionsvoid setLed(int ledNum);void displayClue(int roundNum);boolean waitForInput(int buttonNum); void setup () {Serial.begin(9600);Serial.println("setup"); for(int Pin =0; Pin  la fonction setLed() indique que si ledNum est <0 led est FAIBLE setLed(-1); //mettre le numéro du tour à zéro pour que vous commenciez au premier tour roundNum =0; retard (1000); //définir gameState sur 1 gameState =1; } } if (gameState ==1) { gamePlay(); } if (gameState ==2) { //Vous gagnez !! - jouez le son gagnant et faites défiler les leds (winDisplay) 3 fois, puis perdez l'affichage une fois pour une bonne transition. //délai pour donner au joueur le temps de relâcher la pression sur le bouton avant de gagner le son joue delay(500); son_gagnant(); winAffiche(); winAffiche(); winAffiche(); perdreAffichage(); Serial.println("winDisplay"); //retard brièvement avant d'exécuter pre_game delay (1000); // réinitialiser gameState à zéro pour appeler pre_game gameState =0; } if (gameState ==3) { //Vous perdez :( - jouez en perdant le son et les leds flash (loseDisplay) 3 fois pour une bonne transition. //délai pour donner au joueur le temps de relâcher le bouton avant de perdre le son retarde la lecture (500); Lose_sound (); LoseDisplay (); LoseDisplay (); LoseDisplay (); Serial.println ("loseDisplay"); // retarder brièvement avant d'exécuter pre_game delay (1000); // réinitialiser gameState à zéro pour appeler pre_game gameState =0; } }//pre_gamevoid pre_game(){ //Vérifiez si suffisamment de temps s'est écoulé entre les voyants allumés long non signé currentMillis =millis(); if (currentMillis - previousMillis> interval1) { //si suffisamment de temps s'est écoulé, mettez à jour les lumières if ( ledState ==0) { Serial.println("pre green"); setLed(0); ledState =1; } else if (ledState ==1) { Serial.println("pre red"); setLed(1); ledState =2; } else if (ledState ==2) { Serial.println("pre yellow"); setLed(2); ledState =3; } else if (ledState ==3) { Serial.println("pre blue "); setLed(3); ledState =0; } //réinitialiser l'heure previousMillis =currentMillis; }}//fonction pendant la lecture du jeuvoid gamePlay(){ Serial.println("gamePlay"); //précharger le tableau avec des nombres aléatoires pour le jeu pour ( int i=0; i si un bouton est enfoncé, passez au reste du code if (!button0 || !button1 || !button2 || !button3) { //Délai brièvement pour éviter un double comptage délai d'appui sur le bouton ( 250); // allume la led correspondante lorsqu'un bouton est enfoncé if (buttonNum ==0) { digitalWrite(ledArray[0], HIGH); retard (250); digitalWrite(ledArray[0], LOW); } else if (buttonNum ==1) { digitalWrite(ledArray[1], HIGH); retard (250); digitalWrite(ledArray[1], LOW); } else if (buttonNum ==2) { digitalWrite(ledArray[2], HIGH); retard (250); digitalWrite(ledArray[2], LOW); } else if (buttonNum ==3) { digitalWrite(ledArray[3], HIGH); retard (250); digitalWrite(ledArray[3], LOW); } //vérifier si le bon bouton a été enfoncé if (buttonNum ==0 &&button0 ==0) { Serial.println("0 Pressed"); renvoie vrai ; } else if (buttonNum ==1 &&button1 ==0) { Serial.println("1 Pressé"); renvoie vrai ; } else if (buttonNum ==2 &&button2 ==0) { Serial.println("2 Pressed"); renvoie vrai ; } else if (buttonNum ==3 &&button3 ==0) { Serial.println("3 Pressed"); renvoie vrai ; } else { return false; } } }}//after win - faire défiler les lumières rapidementvoid winDisplay(){digitalWrite(ledArray[0], HIGH);delay(75);digitalWrite(ledArray[0], LOW);delay(75);digitalWrite(ledArray [1], HIGH);délai (75);digitalWrite(ledArray[1], LOW);délai(75);digitalWrite(ledArray[2], HIGH);délai(75);digitalWrite(ledArray[2], LOW );delay(75);digitalWrite(ledArray[3], HIGH);delay(75);digitalWrite(ledArray[3], LOW);delay(75);digitalWrite(ledArray[2], HIGH);delay(75 );digitalWrite(ledArray[2], LOW);délai(75);digitalWrite(ledArray[1], HIGH);délai(75);digitalWrite(ledArray[1], LOW);délai(75);digitalWrite(ledArray [0], HIGH);delay(75);digitalWrite(ledArray[0], LOW);delay(75);}void winner_sound(void){ //tone (numéro de broche, fréquence - j'ai recherché ceci en ligne pour trouver la fréquence pour les notes que je voulais, la durée de la mélodie) Serial.println("buzzer1"); tonalité (buzzer, 294, 250); retard (200); tonalité (buzzer, 294, 250); retard (200); tonalité (buzzer, 294, 250); retard (200); tonalité (buzzer, 392, 500); retard (500); Serial.println("second 392"); tonalité (buzzer, 392, 250); retard (200); tonalité (buzzer, 440, 250); retard (200); tonalité (buzzer, 392, 250); retard (200); tonalité (buzzer, 440, 250); retard (200); tone(buzzer, 494, 500);}void loseDisplay(){ digitalWrite(ledArray[0], HIGH); digitalWrite(ledArray[1], HAUT); digitalWrite(ledArray[2], HAUT); digitalWrite(ledArray[3], HAUT); retard (200); digitalWrite(ledArray[0], LOW); digitalWrite(ledArray[1], LOW); digitalWrite(ledArray[2], LOW); digitalWrite(ledArray[3], LOW); delay(200);}void lost_sound(void){ Serial.println("losing_sound"); tonalité (buzzer, 98, 250); retard (250); tonalité (buzzer, 93, 250); retard (250); tonalité (buzzer, 87, 250); retard (250);}

Schémas

simon_says_fritzing_Yb8EdKPqD4.fzz

Processus de fabrication

  1. Jeu de gyroscope Arduino avec MPU-6050
  2. Dés numériques Arduino
  3. Jeu de roulette DIY 37 LED
  4. Contrôleur de jeu Arduino
  5. Jeu de manette
  6. Détecteur de portée portable
  7. Jeu Pixel Chaser
  8. Fabrication 101 :Faire partie de l'industrie aérospatiale
  9. Processus impliqués dans la fabrication de PCB à 4 couches - Partie 2