Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
Capture The Box is een teambuildingspel dat je kunt spelen met vrienden in je buurt.
Het doel is om de doos te veroveren en zo lang mogelijk in je bezit te houden, terwijl andere spelers proberen hem weg te sluipen van je veranda of voortuin.
Deze game gebruikt GPS om de doos te lokaliseren en RFID-tags om de spelers te identificeren. Er kan een optionele LDR worden toegevoegd om de intensiteit van het dot-matrixscherm af te stemmen op het percentage licht in het gebied.
Benodigdheden
Microcontrollers en computers
- Raspberry Pi
- Arduino (Mega)Ik heb gekozen voor een Arduino Mega boven een normale Uno, omdat deze veel meer pinnen heeft. Dit is nodig omdat we een Dragino LoRa-schild gebruiken, waardoor we te weinig digitale pinnen zouden hebben bij gebruik van een UNO. TIP: Het is het beste om een echte te gebruiken, omdat de Chinese klonen niet altijd werken zoals verwacht.
Sensoren en modules
- 4 MAX7219 Dot Matrix-modulesVerbind DOUT met DIN, CS met CS, CLK met CLK…
- Lichtafhankelijke Weerstand (10K) + Weerstand (10K)
- NEO-7M (of vergelijkbare) GPS-moduleIk gebruik de VMA430 van Velleman
- RC522 RFID-module + enkele RFID-badges/kaarten
Voor gebruik van LoRa (draadloze technologie)
Dragino Lora Shield
Optionele sensoren en modules
Een LCD-displayOm het IP-adres van de Raspberry Pi weer te geven
Voor het maken van een testopstelling
Een breadboard en Dupont-kabels (mannelijk-mannelijk)
Optioneel (behuizing)
- Soldeerbout
- Een oude gereedschapskoffer
- Materialen voor 3D-printen
- Enkele dunne houten planken
- Sommige bouten en moeren (die in Arduino-gaten passen). Mijn schroeven hebben een diameter van ongeveer 3 mm.
Een geschatte prijs is te vinden in de BOM (Bill of Materials), die hieronder is opgenomen.
Stap 1: De Raspberry Pi instellen
De Raspberry Pi is het hart van het project.
Het zal de frontend, backend en database uitvoeren. Het zal ook verantwoordelijk zijn voor de communicatie tussen de backend en de Arduino.
Om de Raspberry Pi te kunnen gebruiken, moeten we het volgende doen:
Deel 1: Installeer Raspbian op een Raspberry Pi
Een tutorial over hoe dat te doen is hier te vinden:https://thepi.io/how-to-install-raspbian-on-the-ra…
Deel 2: Installeer Raspbian op een Raspberry PiJe wifi thuis instellen.
Dit kan worden gedaan met behulp van wpa_passphrase "YourNetwork" "YourSSID" >> /etc/wpa_supplicant/wpa_supplicant.conf
Start de Pi opnieuw op en je zou een IP-adres moeten zien bij het typen van ifconfig
Deel 3: Installeer de webserver en database
Als je Pi eenmaal in gebruik is, kun je het beste je wachtwoord wijzigen. Dit kan met het commando passwd.
Zodra dat is gebeurd, ga je gang en installeer je Apache, PHP, MariaDB en PHPMyAdmin.
Apache, PHP sudo apt install apache2 -y sudo apt install php libapache2-mod-php -y
MariaDB sudo apt install mariadb-server mariadb-client -y sudo apt install php-mysql -y sudo systemctl herstart apache2.service
PHPMyAdminsudo apt install phpmyadmin -y
Vergeet niet een veilig MySQL-wachtwoord in te stellen.
Deel 4: De benodigde Python-bibliotheken installeren
Voor de backend hebben we enkele bibliotheken nodig. Deze kunnen worden geïnstalleerd met behulp van het pip3-commando.
pip3 installeer mysql-connector-python
pip3 install flask-socketio
pip3 installeer flask-cors
pip3 install geventpip3 install gevent-websocket
pip3 installeer ttn
Stap 2: De elektronica neerleggen
Om dit project te laten werken, moeten we alle elektronica aansluiten.
Het LoRa-schild kan eenvoudig worden geplaatst. Lijn de pinnen uit met de pinnen op uw Arduino.
De andere verbindingen worden beschreven in mijn Fritzing-schema. Die hier te downloaden is:
Stap 3: De database ontwerpen
Om alle game- en sensorgegevens te kunnen opslaan, heb ik een paar tabellen gemaakt:
meting en sensor De metingen van de sensoren, te vinden in de sensortabellen. Het bevat een verwijzing naar de sensor, de waarde van de meting (bijv. coördinaten: 51.123456; 3.123456) en een optionele game-ID (als er een game actief was tijdens de meting).
spelerDe spelersnamen en de UID van hun RFID-badge. Er is een optionele veldmoderator toegevoegd, deze persoon kan het spel aanpassen (bijvoorbeeld voortijdig stoppen).
spelDe spelinfo (start- en eindtijd).
spel_has_spelerDe relatie tussen spel en speler. Hier worden spelers aan een spel toegewezen.
bezitIn deze tabel wordt de score bewaard. Het bevat het spel-ID, speler-ID, het tijdstip waarop hij de doos heeft gestolen en het tijdstip waarop hij het verloor (wanneer iemand anders het steelt of wanneer het spel eindigt). Door de begintijd van de eindtijd af te trekken, kun je de score berekenen die hij van die vangst heeft gekregen.
Een export van de database is te vinden op mijn GitHub (https://github.com/BoussonKarel/CaptureTheBox)
Open de sql in PHPMyAdmin / MySQL Workbench en voer het uit. De database zou nu geïmporteerd moeten worden.
Stap 4: Een account aanmaken op TTN
Stap 1: Maak een account aan op TTN en maak een applicatie aan
Meld u aan voor een account op TheThingsNetwork en ga vervolgens naar Console > Toepassing toevoegen.
Kies een naam voor uw toepassing en klik op Toepassing toevoegen.
Stap 2: Registreer een apparaat
Wanneer u uw aanvraag heeft gedaan, gaat u naar Apparaat registreren.
Kies een apparaat-ID, dit kan wat je maar wilt (zolang het een snake case is) en klik op Registreren.
Klik op het Generate icoon onder Device EUI, zodat TTN er een voor je zal genereren.
Stap 3: Uw inloggegevens opschrijven
Ga nu naar uw apparaat en klik op het codepictogram naast Apparaat-EUI, App-EUI en App-sleutel. Het zou nu moeten verschijnen als een array van bytes.
Klik voordat u kopieert op de knop Switch en zorg ervoor dat uw Dev EUI en App EUI EERST LSB zijn.
Uw app-sleutel moet EERST MSB blijven (verander dat niet).
Je hebt deze sleutels nodig in de volgende stap: De Arduino instellen.
Stap 4: Uw Application Access-sleutel opschrijven
Nu hebben we nog een sleutel nodig om MQTT op onze Raspberry Pi in te stellen.
Ga naar uw applicatie en scrol omlaag naar Toegangstoetsen.
Je hebt dit nodig in de stap Backend.
Stap 5: De Arduino instellen
Arduino-code is ook te vinden op mijn GitHub, onder Arduino (https://github.com/BoussonKarel/CaptureTheBox)
Deze code is opgesplitst in meerdere tabbladen om het overzichtelijk te houden.
main.inoDe hoofdcode: pin-declaraties, setup() en loop()
0_LoRa.inoDeze code regelt de communicatie via LoRa.
Het zet de gegevens van de LDR-, GPS- en RFID-tags in een array van 13 bytes en stuurt deze naar TheThingsNetwork.
1_LDR.inoMet analogRead() meet het de hoeveelheid spanning over de lichtafhankelijke weerstand.
Dit wordt vervolgens omgezet in een percentage licht (0 is niets, 100 is een zaklamp voor een mobiele telefoon).
2_GPS.inoDit maakt gebruik van seriële communicatie via TX1 en RX1 (Serial1).
Het gebruikt NMEA-berichten (de $GPRMC-berichten om precies te zijn) om de breedte- en lengtegraad van de box te vinden.
3_RFID.inoMet behulp van de MFRC522-bibliotheek scant deze code op nieuwe RFID-tags. Wanneer er een aanwezig is, wordt deze opgeslagen als RFID_lastUID.
4_DotMatrix.inoDeze code wordt gebruikt om de dot-matrixweergave te initialiseren en in te stellen. Het bevat definities voor de laadanimatie enz …
Het opzetten
Voordat je deze code naar je Arduino kunt uploaden, moet je een paar bibliotheken installeren.
De Arduino-LMIC-bibliotheek van matthijskooijman (https://github.com/matthijskooijman/arduino-lmic)
De MFRC522-bibliotheek voor de RFID-lezer (https://github.com/miguelbalboa/rfid)
Ga nu naar main.ino en verander de DEVEUI, APPEUI en APPKEY naar degene die je de vorige stap hebt gekopieerd.
Stap 6: de backend instellen
De backend voor dit project is te vinden op mijn GitHub, onder RPI > Backend(https://github.com/BoussonKarel/CaptureTheBox).
Hoe werkt het?
- Elke 10 seconden zoekt de code naar een actief spel. Als er een wordt gevonden, wordt deze opgeslagen in een variabele genaamd huidigSpel (currentGame)
- Als de modus is ingesteld op Serieel, wordt er een kabel gebruikt tussen de Arduino en de Pi. De Pi peilt naar de waarden van de LDR en GPS. De Arduino reageert met een JSON-formaat. RFID-tags worden verzonden wanneer ze worden aangeboden. Deze modus werd alleen gebruikt voor ontwikkelingsdoeleinden en is niet echt meer nodig.
- Als de modus is ingesteld op LoRa, wordt een MQTT-client gemaakt die een callback activeert wanneer LoRa-gegevens worden ontvangen door TTN. Deze bevat LDR-, GPS- en RFID-gegevens.
- De frontend kan gegevens ophalen met behulp van de API-eindpunten. De meeste gegevens worden opgehaald met huidigSpel.id. Gegevens worden geretourneerd in JSON-indeling met jsonify()
Pas de instellingen aanGa naar secrets.py en vul de naam van je LoRa applicatie en je Acces Key in (je hebt het eerder opgeschreven).
Ga naar config.py en vul uw databasegegevens in (zoals wachtwoord, gebruiker…)
Het instellen als een service Probeer app.py uit te voeren, zodra je hebt bevestigd dat dit werkt, kunnen we het als een service gebruiken. Dit zal automatisch de code op de achtergrond starten wanneer je je pi opstart.
Kopieer hiervoor ctb_service.service naar /etc/systemd/system/ctb_service.service. sudo cp ctb_service.service /etc/systemd/system/ctb_service.service
Schakel het nu in met systemctl enable ctb_service.service
Als u enkele wijzigingen in de code moet aanbrengen, kunt u deze eenvoudig stoppen met systemctl stop (dit start opnieuw op bij opnieuw opstarten) of uitschakelen is (stoppen met automatisch opstarten) met systemctl disable.
Als u de logs moet raadplegen (vanwege fouten), kunt u journalctl -u ctb_service.service gebruiken.
Meer informatie over diensten vindt u hier:
Stap 7: de frontend instellen
Zoals gewoonlijk is de frontend te vinden op mijn GitHub, onder RPI > Frontend(https://github.com/BoussonKarel/CaptureTheBox)
Plak deze in de /var/html map van je Raspberry Pi.
Dit bevat alle benodigde webpagina's voor het spel.
Het bevat ook een script om te communiceren met de backend (zowel realtime als met behulp van de API-eindpunten).
Stap 8: Een behuizing toevoegen
Voor de koffer heb ik een oude gereedschapskoffer gebruikt, samen met de volgende materialen/technieken:
- 3d printen
- Schuim om de batterij op zijn plaats te houden
- Gerecycleerde houten planken
- Hete lijm
- Schroeven en moeren
Wat u met uw zaak doet, is uw keuze! Ik ga je artistieke vrijheid geven.
Ter inspiratie heb ik wat foto's van mijn (afgemaakte) koffer toegevoegd.