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

Tennis virtuel Arduino

Composants et fournitures

Arduino Nano R3
× 2
SparkFun 9DoF Sensor Stick
× 1
Câbles de raccordement (générique)
× 1
Bande NeoPixel
× 1
Module Bluetooth HC-05
× 1
Batterie 9V (générique)
× 1

Outils et machines nécessaires

Fer à souder (générique)

Applications et services en ligne

Arduino IDE

À propos de ce projet

Ce projet comporte 3 parties :le plateau/écran de jeu, le contrôleur et le routeur maître (script Python).

Partie 1 - L'affichage

L'écran est une matrice néopixel 15x10 qui fonctionne à partir d'un Arduino Nano. Il gère la logique du jeu et les entrées du script Python s'exécutant à partir d'un ordinateur hôte. Il affiche une balle qui grandit et se déplace plus loin dans la matrice, ce qui donne une illusion de profondeur et de la balle venant vers vous. S'il détecte que la balle est touchée, la balle sera redessinée et s'éloignera de vous.

Points

La direction de la balle (gauche ou droite) change à chaque coup. Si vous manquez la balle, le COM obtient un point, mais si le COM manque (une chance de 25 %), vous obtenez le point. Cette conception de jeu est similaire à la version Wii Sports du tennis. Les points sont affichés chaque fois que le COM marque contre le joueur.

Score élevé

Il existe un score élevé en cours d'exécution qui est stocké sur une EEPROM I2C, à l'adresse 0x04. Il conserve un octet qui détient le score le plus élevé. Si vous obtenez un score plus élevé que le score élevé précédent, il écrase l'adresse. Si le COM obtient un score de 10, c'est game over... Si cela prête à confusion, j'ai fait un tableau logique :

Créer la matrice

La création de la matrice prendra un certain temps, alors suivez le guide que j'ai fait ici.

Partie 2 - Le contrôleur

Le contrôleur est un autre Arduino Nano doté d'une clé 9DoF (3v3 uniquement!) Si l'accélération de l'axe x ou y est supérieure à un seuil spécifié, il envoie un « 1 » via série au PC hôte, où il est relayé à l'écran. Le Nano prend une lecture de l'accéléromètre x et y à un intervalle défini où il vérifie ensuite si les valeurs sont supérieures ou inférieures à 1,5 gramme. Pour accéder à la clé I2C 9 DoF, vous devez installer la bibliothèque Sparkfun qui peut être téléchargée ici. Il existe également un tutoriel sur la façon de connecter le capteur et d'exécuter des programmes de base avec celui-ci ici.

Pour construire la raquette, j'ai utilisé une boîte, puis j'ai découpé une forme de raquette sur un morceau de carton. À partir de là, c'était facile - il suffit de mettre un morceau de papier blanc sur le carton découpé et de dessiner un motif sur le papier. J'ai utilisé une batterie 9v pour alimenter la configuration, assurez-vous simplement de faire passer la batterie à travers la broche Vin du Nano, sinon ce sera un 9v non régulé ! Voici une photo de l'intérieur de la raquette :

Communiquez via Bluetooth

Alors maintenant, vous vous demandez peut-être ce qui contrôle cette opération complexe ? Comment la raquette communique-t-elle avec l'écran ? Voici un secret :ils ne se parlent pas ! Il existe un script Python simple qui utilise le port COM Bluetooth entrant et le port COM de la matrice pour relayer les informations entre eux. Cela aide également à synchroniser les deux systèmes, car ils se réinitialisent tous les deux lorsque les ports série s'initialisent. La raquette envoie un "1" au script Python via Bluetooth, puis le script Python envoie un "1" à la matrice. Il y a un anti-rebond de 1 seconde pour que les ports série ne débordent pas leurs tampons (ils n'ont que des tampons 32 bits).

La raquette

Cliquez sur les images pour découvrir comment j'ai construit la raquette :

Amusez-vous avec votre nouveau jeu de tennis !

Une vidéo de tennis en cours de lecture :

Code

  • Code matriciel
  • Code de la raquette
  • Code Python
Code matricielC/C++
Va sur l'Arduino attaché à la matrice.
#include #include #include #include #include #define PIN 6 //Broche de données pour la matrice#define EEPROM_ADR 0x50 //L'adresse I2C de l'EEPROM#define HS_ADR 0x02 //L'adresse de l'octet highscore dans l'EEPROM#define NOTE_C1 33#define SPKR_PIN 3Adafruit_NeoMatrix matrice =Adafruit_NeoMatrix(15, 10, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800); int ball_x =7 ; //Coordonnée X de la balle ball_y =2; //Rayon de la coordonnée Y de la balle =1; //Rayon de la balle r_incr =1; // De combien augmenter le rayon par bool isSwung =false; //Est-ce que la raquette est balancée ball_x_dir =1 ; //Direction X de la balle ball_y_dir =1; //Direction Y de la balle bool isDirRight =true;int score =0; //Le score du jeu en cours COM_score =0;int highscore =0; //Le score le plus élevé de tous les framerate de gamesint =50; // Combien de ms entre chaque frameint serial_data;String score_string ="";uint16_t colours[] ={matrix.Color(255,0,0),matrix.Color(0,255,0),matrix.Color(150,200,0) };int melody[] ={0};int tempo[] ={0};static unsigned long lastFrame =0;void setup(){ Serial.begin(9600); matrice.begin(); matrice.fillScreen(0); matrice.setTextColor(couleurs[1]); randomSeed(analogRead(A2)); afficher_scores(); score élevé =read_HS(); Serial.println(meilleur score,DEC); matrice.setCursor(0,1) ; matrice.print("HS:"); matrice.show(); retard(1000); matrice.fillScreen(0); matrice.setCursor(0,1) ; matrice.print(meilleur score,DEC); matrice.show(); retard(1000); score_string ="";}boucle vide(){ if((lastFrame+framerate)=5 &&ball_y <7 &&isSwung){ if(isDirRight){ ball_x_dir =-1; ball_y_dir =-1; } else if(!isDirRight){ ball_x_dir =1; ball_y_dir =-1; } r_incr =-1; } else if(ball_y>=8){ COM_score +=1; end_round(); } else if(ball_y <=2){ isDirRight =!isDirRight; int randNum =aléatoire(4) ; Serial.println(randNum); if(randNum ==2){ //25% de chances que le score COM manque +=1 ; if(score> highscore){ write_HS(); } end_round; } else{ if(isDirRight){ ball_x_dir =1; ball_y_dir =1; } else if(!isDirRight){ ball_x_dir =-1; ball_y_dir =1; } r_incr =1; } } ball_x +=ball_x_dir; ball_y +=ball_y_dir; rayon +=r_incr; matrice.fillScreen(0); matrice.fillCircle(ball_x,ball_y,rayon,couleurs[2]); matrix.show();}void end_round(){ if(COM_score>=10){ end_game(); } isDirRight =true; r_incr =1 ; ball_x_dir =1; ball_y_dir =1; boule_x =7 ; ball_y =2; rayon =1 ; afficher_scores(); matrice.fillScreen(0); matrice.fillCircle(ball_x,ball_y,rayon,couleurs[2]); matrice.show(); }void end_game(){ matrix.fillScreen(0) ; matrice.setCursor(0,1) ; matrice.setTextColor(couleurs[0]); matrice.drawLine(3,0,12,9,couleurs[0]); matrice.drawLine(11,0,2,9,couleurs[0]); matrice.show(); retard (500); while(1){ }}void display_scores(){ matrix.fillScreen(0); matrice.setTextColor(couleurs[1]); matrice.setCursor(0,1) ; score_string =Chaîne(score) + "-" + Chaîne(COM_score); scrollText(score_string); matrice.fillScreen(0); retard (2000); matrix.show();}void scrollText(String text){ int pass =0; entier x =matrice.largeur(); for(int i=0;i<24;i++){ matrice.fillScreen(0); matrice.setCursor(x,2) ; matrice.print(texte); x -=1 ; matrice.show(); retard (150); }}void write_HS(){ EEPROM.write(0x04,int(score));}int read_HS(){ byte HS =EEPROM.read(0x04); //Lire depuis l'adresse 4 return HS;}
Code de la raquetteC/C++
#include #include #include LSM9DS1 imu;#define LSM9DS1_M 0x1E // Serait 0x1C si SDO_M est FAIBLE#define LSM9DS1_AG 0x6B // Serait 0x6A si SDO_AG est LOW#define PRINT_SPEED 10 // 10 ms entre les vérificationsstatic unsigned long lastPrint =0; // Gardez une trace de l'impression timefloat accelx =0;float accely =0;void setup() { // mettez votre code de configuration ici, à exécuter une fois:Serial.begin(9600);imu.settings.device.commInterface =IMU_MODE_I2C; imu.settings.device.mAddress =LSM9DS1_M; imu.settings.device.agAddress =LSM9DS1_AG; if (!imu.begin()) { // échec pendant (1); }}void loop() { if ((lastPrint + PRINT_SPEED) =1.5){ Serial.print(1); retard (600); } else if(accely <=-1.5 || accely>=1.5){ Serial.print(1); retard(600);}}
Code PythonPython
import serialimport timematrix_port ="COM3"raquet_port ="COM9"matrix =serial.Serial(matrix_port, 9600)racquet =serial.Serial(raquet_port,9600)time.sleep(10)tandis que 1:data =racquet.read( ) print data if data =="1":print "hit" matrix.write("1") time.sleep(1) time.sleep(.05)

Schémas


Processus de fabrication

  1. Détecteur de langage TinyML basé sur Edge Impulse et Arduino
  2. Jeu de gyroscope Arduino avec MPU-6050
  3. Dés numériques Arduino
  4. Iron Man
  5. Trouvez-moi
  6. Contrôle de l'humidificateur Arduino
  7. Sonar utilisant arduino et affichage lors du traitement de l'IDE
  8. MobBob :Robot Arduino DIY contrôlé par smartphone Android
  9. Lampe de bureau réactive audio Arduino