Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Virtuelles Arduino-Tennis

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 2
SparkFun 9DoF Sensorstick
× 1
Jumper (generisch)
× 1
NeoPixel-Streifen
× 1
HC-05 Bluetooth-Modul
× 1
9-V-Batterie (generisch)
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Dieses Projekt besteht aus 3 Teilen:dem Spielbrett/Display, dem Controller und dem Master-Router (Python-Skript).

Teil 1 - Das Display

Das Display ist eine 15x10 Neopixel-Matrix, die von einem Arduino Nano läuft. Es verarbeitet die Spiellogik und die Eingaben des Python-Skripts, das auf einem Host-Computer ausgeführt wird. Es zeigt einen Ball, der wächst und sich weiter nach unten in der Matrix bewegt, was eine Illusion von Tiefe und dem Ball vermittelt, der auf Sie zukommt. Wenn es erkennt, dass der Ball getroffen wurde, wird der Ball neu gezogen und geht von Ihnen weg.

Punkte

Die Richtung des Balls (entweder links oder rechts) ändert sich mit jedem Schlag. Wenn Sie den Ball verfehlen, bekommt der COM einen Punkt, aber wenn der COM verfehlt (eine Chance von 25%), erhalten Sie den Punkt. Dieses Spieldesign ähnelt der Wii Sports-Version von Tennis. Die Punkte werden angezeigt, wenn der COM gegen den Spieler punktet.

Highscore

Es gibt einen laufenden Highscore, der auf einem I2C-EEPROM in der 0x04-Adresse gespeichert ist. Es behält ein Byte, das den Highscore enthält. Wenn Sie eine höhere Punktzahl als der vorherige Highscore erzielen, wird die Adresse überschrieben. Wenn der COM eine Punktzahl von 10 erreicht, ist das Spiel vorbei... Wenn das verwirrend ist, habe ich ein Logikdiagramm erstellt:

Mach die Matrix

Das Erstellen der Matrix wird einige Zeit in Anspruch nehmen, folge also der Anleitung, die ich hier erstellt habe.

Teil 2 - Der Controller

Der Controller ist ein weiterer Arduino Nano, an den ein 9DoF-Stick (nur 3v3) und ein HC-05 BLE-Modul angeschlossen sind. Wenn die Beschleunigung der x- oder y-Achse größer als ein bestimmter Schwellenwert ist, sendet es eine '1' seriell an den Host-PC, wo sie an das Display weitergeleitet wird. Der Nano misst den x- und y-Beschleunigungsmesser in einem festgelegten Intervall und prüft dann, ob die Werte über oder unter 1,5 Gramm fallen. Um auf den I2C 9 DoF-Stick zuzugreifen, müssen Sie die Sparkfun-Bibliothek installieren, die hier heruntergeladen werden kann. Hier gibt es auch eine Anleitung zum Anschließen des Sensors und zum Ausführen von Basisprogrammen.

Um den Schläger zu bauen, habe ich eine Schachtel verwendet und dann auf einem Stück Pappe eine Schlägerform ausgeschnitten. Von da an war es einfach - einfach ein weißes Stück Papier über den Pappausschnitt legen und ein Design über das Papier zeichnen. Ich habe eine 9-V-Batterie verwendet, um das Setup mit Strom zu versorgen. Stellen Sie nur sicher, dass die Batterie durch den Vin-Pin des Nano läuft, sonst handelt es sich um eine ungeregelte 9-V-Batterie! Hier ist ein Bild der Einbauten im Schläger:

Über Bluetooth kommunizieren

Sie fragen sich jetzt vielleicht, was diesen komplexen Vorgang steuert? Wie kommuniziert der Schläger mit dem Display? Hier ist ein Geheimnis:Sie reden nicht miteinander! Es gibt ein einfaches Python-Skript, das den eingehenden Bluetooth-COM-Port und den Matrix-COM-Port verwendet, um Informationen zwischen ihnen weiterzugeben. Es hilft auch, die beiden Systeme zu synchronisieren, da beide zurückgesetzt werden, wenn die seriellen Ports initialisiert werden. Der Schläger sendet über Bluetooth eine „1“ an das Python-Skript, und dann sendet das Python-Skript eine „1“ an die Matrix. Es gibt eine Entprellung von 1 Sekunde, damit die Puffer der seriellen Ports nicht überlaufen (sie haben nur 32-Bit-Puffer).

Der Schläger

Klicken Sie sich durch die Bilder, um zu erfahren, wie ich den Schläger gebaut habe:

Viel Spaß mit deinem neuen Tennisspiel!

Ein Video von Tennisspielen:

Code

  • Matrix-Code
  • Schlägercode
  • Python-Code
Matrix-CodeC/C++
Geht auf den Arduino, der mit der Matrix verbunden ist.
#include #include #include #include #include #define PIN 6 //Datenpin für Matrix#define EEPROM_ADR 0x50 //Die I2C-Adresse des EEPROM#define HS_ADR 0x02 //Die Adresse des Highscore-Bytes im EEPROM#define NOTE_C1 33#define SPKR_PIN 3Adafruit_NeoMatrix matrix =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; // X-Koordinate des Balls ball_y =2; // Y-Koordinatenradius des Balls =1; //Kugelradiusint r_incr =1; //Um wie viel Radius vergrößert werden soll bybool isSwung =false; // Ist der Schläger geschwungen ball_x_dir =1; // X-Richtung des Ballsint ball_y_dir =1; //Y-Richtung des Balls isDirRight =true;int score =0; //Die Punktzahl des aktuellen Spielsint COM_score =0;int Highscore =0; //Der Highscore aller Spieleint Framerate =50; //Wie viele ms zwischen jedem Frameint serial_data;String score_string ="";uint16_t colors[] ={matrix.Color(255,0,0),matrix.Color(0,255,0),matrix.Color(150,200,0) };int melodie[] ={0};int tempo[] ={0};statisch unsigned long lastFrame =0;void setup(){ Serial.begin(9600); matrix.begin(); matrix.fillScreen(0); matrix.setTextColor(Farben[1]); randomSeed (analogRead (A2)); display_scores(); Highscore =read_HS(); Serial.println (Highscore, DEC); matrix.setCursor(0,1); matrix.print("HS:"); matrix.show(); Verzögerung (1000); matrix.fillScreen(0); matrix.setCursor(0,1); matrix.print (Highscore, DEC); matrix.show(); Verzögerung (1000); score_string ="";}void loop(){ 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; aufrechtzuerhalten. Sonst if(ball_y>=8){ COM_score +=1; end_round(); } else if(ball_y <=2){ isDirRight =!isDirRight; int randNum =random(4); Serial.println (randNum); if(randNum ==2){//25% Chance, dass COM Punktzahl fehlt +=1; if (Score> Highscore) { write_HS (); } end_round; aufrechtzuerhalten. Sonst { 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; Radius +=r_inkr; matrix.fillScreen(0); matrix.fillCircle(ball_x,ball_y,radius,colors[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; ball_x =7; ball_y =2; Radius =1; display_scores(); matrix.fillScreen(0); matrix.fillCircle(ball_x,ball_y,radius,colors[2]); matrix.show(); }void end_game () { matrix.fillScreen (0); matrix.setCursor(0,1); matrix.setTextColor(colors[0]); matrix.drawLine(3,0,12,9,colors[0]); matrix.drawLine(11,0,2,9,colors[0]); matrix.show(); Verzögerung (500); while(1){}}void display_scores(){ matrix.fillScreen(0); matrix.setTextColor(Farben[1]); matrix.setCursor(0,1); score_string =String(Score) + "-" + String(COM_score); scrollText(Score_string); matrix.fillScreen(0); Verzögerung (2000); matrix.show();}void scrollText(String text){int pass =0; int x =matrix.width(); for(int i=0;i<24;i++){matrix.fillScreen(0); matrix.setCursor(x,2); matrix.print (Text); x –=1; matrix.show(); Verzögerung (150); }}void write_HS () { EEPROM.write (0x04,int (Score));}int read_HS () { Byte HS =EEPROM.read (0x04); //Lesen von Adresse 4 return HS;}
Racquet-CodeC/C++
#include #include #include LSM9DS1 imu;#define LSM9DS1_M 0x1E // wäre 0x1C wenn SDO_M LOW ist#define LSM9DS1_AG 0x6B wenn // . wäre 0x6A SDO_AG ist LOW#define PRINT_SPEED 10 // 10 ms zwischen checkstatic unsigned long lastPrint =0; // Verfolgen Sie die Druckzeitfloat accelx =0;float accely =0;void setup () { // Geben Sie Ihren Setup-Code hier ein, um ihn einmal auszuführen: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()) { // fehlgeschlagen while (1); aufrechtzuerhalten Rufen Sie die // readAccel()-Funktion auf. Wenn es beendet wird, aktualisiert es die // Variablen ax, ay und az mit den aktuellsten Daten. imu.readAccel(); } lastPrint =millis(); // LastPrint-Zeit aktualisieren } accelx =imu.calcAccel(imu.ax); accely =imu.calcAccel(imu.ay); if (accelx <=-1,5 || accelx>=1,5) {Serial.print (1); Verzögerung (600); aufrechtzuerhalten. Sonst if (accely <=-1.5 || Accely>=1.5) {Serial.print (1); Verzögerung(600);}}
Python-CodePython
import serialimport timematrix_port ="COM3"raquet_port ="COM9"matrix =serial.Serial(matrix_port, 9600)racquet =serial.Serial(raquet_port,9600)time.sleep(10)während 1:data =racquet.read( ) print data if data =="1":print "hit" matrix.write("1") time.sleep(1) time.sleep(.05)

Schaltpläne


Herstellungsprozess

  1. TinyML-Spracherkennung basierend auf Edge Impulse &Arduino
  2. Arduino-Gyroskop-Spiel mit MPU-6050
  3. Arduino Digital Dice
  4. Iron Man
  5. Finde mich
  6. Arduino-Befeuchtersteuerung
  7. Sonar mit Arduino und Anzeige bei der Verarbeitung von IDE
  8. MobBob:DIY-Arduino-Roboter, der von einem Android-Smartphone gesteuert wird
  9. Arduino Audio Reactive Desk Light
  10. NeoMatrix Arduino Pong