Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Virtuele Arduino Tennis

Componenten en benodigdheden

Arduino Nano R3
× 2
SparkFun 9DoF-sensorstick
× 1
Jumperdraden (algemeen)
× 1
NeoPixel-strip
× 1
HC-05 Bluetooth-module
× 1
9V-batterij (algemeen)
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Apps en online services

Arduino IDE

Over dit project

Dit project bestaat uit 3 delen:het spelbord/display, de controller en de hoofdrouter (Python-script).

Deel 1 - Het beeldscherm

Het display is een 15x10 neopixelmatrix die van een Arduino Nano loopt. Het verwerkt de spellogica en invoer van het Python-script dat vanaf een hostcomputer wordt uitgevoerd. Het toont een bal die groeit en verder door de matrix beweegt, waardoor een illusie van diepte ontstaat en de bal op je af komt. Als het detecteert dat de bal is geraakt, wordt de bal opnieuw getrokken en gaat 'van u weg'.

Punten

De richting van de bal (links of rechts) verandert bij elke slag. Als je de bal mist, krijgt de COM een punt, maar als de COM mist (een kans van 25%), krijg jij het punt. Dit spelontwerp is vergelijkbaar met de Wii Sports-versie van tennis. De punten worden weergegeven wanneer de COM scoort tegen de speler.

Hoge score

Er is een lopende high-score die is opgeslagen op een I2C EEPROM, in het 0x04-adres. Het houdt een byte bij die de hoogste score bevat. Als u hoger scoort dan de vorige high-score, wordt het adres overschreven. Als de COM een score van 10 krijgt, is het spel voorbij... Als dat verwarrend is, heb ik een logische grafiek gemaakt:

Maak de matrix

Het maken van de matrix zal enige tijd duren, dus volg de handleiding die ik hier heb gemaakt.

Deel 2 - De controller

De controller is een andere Arduino Nano met een 9DoF-stick (alleen 3v3!) en een HC-05 BLE-module eraan. Als de versnelling van de x- of y-as groter is dan een gespecificeerde drempel, stuurt het een '1' via serieel naar de host-pc, waar het wordt doorgegeven aan het display. De Nano meet de x- en y-versnellingsmeter met een vast interval, waarna hij controleert of de waarden boven of onder 1,5 gram vallen. Om toegang te krijgen tot de I2C 9 DoF-stick, moet u de Sparkfun-bibliotheek installeren die hier kan worden gedownload. Er is ook een tutorial over hoe je de sensor aansluit en hier basisprogramma's mee uitvoert.

Om het racket te bouwen heb ik een doos gebruikt en vervolgens een racketvorm uitgesneden op een stuk karton. Vanaf daar was het gemakkelijk - leg gewoon een stuk wit papier over de kartonnen uitsparing en teken een ontwerp over het papier. Ik heb een 9v-batterij gebruikt om de installatie van stroom te voorzien, zorg er wel voor dat je de batterij door de Vin-pin op de Nano laat lopen, anders wordt het een ongereguleerde 9v! Hier is een foto van de binnenkant van het racket:

Communiceer via Bluetooth

Dus nu vraag je je misschien af, wat regelt deze complexe operatie? Hoe praat het racket met het display? Hier is een geheim:ze praten niet met elkaar! Er is een eenvoudig Python-script dat de inkomende Bluetooth COM-poort en de matrix COM-poort gebruikt om informatie tussen hen door te geven. Het helpt ook om de twee systemen te synchroniseren, omdat ze allebei resetten wanneer de seriële poorten initialiseren. Het racket stuurt via Bluetooth een '1' naar het Python-script en vervolgens stuurt het Python-script een '1' naar matrix. Er is een debounce van 1 sec, zodat de seriële poorten hun buffers niet overlopen (ze hebben alleen 32-bits buffers).

Het racket

Klik door de foto's om te zien hoe ik het racket heb gebouwd:

Veel plezier met je nieuwe tennisspel!

Een video van tennis dat wordt gespeeld:

Code

  • Matrixcode
  • Racketcode
  • Python-code
MatrixcodeC/C++
Gaat op de Arduino die aan de matrix is ​​bevestigd.
#include #include #include #include #include #define PIN 6 //Data pin voor matrix#define EEPROM_ADR 0x50 //Het I2C-adres van de EEPROM#define HS_ADR 0x02 //Het adres van de highscore-byte in de 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; // Ball's X-coördinaat ball_y =2; // Y-coördinaatstraal van Ball =1; //Ball's radiusint r_incr =1; //Hoeveel om de straal te vergroten bybool isSwung =false; //Is het raquet swungint ball_x_dir =1; // Ball's X directionint ball_y_dir =1; // Ball's Y directionbool isDirRight =true;int score =0; //De score van de huidige gameint COM_score =0;int highscore =0; //De hoge score van alle gamesint framerate =50; //Hoeveel ms tussen elke 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};static unsigned long lastFrame =0;void setup(){ Serial.begin(9600); matrix.begin(); matrix.fillScreen(0); matrix.setTextColor(kleuren[1]); randomSeed (analogRead (A2)); display_scores(); hoge score =read_HS(); Serial.println(hoge score,DEC); matrix.setCursor(0,1); matrix.print("HS:"); matrix.show(); vertraging (1000); matrix.fillScreen(0); matrix.setCursor(0,1); matrix.print(hoge score,DEC); matrix.show(); vertraging (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; } else if(ball_y>=8){ COM_score +=1; end_round(); } else if(ball_y <=2){ isDirRight =!isDirRight; int randNum =willekeurig (4); Serial.println(randNum); if(randNum ==2){ //25% kans op ontbrekende COM-score +=1; if(score> hoge score){ write_HS(); } eind_ronde; } 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; straal +=r_incr; matrix.fillScreen(0); matrix.fillCircle(ball_x,ball_y,straal,kleuren[2]); matrix.show();}void end_round(){ if(COM_score>=10){ end_game(); } isDirRight =waar; r_incr =1; ball_x_dir =1; ball_y_dir =1; bal_x =7; bal_y =2; straal =1; display_scores(); matrix.fillScreen(0); matrix.fillCircle(ball_x,ball_y,straal,kleuren[2]); matrix.show(); }void end_game(){ matrix.fillScreen(0); matrix.setCursor(0,1); matrix.setTextColor(kleuren[0]); matrix.drawLine(3,0,12,9,kleuren[0]); matrix.drawLine(11,0,2,9,kleuren[0]); matrix.show(); vertraging (500); while(1){ }}void display_scores(){ matrix.fillScreen(0); matrix.setTextColor(kleuren[1]); matrix.setCursor(0,1); score_string =String (score) + "-" + String (COM_score); scrollText(score_string); matrix.fillScreen(0); vertraging (2000); matrix.show();}void scrollText(String text){ int pass =0; int x =matrix.breedte(); for(int i=0;i<24;i++){ matrix.fillScreen(0); matrix.setCursor(x,2); matrix.print(tekst); x -=1; matrix.show(); vertraging (150); }}void write_HS(){ EEPROM.write(0x04,int(score));}int read_HS(){ byte HS =EEPROM.read(0x04); //Lees van adres 4 retour HS;}
RacquetcodeC/C++
#include #include #include LSM9DS1 imu;#define LSM9DS1_M 0x1E // Zou 0x1C zijn als SDO_M LAAG is#define LSM9DS1_AG 0x6B // Zou 0x6A zijn SDO_AG is LAAG#define PRINT_SPEED 10 // 10 ms tussen checksstatic unsigned long lastPrint =0; // Houd de print timefloat accelx =0;float accely =0;void setup() {// plaats hier uw setup-code om een ​​keer uit te voeren: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()) { // mislukt terwijl (1); }}void loop() { if ((lastPrint + PRINT_SPEED) =1.5){ Serial.print(1); vertraging (600); } else if(accely <=-1.5 || accely>=1.5){ Serial.print(1); vertraging(600);}}
PythoncodePython
import serialimport timematrix_port ="COM3"raquet_port ="COM9"matrix =serial.Serial(matrix_port, 9600)racket =serial.Serial(raquet_port,9600)time.sleep(10)while 1:data =racket.read( ) print data if data =="1":print "hit" matrix.write("1") time.sleep(1) time.sleep(.05)

Schema's


Productieproces

  1. TinyML-taaldetector-gebaseerd op Edge Impulse &Arduino
  2. Arduino-gyroscoopspel met MPU-6050
  3. Arduino digitale dobbelstenen
  4. Iron Man
  5. Vind mij
  6. Arduino-luchtbevochtigerbediening
  7. Sonar met arduino en weergave op verwerkings-IDE
  8. MobBob:doe-het-zelf Arduino-robot bestuurd door Android-smartphone
  9. Arduino Audio Reactive Desk Light
  10. NeoMatrix Arduino Pong
  11. Arduino-joystick