Inhoudsopgave:

Volgmodule voor fietsers: 5 stappen
Volgmodule voor fietsers: 5 stappen

Video: Volgmodule voor fietsers: 5 stappen

Video: Volgmodule voor fietsers: 5 stappen
Video: PCC Oosterhout informatieavond 2024, November
Anonim
Volgmodule voor fietsers
Volgmodule voor fietsers

Deze volgmodule voor wielrenners is een module die automatisch crashes in een race detecteert, en die een mechanisch defect detecteert door een aanraaksensor aan te raken. Wanneer een van deze gebeurtenissen plaatsvindt, stuurt de module de gebeurtenis via LoRa naar een database op een raspberry pi. Dit evenement wordt getoond op een LCD-scherm en op een website. U kunt op de website ook zoeken naar een specifieke wielerwedstrijd bij de evenementen en wielerkoersen of wielrenners toevoegen aan de database. Ik heb dit project gemaakt omdat ik erg geïnteresseerd ben in fietsen en IOT, dus het combineren van deze twee onderwerpen was gewoon heel spannend voor mij.

Voordat u een volgmodule voor fietsers kunt maken, moet u uw materialen verzamelen. U vindt de gereedschappen en benodigdheden in de onderstaande lijsten, of u kunt de BOM (Build Of Materials) downloaden.

Benodigdheden:

  • plexiglas (56 mm X 85 mm)
  • 10 X 2M bouten 10mm en moeren
  • 10 X 3M bouten 10mm en moeren
  • 2 X 3M bouten 50 mm en moeren
  • PLA-filament om uw LCD-behuizing te 3D-printen
  • Krimpkous
  • Man-vrouw kabels
  • Een basis-PCB
  • Mannelijke kopteksten
  • Een Raspberry Pi 3b+
  • Een 16GB SD-kaart
  • Een sparkfun 4X20 LCD
  • Een capacitieve aanraaksensor
  • een zoemer
  • Een 3-assige accelero + gyrometer
  • Een GPS-module
  • Een SODAQ Mbili-bord
  • Een LoRa WAN-module
  • Een 3.7V 1000mAh batterij
  • Een Raspberry Pi 3b+ voeding

Gereedschap:

  • soldeer tin
  • Soldeerbout
  • Tang
  • Schroevendraaiers
  • legpuzzel
  • Dril machine
  • 2.5 en 3.5 oefeningen
  • Aansteker / heteluchtpistool

Als je alle benodigdheden moet kopen, heb je een budget van € 541,67 nodig. Dit project is erg duur omdat ik een snelle LoRa-ontwikkelingskit heb gebruikt die € 299 kost (ik had de kans om deze kit van mijn school te gebruiken). Je kunt altijd een normale Arduino gebruiken en veel geld besparen, maar dan zullen de programma's anders zijn.

Stap 1: Fritzing-schema

Fritzing-schema
Fritzing-schema
Fritzing-schema
Fritzing-schema

De eerste stap is het bouwen van de circuits. Voor dit project hebben we 2 elektrische circuits, een met een Raspberry Pi en een met een SADAQ Mbili-bord. We beginnen met het Raspberry Pi-circuit.

Raspberry Pi Fritzing-schema:

Het Raspberry Pi-schema is vrij eenvoudig, het enige dat we verbinden met de Pi is een 4X20 Sparkfun LCD-scherm. Het display werkt met seriële communicatie, SPI of I2C. Welk communicatieprotocol u gebruikt, is aan u. Ik heb het SPI-protocol gebruikt omdat het heel eenvoudig is. Als je SPI zoals ik gebruikt, heb je de volgende aansluitingen nodig:

  • VCC LCD VCC Raspberry Pi
  • GND LCD GND Raspberry Pi
  • SDI LCD MOSI (GPIO 10) Raspberry Pi
  • SDO LCD MISO (GPIO 9) Raspberry Pi
  • SCK LCD SCLK (GPIO 11) Raspberry Pi
  • CS LCD CS0 (GPIO 8) Raspberry Pi

Op het Fritzing-schema ziet u dat het LCD-scherm een 2X16-display is. Dit komt omdat ik bij frizzing geen 4X20 LCD heb gevonden. Alle verbindingen zijn echter de enige, dus het maakt niet echt uit.

SODAQ Mbili Fritzing-schema:

We zullen 4 elektronische componenten verbinden met het SODAQ Mbili-bord, dus dit elektrische schema is ook heel eenvoudig. We beginnen met het aansluiten van de Capactive aanraaksensor. De OUT-pin van deze sensor zal HOOG zijn wanneer de sensor wordt aangeraakt, en zal anders LAAG zijn. Dit betekent dat de OUT-pin een digitale uitgang is die we kunnen verbinden met een digitale ingang van het Mbili-bord. De aansluitingen zijn als volgt:

  • OUT aanraaksensor D5 Mbili
  • VCC-aanraaksensor 3.3V Mbili
  • GND Tastsensor GND Mbili

Het tweede onderdeel is de Triple acces + gyrosensor. Ik gebruikte het GY-521-bord dat het I2C-protocol gebruikt om met het Mbili-bord te communiceren. Merk op dat de AD0-pin van het GY-521 board verbonden moet worden met de VCC van het Mbili board! Dit komt omdat het Mbili-bord een klok heeft met hetzelfde I2C-adres als de GY-521. Door de AD0-pin aan te sluiten op VCC veranderen we het I2C adres van de GY-521. De aansluitingen zijn als volgt:

  • VCC GY-521 3.3V Mbili
  • GND GY-521 GND Mbili
  • SCL GY-521 SCL Mbili
  • SDA GY-521 SDA Mbili
  • AD0 GY-521 3.3V Mbili

Daarna zullen we de zoemer aansluiten. Ik gebruik de standaard zoemer die een geluid maakt als er stroom staat. Dit betekent dat we de zoemer gewoon kunnen aansluiten op een digitale pin van het Mbili-bord. De aansluitingen zijn als volgt:

  • + Zoemer D4 Mbili
  • - Zoemer GND Mbili

Last but not least zullen we de GPS-module aansluiten. De GPS-module communiceert via RX en TX. De aansluitingen zijn als volgt:

  • VCC GPS 3.3V Mbili
  • GND GPS GND Mbili
  • TX GPS RX Mbili
  • RX GPS TX Mbili

Stap 2: Genormaliseerde database

Genormaliseerde database
Genormaliseerde database

De tweede stap is het ontwerpen van een genormaliseerde database. Ik heb mijn ERD ontworpen in Mysql. U zult zien dat mijn database in de Nederlandse taal is geschreven, ik zal de tabellen hier uitleggen.

Tabel 'ploeg':

Deze tafel is een tafel voor de wielerclubs. Het bevat een fietsclub-ID en een naam van de fietsclub.

Tabel 'renners':

Deze tafel is een tafel voor de wielrenners. Iedere fietser heeft een LoRaID die tevens de Primary Key van de tafel is. Ze hebben ook een achternaam, voornaam, land van herkomst en een wielerclub-ID die is gekoppeld aan de wielerclubtabel.

Tabel 'plaatsen':

Deze tabel is een tabel die de plaatsen in België opslaat waar een wielerwedstrijd kan plaatsvinden. Het bevat de naam van de stad (wat de primaire sleutel is) en de provincie waar de stad ligt.

Tabel 'wedstrijden':

In deze tabel worden alle wielerwedstrijden opgeslagen. De primaire sleutel van de tabel is een ID. De tabel bevat ook de naam van de wielerwedstrijd, de plaats van de wedstrijd die gekoppeld is aan de plaatsentabel, de afstand van de wedstrijd, de categorie van de renners en de datum van de wedstrijd.

Tabel 'gebeurtenissen':

In deze tabellen worden alle gebeurtenissen opgeslagen die plaatsvinden. Dit betekent dat wanneer een fietser betrokken is bij een ongeval of een mechanisch defect heeft, de gebeurtenis in deze tabel wordt opgeslagen. De primaire sleutel van de tabel is een ID. De tabel bevat ook de datumtijd van het evenement, de breedtegraad van de positie, de lengtegraad van de positie, de LoRaID van de renner en het type evenement (ongeval of mechanisch defect).

Tabel 'wedstrijdrenner':

Deze tabel is een tabel die nodig is voor een veel-op-veel relatie.

Stap 3: Registreer uw LoRa-module

Registreer uw LoRa-module
Registreer uw LoRa-module

Voordat je aan de slag kunt met de code, moet je je LoRa-module registreren in een LoRa-gateway. Ik maakte gebruik van een telecombedrijf in België genaamd 'Proximus' dat de communicatie voor mijn LoRa-module regelt. De data die ik verstuur met mijn LoRa node verzamelt op de website van AllThingsTalk. Als u ook de AllThingsTalk API wilt gebruiken om uw gegevens te verzamelen, kunt u zich hier registreren.

Nadat u zich hebt geregistreerd op AllThingsTalk, moet u uw LoRa-knooppunt registreren. Om dit te doen, kunt u deze stappen volgen of u kunt op de afbeelding hierboven kijken.

  1. Ga naar 'Apparaten' in het hoofdmenu
  2. Klik op 'Nieuw apparaat'
  3. Selecteer uw LoRa-knooppunt
  4. Vul alle sleutels in.

Nu ben je klaar! Alle gegevens die je met je LoRa-node verzendt, verschijnen in je AllThingsTalk-maker. Mocht je problemen hebben met de registratie, dan kan je altijd de AllThingsTalk docs raadplegen.

Stap 4: De code

De code
De code
De code
De code
De code
De code
De code
De code

Voor dit project hebben we 5 codeertalen nodig: HTML, CSS, Java Script, Python (Flask) en de Arduino-taal. Eerst zal ik het Arduino-programma uitleggen.

Het Arduino-programma:

In het begin van het programma declareer ik enkele globale variabelen. Je zult zien dat ik SoftwareSerial gebruik voor de verbinding met mijn GPS. Dit komt omdat het Mbili-bord maar 2 seriële poorten heeft. U kunt de GPS aansluiten op Serial0, maar dan kunt u de Arduino-terminal niet gebruiken om te debuggen. Dit is de reden waarom ik een SoftwareSerial gebruik.

Na de globale variabelen noem ik enkele functies die het programma gemakkelijk te lezen maken. Ze lezen de GPS-coördinaten uit, laten de zoemer klinken, sturen waarden via LoRa, …

Het derde blok is het setup-blok. Dit blok is het begin van het programma dat de pinnen, seriële communicatie en de I2C-communicatie instelt.

Na het setup-blok komt het hoofdprogramma. In het begin van deze hoofdlus controleer ik of de aanraaksensor actief is. Als dat zo is, laat ik de zoemer klinken, krijg ik de GPS-gegevens en stuur ik alle waarden via LoRa of Bluetooth naar de Raspberry PI. Na de aanraaksensor lees ik de waarden van de Accelerometer uit. Met een formule bereken ik de exacte hoek van de X- en Y-as. Als deze waarden te groot zijn, kunnen we concluderen dat de fietser ten val is gekomen. Bij een crash laat ik de zoemer weer klinken, haal ik de GPS-gegevens op en stuur ik alle waarden via LoRa of Bluetooth naar de Raspberry PI.

Je denkt waarschijnlijk: 'Waarom gebruik je bluetooth en LoRa?'. Dit komt omdat ik wat problemen had met de licentie van de LoRa-module die ik gebruikte. Dus om het programma te laten werken voor mijn demo's, moest ik een tijdje Bluetooth gebruiken.

2. De achterkant:

De achterkant is een beetje ingewikkeld. Ik gebruik Flask voor mijn routes die toegankelijk zijn voor de front-end, ik gebruik socketio om sommige front-end-pagina's automatisch bij te werken, ik gebruik de GPIO-pinnen om berichten op een LCD-scherm weer te geven en berichten te ontvangen via Bluetooth (niet nodig als je LoRa) en ik gebruik Threading en Timers om regelmatig de AllThinksTalk API te lezen en de flaskserver te starten.

Verder gebruik ik de SQL database om alle binnenkomende crashes op te slaan, de persoonlijke gegevens van de renners en de wedstrijdgegevens uit te lezen. Deze database is aangesloten op de back-end en draait ook op de Raspberry Pi. Ik gebruik een klasse 'Database.py' om te communiceren met de database.

Zoals je weet van het Fritzing-schema is het lcd via het SPI-protocol verbonden met de Raspberry Pi. Om het wat makkelijker te maken heb ik een class 'LCD_4_20_SPI.py' geschreven. Met deze les kan je het contrast wijzigen, de kleur van de achtergrondverlichting wijzigen, berichten op het scherm schrijven, …. Als u Bluetooth wilt gebruiken, kunt u de klasse 'SerialRaspberry.py' gebruiken. Deze klasse regelt de seriële communicatie tussen de Bluetooth-module en de Raspberry Pi. Het enige dat u hoeft te doen, is een Bluetooth-module op de Raspberry Pi aansluiten door de RX met de TX te verbinden en omgekeerd.

De routes voor de frontend zijn geschreven met de @app.route regel. Hier kunt u uw eigen aangepaste route maken om gegevens in of uit de database in te voegen of op te halen. Zorg dat je aan het einde van de route altijd een reactie hebt. Ik retourneer altijd een JSON-object naar de front-end, zelfs als er een fout is opgetreden. U kunt een variabele in de url gebruiken door rond de variabele te plaatsen.

Ik gebruik socketio voor de webpagina met de crashes van een race. Wanneer de Raspberry Pi een crash krijgt, stuur ik via socketio een bericht naar de front-end. De frontend weet dan dat ze de database opnieuw moeten uitlezen omdat er een nieuwe crash is geweest.

Je zult zien dat in mijn code de LoRa-communicatie in opdracht is ingesteld. Als je LoRa wilt gebruiken, moet je een timer starten die herhaaldelijk een verzoek naar de AllThinksTalk API stuurt. Vanuit deze API ontvang je de sensorwaarden (GPS, Time, Crash soort) die door een specifieke LoRa node worden verzonden. U kunt deze waarden gebruiken om een crash in de database in te voegen.

3. Het uiteinde van het blad:

Het bladeinde bestaat uit 3 talen. HTML voor de websitetekst, CSS voor de website-opmaak en JavaScript voor de communicatie met de backend. Ik heb 4 webpagina's voor dit project:

  • De index.html waar je alle wielerwedstrijden kunt vinden.
  • Een pagina met alle crashes en mechanische storingen voor een specifieke race.
  • Een pagina waar u cylisten aan de database kunt toevoegen en hun team kunt bewerken.
  • Een pagina waar je een nieuwe race met alle deelnemers aan de database kunt toevoegen.

Hoe je ze ontwerpt, is volledig aan jou. Als je wilt, kun je inspiratie opdoen op mijn website. Helaas is mijn website in de Nederlandse taal gemaakt, sorry daarvoor.

Ik heb voor elke pagina een apart CSS-bestand en JavaScript-bestand. Elk JavaScript-bestand gebruikt fetch om de gegevens via de backend uit de database te halen. Wanneer het script de gegevens ontvangt, verandert de html dynamisch. Op de pagina waar u de crashes en mechanische storingen kunt vinden, vindt u een kaart waar alle gebeurtenissen hebben plaatsgevonden. Ik heb een folder gebruikt om deze kaart te laten zien.

Je kunt al mijn code hier op mijn Github bekijken.

Stap 5: Bouw de constructies

Bouw de constructies
Bouw de constructies
Bouw de constructies
Bouw de constructies
Bouw de constructies
Bouw de constructies

Voordat we met de constructie kunnen beginnen, moet u ervoor zorgen dat u alle materialen uit de stuklijst of van de pagina 'Tools + Supplies' heeft.

Raspberry Pi + LCD

We beginnen met de case voor de Raspberry Pi. Je kunt altijd een hoesje 3D-printen, dit was ook mijn eerste idee. Maar omdat mijn deadline heel dichtbij kwam, besloot ik een simpele casus te maken. Ik nam de standaardbehuizing van de Raspberry Pi en boorde een gat in de behuizing voor de draden van mijn LCD-scherm. Om dit te doen, volgt u deze eenvoudige stappen:

  1. Boor een gat in het deksel van de behuizing. Ik deed dit met een 7 mm boor aan de zijkant van de kap. Dit zie je op de afbeelding hierboven.
  2. Neem de draden van het LCD-scherm en schuif een krimpkop over de draden.
  3. Gebruik een aansteker of een heteluchtpistool om de kop te laten krimpen.
  4. Trek de draden met de krimpkop door het gat in de behuizing en sluit ze weer aan op het LCD-scherm.

Nu je klaar bent met de behuizing voor de Raspberry Pi, kun je beginnen met de behuizing voor het LCD-scherm. Ik heb de hoes voor mijn LCD-scherm in 3D geprint omdat ik een hoes online vond op deze link. Ik hoefde alleen een kleine verandering in de hoogte van de koffer aan te brengen. Als je denkt dat je tekening goed is, kun je de bestanden exporteren en beginnen met afdrukken. Als u niet weet hoe u 3D-printen, kunt u deze instructie volgen over hoe u 3D-printen met Fusion 360.

SODAQ MBili-constructie

Ik heb niet echt een pleidooi gehouden voor het SODAQ Mbili-bord. Ik gebruikte een plexiglas om mijn componenten op te plaatsen zonder een behuizing rond de constructie. Als u dit ook wilt doen, kunt u deze stappen volgen:

  1. Teken het plexiglas af met de afmetingen van het SODAQ Mbili bord. De afmetingen zijn: 85 mm X 56 mm
  2. Snijd het plexiglas met een decoupeerzaag.
  3. Plaats de elektronische componenten op het plexiglas en teken de gaten af met een potlood.
  4. Boor de gaten die u zojuist hebt afgetekend en de gaten voor de afstandhouders met een boor van 3,5 mm.
  5. Monteer alle elektronische componenten op het plexiglas met de 3M 10mm bouten en moeren.
  6. De laatste stap is om het plexiglas boven het Mbili-bord te monteren. Je kunt dit doen met afstandhouders, maar ik heb twee 3M 50 mm bouten en 8 3M moeren gebruikt om het plexiglas boven het bord te monteren.

Aanbevolen: