Système cérébral

Récemment, divers types de jeux intellectuels gagnent en popularité: «Quoi? O?? Quand? »,« Melotrek »,« Brain ring ». Mais pour certains types de jeux, vous ne pouvez pas vous passer d'un système spécial qui contrôlera le déroulement du jeu. Ici, dans le cadre du projet de cours, ils ont décidé d'essayer de créer leur propre système cérébral.

Avant cela, nous n'avions jamais rencontré Arduino ou quelque chose de matériel, mais en regardant comment les amis et les connaissances de l'université assemblent facilement les appareils, nous voulions essayer de faire notre propre truc. Puisque nous étions assez loin de ce sujet, la proposition de monter un système cérébral a été lancée par notre leader, disant que ce serait un bon début pour nous. Étonnamment, cela s'est produit.

Pour commencer, nous avons déterminé l'objectif: le système cérébral devrait donner un signal sonore indiquant le début du temps du tour de questions et un signal indiquant la fin du temps du tour de questions, et devrait également signaler à l'hôte que le joueur est prêt à donner une réponse. Si un joueur a appuyé sur un bouton, les boutons restants sont bloqués. Il devrait également être possible de sélectionner un mode de jeu.



Composants requis


  • Arduino nano
  • ConfĂ©rencier
  • LED 8 pièces
  • 4 . 2
  • DIP-
  • :
  • 8 . – 100 ( )
  • 6 . – 10 ( )
  • 6 . – 1
  • 4 . – 470 DIP ( )
  • 5 . – ( )
  • – 6 . 1
  • Ethernet- 4 .
  • RJ-45 — 4.


Il convient de noter que le système peut être divisé en 3 blocs: le module principal, les boutons du lecteur (4 pièces) et les câbles de connexion. Le système contient 4 boutons de joueur. Si le joueur a réussi à appuyer plus tôt que les autres, alors la LED de son bouton s'allume.

Hôte distant. Si le joueur a appuyé sur un bouton de sa télécommande, la diode correspondant au bouton du joueur s’allume sur l’unité principale. Ce module sélectionne le mode de jeu. Le présentateur a deux boutons Démarrer et Réinitialiser. Selon le jeu, ces boutons s'allument et réinitialisent le chronomètre.

Les signaux Arduino proviennent des boutons. Si le bouton est enfoncé, la diode sur le bouton et sur la télécommande du maître s'allume et le signal sonore est activé. C'est le concept principal.

Les boutons et la console maître sont connectés par un câble Ethernet. Un bouton va au sol, une unité logique et un signal qui allume et éteint la LED, et un bouton vient du bouton vers le module principal, en appuyant sur le bouton.

Début du développement


Nous avons commencé avec le plus simple. Un circuit qui comprend une diode a été assemblé sur une planche à pain. Tout a fonctionné! Nous continuons. Nous avons connecté Arduino et des boutons, une fois pressés, les diodes s'allument. Et ici, nous sommes confrontés au problème du cliquetis des boutons.



Dans les boutons, vous devez supprimer le bavardage du signal, sinon le système pensera que le bouton est pressé plusieurs fois. Pour les boutons des joueurs, ce n'est pas très effrayant, nous attrapons toujours la première pression, mais sur le bouton du début de tête, vous devez vous débarrasser du rebond, car dans l'anneau cérébral, vous devez savoir combien de fois le début est appuyé. Pour ce faire, le déclencheur Schmitt, le condensateur et la résistance sont inclus dans le circuit du bouton. Vous pouvez lire sur le rebond ici .



Les boutons et le module principal utilisent des LED. Mais 5V est trop de tension pour eux. Par conséquent, pour empêcher la combustion des diodes, des résistances leur sont connectées en série. Vous pouvez calculer la résistance des résistances ici . Étant donné que toutes les LED sont identiques, nous avions besoin de 8 résistances de 100 ohms chacune.



Le mode de jeu est sélectionné à l'aide de DIP-SWITCH:

  1. Anneau de cerveau
  2. Quoi? O?? Quand?
  3. Scrabble quartet, Troika, Own game (le système fonctionne de la même manière dans ces jeux)

Partie logiciel


La paresse est la clé du succès.

Parallèlement au développement du circuit, un code a été écrit. Il était évident que les pressions sur les boutons devaient être gérées par des interruptions. En soustrayant environ 2 interruptions externes INT0 et INT1, nous avons été contrariés, car pour autant que 6 boutons, deux interruptions ne suffisent pas et vous devrez augmenter la profondeur de bits via le registre. Depuis que nous avons rencontré des choses matérielles en direct, tout était compliqué et incompréhensible pour nous. En général, nous n'étions pas très satisfaits de ce fait. Ne croyant pas que notre problème ne puisse être résolu d'aucune autre manière, nous sommes tombés sur des demandes d'interruption de changement de broche, qui étaient parfaites pour notre projet. Pas de registres!

Vous pouvez vous familiariser avec les interruptions ici .

Dans notre système cérébral, les boutons SET et RESET correspondent aux broches D8 et D9, et les boutons utilisateur correspondent à A0-A3. Par conséquent, nous n'avons défini que deux gestionnaires d'interruptions pour chacun des groupes d'interruptions utilisés.

  • ISR (PCINT0_vect) - pour les boutons principaux.
  • ISR (PCINT1_vect) - pour les boutons personnalisĂ©s.

Des interruptions peuvent être définies pour chaque groupe et chaque broche individuellement. Cela se fait par les registres de contrôle et les masques, dans lesquels il est nécessaire de définir les valeurs correspondantes. Pour plus d'informations sur la définition et la résolution des interruptions, voir ici .

Les gestionnaires d'interruption interrogent les broches une par une pour déterminer le bouton sur lequel vous avez appuyé. Cette situation est l'une des limites de ces interruptions. Le système cérébral doit répondre aux pressions sur les boutons, de sorte que la valeur de la broche est comparée au niveau HAUT (c'est-à-dire que le bouton a été enfoncé) dans le gestionnaire d'interruption.

Paramètres d'interruption
ISR(PCINT0_vect) {
	noInterrupts();
	isPushed = false;
	if (digitalRead(ADMIN_BUTTON_SET) == HIGH ) {	
		gameMode->Set();
		Timer1.attachInterrupt(TimerInterrupt);
		gameMode->SetFalseStart(false);
	}
	if (digitalRead(ADMIN_BUTTON_RESET) == HIGH) {
		Timer1.stop();
		gameMode->Reset();
		gameMode->SetFalseStart(true);
	}
	interrupts();
}

ISR(PCINT1_vect){
	noInterrupts();	
	if (isPushed == false){
		for (int i = 0; i < ARRAY_SIZE(ARRAY_USER_BUTTON); i++){
			if (digitalRead(ARRAY_USER_BUTTON[i]) == HIGH){
				isPushed = gameMode->UserButtonPushed(ARRAY_LED[i]);
			}
		}		
	}	
	interrupts();
}


Tout le code est ici .

L'installation


Nous avons vu le fer à souder pour la première fois, nous avons donc commencé avec une diode traditionnelle. Nous avons soudé - la diode a pris feu! Ensuite, les boutons ont été soudés. Vérifier que tout a été fait correctement était assez difficile, car le module principal était toujours sur la planche à pain.



Les boutons principaux, les diodes, le commutateur de mode de jeu ont été soudés. Dans le processus, nous avons réalisé qu'il était possible de se débrouiller avec un déclencheur Schmitt. Ensuite, il doit être transféré au module principal, lui apporter les sorties des boutons via un câble réseau, et les signaux de sa sortie doivent être envoyés à l'Arduino.





En général, l'unité principale était prête. Mais il n'était toujours pas connecté avec les boutons des joueurs. Nous avons pris la carte native du routeur comme base pour l'unité principale, dans laquelle il était avantageux d'utiliser des connecteurs RJ-45. Même si nous l'avons un peu regretté, car couper une planche et souder des contacts au second tour n'est pas une expérience agréable. Mais tout s'est plutôt bien passé.

Nous avons utilisé un conducteur blanc-orange pour la transmission logique 1, orange pour le logique 0, un signal blanc-vert à la diode et un signal de bouton vert. Bien que vous puissiez en utiliser n'importe quel, l'essentiel est de vérifier quel câble est utilisé, car il existe différentes options de sertissage.

Maintenant, le module principal et les boutons étaient connectés et le système était presque prêt, mais il y avait un bug qui n'était pas sur la planche à pain. Si le bouton n'était pas connecté au module principal, le système pensait que ce bouton était enfoncé. Sur Internet, nous avons trouvé une solution - une résistance de rappel.

Pour que «aucun» signal ne parvienne à Arduino (lorsque le bouton n'est pas connecté du tout) dans le module principal, vous devez mettre une résistance de rappel (à partir de 10 kOhm) sur chaque sortie de bouton. Avec un circuit ouvert, un courant indésirable passera par la résistance à la terre, et lorsqu'il est fermé en raison de la résistance élevée de la résistance, le signal ira au contact d'entrée.

Après avoir résolu ce problème, cela a fonctionné.



Caractéristiques du mode de jeu


Caractéristiques de l'anneau cérébral. Si le démarrage n'a pas été pressé, le système définit la pression sur le bouton comme un faux départ. Si le démarrage est pressé la première fois, le système attendra 20 secondes pour que les boutons soient pressés, après un certain temps, le système déclenchera une alarme. Si pendant ce temps, l'équipe connaît toujours la bonne réponse et appuie sur le bouton, le signal correspondant retentit et le chronomètre s'arrête à son tour. Conformément aux règles, en cas de réponse incorrecte, les autres équipes devraient pouvoir répondre. Pour ce faire, après une seconde pression sur le départ, la minuterie démarre pendant 10 secondes. Le bouton Reset réinitialise le système, il est pressé avant de lire la question suivante.

Caractéristiques Quoi? O?? Quand?


Après avoir appuyé sur Démarrer, un signal sonore retentit. Un signal acoustique retentit après 50 et 60 secondes. Dans d'autres jeux, seuls les boutons du joueur sont capturés. Grâce à la commodité de travailler avec Arduino, vous pouvez implémenter d'autres jeux: changer la minuterie, activer le faux démarrage, etc. cela peut être implémenté en ajoutant le code approprié.




Conclusion


Cela fonctionne et Dieu merci. Comme il s'agissait de notre première expérience matérielle, nous sommes satisfaits des résultats. Et pas seulement parce que tout fonctionnait connecté sur une planche à pain, mais aussi comme un appareil entièrement assemblé. Un système cérébral à part entière avec des modes, des joueurs et un présentateur a été publié. Pour améliorer le système, vous pouvez ajouter une sortie pour les haut-parleurs afin de pouvoir jouer dans les grands tournois.
Quant à la carte Arduino, elle était facile et agréable à travailler. Sur Internet, il y a suffisamment d'informations et de tutoriels simples sur l'assemblage de pièces utiles et intéressantes qui ne sont pas les plus faciles pour une personne ignorante. Cela pourrait bien devenir un passe-temps.

Oksana Kozlova et Marina Bardiyan ont participé au projet.

Source: https://habr.com/ru/post/fr394359/


All Articles