4 Op Een Rij Met Zwaartekracht Mechanic

by lennhku in Circuits > Arduino

78 Views, 0 Favorites, 0 Comments

4 Op Een Rij Met Zwaartekracht Mechanic

IMG_4528.jpg
IMG_4529.jpg
IMG_4530.jpg

Dit is een schoolproject dat gebruik maakt van een Arduino om vier op een rij te spelen met de mogelijkheid om zwaartekracht aan te passen door het blok op de bovenkant van de case om te draaien. Hierdoor is er een nieuwe laag aan strategie toegevoegd aan het spel, en het fysieke element voegt een unieke ervaring toe.

Supplies

  1. Arduino Uno
  2. MPU-6050 Accelerometer/Gyro
  3. Breadboard
  4. 7x 250 VAC micro switches met lange arm
  5. Set aan draden
  6. USB A naar USB B kabel
  7. 3D printer (Bambu P1S)
  8. Je hebt ook de software Bambu Studio nodig als je deze printer wilt gebruiken
  9. Printer en papier

Het Concept

spraycan.png
4_Op_Een_Rij.png
4_Op_Een_Rij(1).png

Omdat ik vrij weinig van Arduino wist wou een redelijk laagdrempelig project maken. Mijn oorspronkelijke idee was om een accelerometer te gebruiken om een controller te maken in de vorm van een spuitverf blik om digitaal te verven, maar nadat ik had rondgevraagd bij vrienden voor advies bleek dit eigenlijk veel te ingewikkeld te zijn.

Dus ik begon weer opnieuw, en dacht na over wat het meest simpele zou kunnen zijn waar ik mee aan de slag kan gaan. Toen begon ik met het idee van 4 op een rij met gebruikmaking van een Arduino, waar ik verschillende ideeën uit heb kunnen halen.

Hieruit kwam uiteindelijk het concept om de Arduino te gebruiken om de zwaartekracht van de game te beïnvloeden.

Arduino Fysiek in Elkaar Zetten

WireOverview.png
IMG_3899.jpg
IMG_3900.jpg
IMG_3901.jpg
IMG_3903.jpg
IMG_3902.jpg

Hiervoor hebben we de MPU6050 Accelerometer nodig op een apart breadboard. Alle micro switches moeten in principe compleet los hiervan zijn en kunnen direct aan de Arduino worden verbonden.

  1. Verbind de accelerometer aan de analoge kant van de Arduino.
  2. Verbind alle switches in de juiste volgorde aan de digitale kant.
  3. Soldeer ook alle switches aan elkaar vast en verbind dan de eerste aan een CND port.

(Op de foto's is ook een draaischakelaar te zien, maar deze is uiteindelijk niet gebruikt in de laatste versie van het circuit. Deze was oorspronkelijk bedoeld als backup als de accelerometer niet zou werken, maar dit is gelukt dus de draaischakelaar is later verwijderd.)

Wanneer alles in elkaar zit is het tijd voor de code. Ik gebruik hiervoor een paar libraries:

Adafruit BusIO

Adafruit GFX Library

Adafruit MPU6050

Adafruit SSD1306

Adafruit Unified Sensor

En ik heb deze bron gebruikt als voorbeeld voor mezelf.

Hierbij zijn er een aantal belangrijke dingen om toe te voegen:

In de setup moet dit staan:

Serial.begin(9600);

Dit zet de correcte baud rate klaar zodat we informatie naar de computer kunnen waardoor de Arduino en game kunnen communiceren.

Daarna zoekt hij naar de MPU6050:

if (!mpu.begin(0x68))
{
Serial.println("Failed to find MPU6050 chip");
while (1)
{
delay(10);
}
}

Serial.println("MPU6050 Found!");

mpu_accel = mpu.getAccelerometerSensor();
mpu_accel->printSensorDetails();

mpu_gyro = mpu.getGyroSensor();
mpu_gyro->printSensorDetails();

Wanneer die daarmee klaar is stuurt hij de rest van de details door om mee te werken.

Dan binnen de loop roept hij maar drie dingen aan:

ReadButtonInput();

ReadMPU6050();

lastTime = millis();

De eerste twee zijn de main functies die bij de knoppen en . ReadButtonInput leest alle knoppen en kijkt of er een is ingedrukt. Zo ja, dan print hij het getal dat bij die knop hoort (1 t/m 7).

Read MPU6050 is wat ingewikkelder. Hij leest de rotatie output van de accelerometer in zijn X, Y en Z waardes. Hierin beslist hij welke van de waarden genormaliseerd het grootste is. Liggend aan welke waarde het hoogste is, stuurt hij een print line die correspondeert met de naam van de as die het hoogst is. Dit zijn 6 mogelijke waardes, een voor iedere kant van de doos; Positief XYZ (in de code: "posX", "posY" en "posZ") en negatief XYZ ("negX", "negY" en "negZ").

Door deze output te lezen kunnen we herkennen welke richting hij door zwaartekracht wordt getrokken.

Als laatste worden deze iedere 100 milliseconden geüpdatet zodat het geheel niet overweldigd wordt.

Downloads

Een Game Maken in Unity

unity.png
Arduino connect 4 bug
game.png

De Arduino is nu ingesteld om als controller te werken voor een game. Maar die game moet nog komen, dus ik ging aan de slag.

Voor deze game zijn er een aantal elementen nodig:

  1. Er muntjes kunnen verschijnen op 7 verschillende plekken.
  2. De richting van zwaartekracht moet kunnen veranderen.
  3. De beurt moet bijgehouden worden zodat er verschillende kleuren aan muntjes kunnen verschijnen voor de twee spelers.

De munten zijn simpele objecten met een sprite, 2d box collider en 2d rigidbody. Hierdoor zullen ze altijd op de juiste plek vallen.

De Arduino print op dit moment constant de grootste richting van zwaartekracht, en het getal van de knop die wordt ingedrukt (wanneer er een is ingedrukt). Om dit functioneel te maken, maken we een "game manager" maken die luistert naar alle print lines die de Arduino uitstoot. Wanneer dit een getal is dan stuurt hij een functie aan voor één van de 7 "munt spawners" om aan te geven dat die de munt moet spawnen.

Hij moet ook detecteren wanneer er geen ruimte is voor een munt. Hierdoor zetten we gewoon 2D box colliders bovenaan het veld. Wanneer hier contact word gemaakt met een munt dan betekend het dat de hele kolom al volstaat, anders zou de munt er niet kunnen staan.

Er moet ook een wel een delay zijn voor de munten om te spawnen, anders krijg je een bug dat de game iedere frame een munt probeert te spawnen waardoor het hele veld word opgevuld met munten. Zie de video voor deze grappige bug :]

De manier om zwaartekracht te regelen is erg simpel, we zorgen er voor dat alle munten zijn verbonden aan een "pivot point" wanneer ze spawnen. Daarna draaien we gewoon de camera en het pivot point tegelijkertijd om. Hierdoor veranderd de zwaartekracht niet letterlijk, maar lijkt het er wel op waardoor het praktisch hetzelfde resultaat veroorzaakt.

Wanneer de zwaartekracht wordt aangepast is het natuurlijk mogelijk dat het een tijdje duurt voordat de speler klaar is met omdraaien. Hierdoor checken we of de zwaartekracht al minstens 2 seconden anders is dan de huidige richting, en zo ja, dan verandert de zwaartekracht pas in de richting dat de doos wijst.

Tijdens development van de game ben ik erachter gekomen dat het erg lastig was om bij te houden aan welke kant de speler een munt zou plaatsen wanneer de zwaartekracht veranderde. Hierom heb ik speciale icoontjes gemaakt om deze posities aan te geven. Ik heb specifiek icoontjes gemaakt zodat dit hopelijk snel te overzien is zonder dat mensen hoeven na te denken over getallen of daadwerkelijke posities, ze hoeven alleen te kijken naar het passende icoontje.

De volledige game is hier te downloaden om te gebruiken:

https://bucketbee.itch.io/arduino-connect-4?secret=WnGmpzkK0etMKUJJk0iVDDZrjLE

De Case

case.png
case 2.png
IMG_4494.jpg
IMG_4491.jpg

De case is 3D geprint, maar ieder onderdeel zit los van elkaar. Alles is zo gemaakt dat het in elkaar past door het er in te schuiven. Ik heb drie Bambu P1S printers gebruikt om de onderdelen te printen en iedere printer had een andere kleur, dat is grotendeels waarom het er zo uit ziet. Het is niet heel belangrijk welke kleur ieder onderdeel is, je kan het er uit laten zien zoals je zelf wilt, zolang het nog in elkaar past.

Samenstelling

F1PFO4ZMMJNPAJE.jpg
Arduino Connect 4 Case Assembly
IMG_4513.jpg
IMG_4523.jpg
IMG_4521.jpg
IMG_4524.jpg
IMG_4527.jpg

Hierbij heb ik ook een video gemaakt om te laten zien hoe je het moet samenstellen, maar in tekst geschreven, hier zijn de stappen om het samen te stellen:

  1. Plaats de Arduino tussen de twee blokjes in de case, zorg ervoor dat de USB te bereiken is via het gaatje.
  2. Zet alle micro switches in de gaatjes aan de voorkant. Let er op dat ze nog kunnen klikken wanneer ze er in zitten.
  3. Schuif de bovenkant vanaf de achterkant aan op de case
  4. Schuif het achterste gedeelte van het bord op de voorkant van de case
  5. Schuif het voorste gedeelte van het bord op het achterste gedeelte
  6. Schuif de kleine balk op het voorste gedeelte van het bord

Voor het breadboard is het best vanzelfsprekend. Plaats het breadboard in de case en schuif de twee onderdelen in elkaar vast in het grootste onderdeel. Deze kan je daarna in de gleuf op de bovenkant van de case plaatsen.

Daarna heb ik ook nog wat extra icoontjes uitgeprint en op de voorkant van het bord geplakt om duidelijker te maken waar de speler een muntje zal plaatsen in de game wanneer de zwaartekracht is veranderd. Ook heb ik een grote pijl gemaakt voor op de zwaartekracht doos zodat je kan zien welke richting de zwaartekracht is gedraaid.

(De pijl was oorspronkelijk oranje, maar het lukte met mijn printer niet om in kleur printen)

Spelen!

FGTFNGAMMJNPAK4.jpg
Vier op een rij met zwaartekracht Arduino showcase
  1. Plug de Arduino in de 3e USB poort van jouw computer (dat is gewoon hoe ik het heb gecodeerd).
  2. Om te vinden waar je de Arduino in hebt gestopt, druk op de Windows Knop, typ Device Manager, en dan Enter. Klik Ports (COM & LPT). Als daar "Arduino Uno (COM3)" staat dan werkt het!
  3. Als je de game al hebt opgestart voordat je de USB er in hebt gestopt, druk dan op R om de game te resetten.
  4. Pak een munt van 10 of 20 cent (of een soortgelijk formaat) en steek hem aan de bovenkant in de gleuf waar je een munt wilt neerzetten in de game.
  5. Om zwaartekracht aan te passen draai je de zwaartekracht doos op de case om zodat de pijl in de richting wijst die je wilt. Dit verbruikt jouw beurt dus denk strategisch na!
  6. Speel door totdat iemand 4 op een rij heeft!
  7. Druk op R op het toetsenbord om het bord te resetten, en druk op alt + F4 om de game af te sluiten.

Reflectie

Ik heb door dit project veel geleerd over hoe Arduino's werken, wat een baud rate is, hoe je Arduino's moet programmeren en hoe je moet solderen. Ook ben ik er achter gekomen dat 3D printen ontzettend tijdrovend kan zijn als je niet correct dingen hebt afgemeten en dat het ook ontzettend belangrijk is om dit anticiperen dat er iets mis kan gaan. Hierdoor heb ik veel moeten vijlen en dingen opnieuw moeten printen. Verder was het 3D printen wel mijn favoriete gedeelte omdat het ontzettend cool is om een 3D model dat je zelf hebt gemaakt in het echt te kunnen zien.

Ook had ik liever meer tijd gewild zodat ik een beter design kon bedenken voor de gaten van de knoppen in de case zodat ze stabieler op hun plek blijven, en ook zodat de uitsteeksels van de knoppen makkelijker naar beneden kantelen. Ook had de case wat hoger kunnen zijn, en de gaten kleiner zodat de munten er minder makkelijk per ongeluk uit de zijkant uitvallen. Hiervoor had ik beter eerder een prototype of kleinere tests moeten maken om te zien hoe dit in de praktijk zou werken.