Inhoudsopgave:

DIY Indoor Bike Smart Trainer: 5 stappen
DIY Indoor Bike Smart Trainer: 5 stappen

Video: DIY Indoor Bike Smart Trainer: 5 stappen

Video: DIY Indoor Bike Smart Trainer: 5 stappen
Video: Fietstrainer kiezen in 1 minuut 2024, November
Anonim
DIY Indoor Bike Smart Trainer
DIY Indoor Bike Smart Trainer
DIY Indoor Bike Smart Trainer
DIY Indoor Bike Smart Trainer
DIY Indoor Bike Smart Trainer
DIY Indoor Bike Smart Trainer

Invoering

Dit project begon als een eenvoudige aanpassing aan een Schwinn IC Elite indoorfiets die een eenvoudige schroef en viltkussens gebruikt voor de weerstandsinstellingen. Het probleem dat ik wilde oplossen, was dat de spoed van de schroef te groot was, dus het bereik van niet kunnen trappen tot het volledig vrij draaien van het wiel was slechts een paar graden op de weerstandsknop. Eerst veranderde ik de schroef in M6, maar dan zou ik een knop moeten maken, dus waarom niet gewoon een overgebleven NEMA 17 stepper-mottor gebruiken om de weerstand te veranderen? Als er al wat elektronica is, waarom dan niet een crank-vermogensmeter en een bluetooth-verbinding met een computer toevoegen om een slimme trainer te maken?

Dit bleek lastiger dan verwacht, omdat er geen voorbeelden waren over hoe je een vermogensmeter nabootst met een arduino en bluetooth. Uiteindelijk heb ik ongeveer 20 uur besteed aan het programmeren en interpreteren van de BLE GATT-specificaties. Ik hoop dat ik door een voorbeeld te geven iemand kan helpen om niet zoveel tijd te verspillen aan het proberen te begrijpen wat "Service Data AD Type Field" precies betekent…

Software

Het hele project staat op GitHub:

github.com/kswiorek/ble-ftms

Ik raad ten zeerste aan om Visual Studio te gebruiken met een VisualGDB-plug-in als je van plan bent iets serieuzers te doen dan alleen mijn code te kopiëren en plakken.

Als je vragen hebt over het programma, stel ze dan alsjeblieft, ik weet dat mijn minimalistische opmerkingen misschien niet veel helpen.

Credits

Met dank aan stoppi71 voor zijn gids over het maken van een vermogensmeter. Ik deed de crank volgens zijn ontwerp.

Benodigdheden:

De materialen voor dit project zijn sterk afhankelijk van de fiets die u aan het aanpassen bent, maar er zijn enkele universele onderdelen.

krukas:

  1. ESP32-module
  2. HX711 Gewichtssensor ADC
  3. Spanningsmeters
  4. MPU - gyroscoop
  5. Een kleine Li-Po-batterij (ongeveer 750 mAh)
  6. Krimpkous
  7. A4988 Stepper-stuurprogramma
  8. 5V-regelaar
  9. Een arduino barrel jack
  10. 12V arduino-voeding

Troosten:

  1. NEMA 17 stepper (moet behoorlijk krachtig zijn, >0.4Nm)
  2. M6 staaf
  3. 12864 lcd
  4. WeMos LOLIN32
  5. Toetsschakelaars

Apparatuur

Hiervoor zou je waarschijnlijk weg kunnen komen door alleen een 3D-printer te gebruiken, maar je kunt veel tijd besparen door de behuizing te lasersnijden en je kunt ook PCB's maken. De DXF- en gerber-bestanden staan op GitHub, dus die kun je lokaal bestellen. De koppeling van de draadstang naar de motor werd op een draaibank gedraaid en dit is misschien het enige probleem, omdat het onderdeel behoorlijk sterk moet zijn om aan de remblokken te trekken, maar er is niet veel ruimte in deze specifieke fiets.

Sinds ik de eerste fiets heb gemaakt, heb ik een freesmachine aangeschaft waarmee ik sleuven voor de sensoren in de slinger kan maken. Het verlijmt ze een beetje makkelijker en beschermt ze ook als er iets tegen de slinger zou komen. (Ik heb deze sensoren een paar keer laten vallen, dus ik wilde veilig zijn.)

Stap 1: De krukas:

De kruk
De kruk
De kruk
De kruk
De kruk
De kruk

Je kunt het beste gewoon deze tutorial volgen:

Je moet de sensoren in principe op vier plaatsen op de crank lijmen en deze aansluiten op de zijkanten van het bord.

De juiste aansluitingen zijn er al, dus je hoeft alleen maar de dradenparen rechtstreeks aan deze acht pads op het bord te solderen.

Gebruik de dunst mogelijke draad om verbinding te maken met de sensoren - de pads zijn heel gemakkelijk op te tillen. Je moet eerst de sensoren lijmen en er net genoeg van buiten laten om te solderen, en dan de rest afdekken met epoxy. Als u probeert te solderen voordat u gaat lijmen, krullen ze en breken ze.

Om de printplaat te monteren:

  1. Steek goudspelden vanaf de onderkant (de kant met sporen) in alle gaten behalve die verticaal aan de onderkant.
  2. Plaats de drie borden (ESP32 bovenaan, dan MPU, de HX711 onderaan) zodat de goudpinnen door beide gaten steken.
  3. Soldeer de headers aan de planken bovenop
  4. Snijd de goudspelden van de onderkant af. (Probeer ze eerst te snijden voordat u ze monteert, zodat u weet dat uw "goudpinnen" van binnen niet van staal zijn - het maakt ze bijna onmogelijk om te snijden en u moet ze vijlen of slijpen)
  5. soldeer de resterende goldpins aan de onderkant van het bord.
  6. Upload de firmware voor de crank

De laatste stap is om de hele crank in te pakken met een krimpkous.

Deze methode om het bord te maken is niet ideaal, omdat het veel ruimte in beslag neemt waar je andere dingen in zou kunnen passen. Het beste zou zijn om alle componenten direct op het bord te solderen, maar ik heb niet de vaardigheid om deze kleine SMD zelf te solderen. Ik zou het gemonteerd moeten bestellen, en ik zou waarschijnlijk een aantal fouten maken en ze uiteindelijk drie keer bestellen en een jaar wachten voordat ze aankomen.

Als iemand het bord zou kunnen ontwerpen, zou het geweldig zijn als het een batterijbeschermingscircuit had en een sensor die de ESP zou inschakelen als de slinger begon te bewegen.

BELANGRIJK

De HX711-sensor is standaard ingesteld op 10Hz - het is veel te langzaam voor de vermogensmeting. Je moet pin 15 van het bord tillen en aansluiten op pin 16. Dit maakt de pin HOOG en schakelt de 80Hz-modus in. Deze 80Hz bepaalt trouwens de snelheid van de hele Arduino-lus.

Gebruik

De ESP32 is geprogrammeerd om na 30 seconden in slaap te vallen zonder dat er een Bluetooth-apparaat is aangesloten. Om het weer in te schakelen, moet u op de resetknop drukken. De sensoren worden ook gevoed via een digitale pin, die in de slaapmodus LAAG wordt. Als je de sensoren wilt testen met de voorbeeldcode uit bibliotheken, moet je de pin HOOG draaien en even wachten voordat de sensoren worden ingeschakeld.

Na montage moeten de sensoren worden gekalibreerd door de waarde zonder kracht af te lezen en vervolgens met een toegepast gewicht (ik gebruikte een kettlebell van 12 kg of 16 kg die aan het pedaal hing). Deze waarden moeten in de powerCrank-code worden ingevoerd.

Het is het beste om de krukas voor elke rit te tarreren - hij zou zichzelf niet moeten kunnen tarreren wanneer iemand trapt, maar better safe than sorry en het is mogelijk om hem slechts één keer per keer aan te tarreren. Als u vreemde vermogensniveaus opmerkt, moet u dit proces herhalen:

  1. Zet de slinger recht naar beneden totdat het lampje begint te knipperen.
  2. Na een paar seconden blijft het lampje branden - raak het dan niet aan
  3. Wanneer het lampje uitgaat, stelt het de huidige gedetecteerde kracht in als een nieuwe 0.

Als je alleen de crank wilt gebruiken, zonder de console, staat de code hier op github. Al het andere werkt hetzelfde.

Stap 2: De console

De console
De console
De console
De console
De console
De console

De behuizing is gesneden uit 3 mm acryl, de knoppen zijn 3D-geprint en er zijn afstandhouders voor het LCD-scherm, gesneden uit 5 mm acryl. Het is gelijmd met hete lijm (hij plakt vrij goed aan het acryl) en er is een 3D-geprinte "beugel" om de PCB aan het LCD-scherm te houden. De pinnen voor het LCD-scherm zijn vanaf de onderkant gesoldeerd, zodat het de ESP niet hindert.

De ESP is ondersteboven gesoldeerd, zodat de USB-poort in de behuizing past

De losse knopprint is gelijmd met hete lijm, dus de knoppen zitten vast in hun gaten, maar ze drukken nog steeds op de schakelaars. De knoppen zijn verbonden met het bord met JST PH 2.0 connectoren en de volgorde van de pinnen is eenvoudig af te leiden uit het schema

Het is erg belangrijk om de stepper driver in de juiste richting te monteren (de potentiometer bij de ESP)

Het hele gedeelte voor de SD-kaart is uitgeschakeld, omdat niemand het in de eerste versie gebruikte. De code moet worden bijgewerkt met enkele UI-instellingen, zoals het gewicht van de rijder en de moeilijkheidsgraad.

De console is gemonteerd met behulp van lasercut "armen" en ritssluitingen. De tandjes graven zich in het stuur en houden de console vast.

Stap 3: De motor

De motor
De motor
De motor
De motor
De motor
De motor

De motor houdt zichzelf op de plaats van de instelknop met een 3D-geprinte beugel. Op de as is een koppeling gemonteerd - de ene kant heeft een gat van 5 mm met stelschroeven om de as vast te houden, de andere heeft een M6-schroefdraad met stelschroeven om hem te vergrendelen. Als je wilt, kun je het waarschijnlijk in een kolomboormachine maken van een ronde voorraad van 10 mm. Het hoeft niet extreem precies te zijn, omdat de motor niet erg strak is gemonteerd.

Een stuk M6 draadstang wordt in de koppeling geschroefd en trekt aan een messing M6 moer. Ik heb het machinaal bewerkt, maar het kan net zo gemakkelijk worden gemaakt van een stuk messing met een vijl. Je kunt zelfs wat stukjes aan een normale moer lassen, zodat deze niet zou draaien. Een 3D-geprinte moer kan ook een oplossing zijn.

De schroefdraad moet fijner zijn dan de standaardschroef. De pitch is ongeveer 1,3 mm en voor M6 is dat 0,8 mm. De motor heeft niet genoeg koppel om de standaardschroef aan te draaien.

De moer moet goed worden gesmeerd, omdat de motor de schroef op de hogere instellingen nauwelijks kan draaien

Stap 4: Configuratie

Configuratie
Configuratie
Configuratie
Configuratie

Om code te uploaden naar ESP32 vanuit Arduino IDE moet je deze tutorial volgen:

Het bord is "WeMos LOLIN32", maar de "Dev-module" werkt ook

Ik raad aan om Visual Studio te gebruiken, maar het kan vaak kapot gaan.

Voor het eerste gebruik

De crank moet worden ingesteld volgens de stap "Crank"

Met behulp van de app "nRF Connect" moet u het MAC-adres van de crank ESP32 controleren en in het BLE.h-bestand instellen.

In regel 19 van indoorBike.ino moet je instellen, hoeveel omwentelingen van de schroef er nodig zijn om de weerstand van helemaal los naar maximaal in te stellen. (Het "maximum" is expres subjectief, met deze instelling pas je de moeilijkheidsgraad aan.)

De slimme trainer heeft "virtuele versnellingen" om ze correct in te stellen, je moet het kalibreren op lijn 28 en 29. Je moet trappen met een constante cadans op een bepaalde weerstandsinstelling, dan het vermogen aflezen en in het bestand instellen. Herhaal dit nogmaals met een andere instelling.

De meest linkse knop schakelt van ERG-modus (absolute weerstand) naar simulatiemodus (virtuele versnellingen). Simulatiemodus zonder computerverbinding doet niets omdat er geen simulatiegegevens zijn.

Regel 36. stelt de virtuele versnellingen in - het aantal en de verhoudingen. Je berekent ze door het aantal tanden in het voortandwiel te delen door het aantal tanden in het achtertandwiel.

In regel 12. zet je het gewicht van de berijder en de fiets (in [newtons], massa maal de zwaartekrachtversnelling!)

Het hele natuurkundige gedeelte hiervan is waarschijnlijk te ingewikkeld en zelfs ik weet niet meer wat het precies doet, maar ik bereken het benodigde koppel om de fietser bergop te trekken of iets dergelijks (daarom de kalibratie).

Deze parameters zijn zeer subjectief, je moet ze na een paar ritten instellen om correct te werken.

De debug COM-poort verzendt directe binaire gegevens die zijn ontvangen door bluetooth tussen aanhalingstekens (' ') en simulatiegegevens.

De configurator

Omdat de configuratie van de zogenaamd realistische fysica een enorm gedoe bleek te zijn om het realistisch te laten voelen, heb ik een GUI-configurator gemaakt waarmee gebruikers grafisch de functie kunnen definiëren die van de helling van de heuvel naar het absolute weerstandsniveau converteert. Hij is nog niet helemaal af en ik heb niet de kans gehad om hem te testen, maar komende maand ga ik een andere motor ombouwen, dus dan ga ik hem poetsen.

Op het tabblad "Versnellingen" kunt u de verhouding van elke versnelling instellen door de schuifregelaars te verplaatsen. U moet dan het stukje code kopiëren om de gedefinieerde tandwielen in de code te vervangen.

Op het tabblad "Grade" krijg je een grafiek van een lineaire functie (ja, het blijkt dat het meest gehate vak in wiskunde eigenlijk nuttig is) die het cijfer neemt (verticale as) en absolute weerstandsstappen uitvoert (horizontale as). Voor de geinteresseerden zal ik wat later op de wiskunde ingaan.

De gebruiker kan deze functie definiëren met behulp van de twee punten die erop liggen. Aan de rechterkant is er een plek om de huidige versnelling te veranderen. De geselecteerde versnelling verandert, zoals je je misschien kunt voorstellen, de manier waarop hellingen worden omgezet in weerstand - in lagere versnellingen is het gemakkelijker om bergopwaarts te trappen. Door de schuifregelaar te verplaatsen, verandert de 2e coëfficiënt, die van invloed is op hoe de geselecteerde versnelling de functie verandert. Het is het gemakkelijkst om er een tijdje mee te spelen om te zien hoe het zich gedraagt. Mogelijk moet u ook een paar verschillende instellingen proberen om te vinden wat het beste voor u werkt.

Het is geschreven in Python 3 en zou moeten werken met standaardbibliotheken. Om het te gebruiken, moet u de regels onmiddellijk verwijderen na "commentaar op deze regels verwijderen om de configurator te gebruiken". Zoals ik al zei, het is niet getest, dus er kunnen enkele fouten zijn, maar als er iets naar voren komt, schrijf dan een opmerking of open een probleem, zodat ik het kan corrigeren.

De wiskunde (en natuurkunde)

De enige manier waarop de controller het gevoel kan geven dat je bergop gaat, is door aan de weerstandsschroef te draaien. We moeten het cijfer omrekenen naar het aantal omwentelingen. Om het instellen te vergemakkelijken, is het hele bereik van volledig los tot het niet kunnen draaien van de slinger verdeeld in 40 stappen, dezelfde als in de ERG-modus, maar deze keer worden reële getallen gebruikt in plaats van gehele getallen. Dit gebeurt met een eenvoudige kaartfunctie - je kunt het opzoeken in de code. Nu zijn we een stap hoger - in plaats van te maken te hebben met omwentelingen van de schroef, hebben we te maken met denkbeeldige stappen.

Hoe werkt het nu eigenlijk als je op de fiets bergop gaat (uitgaande van een constante snelheid)? Er moet natuurlijk een kracht zijn die je omhoog duwt, anders zou je naar beneden rollen. Deze kracht, zoals de eerste bewegingswet ons vertelt, moet even groot zijn, maar tegengesteld in richting aan de kracht die je naar beneden trekt, wil je in een uniforme beweging zijn. Het komt van de wrijving tussen het wiel en de grond en als je het diagram van deze krachten tekent, moet het gelijk zijn aan het gewicht van de fiets en de berijder maal de helling:

F=Fg*G

Wat zorgt ervoor dat het wiel deze kracht uitoefent? Omdat we te maken hebben met tandwielen en wielen, is het gemakkelijker om te denken in termen van koppel, wat simpelweg de kracht maal de straal is:

t=F*R

Omdat er tandwielen bij betrokken zijn, geeft u een koppel op de kruk, die aan de ketting trekt en het wiel draait. Het koppel dat nodig is om het wiel te laten draaien, wordt vermenigvuldigd met de overbrengingsverhouding:

tp=tw*gr

en terug van de koppelformule krijgen we de kracht die nodig is om het pedaal te draaien

Fp=tp/r

Dit kunnen we meten met de vermogensmeter in de crank. Omdat dynamische wrijving lineair gerelateerd is aan de kracht en omdat deze specifieke fiets veren gebruikt om deze kracht te geven, is deze lineair met de beweging van de schroef.

Macht is kracht maal de snelheid (uitgaande van dezelfde richting van vectoren)

P=F*V

en de lineaire snelheid van het pedaal is gerelateerd aan de hoeksnelheid:

V=ω*r

en zo kunnen we de kracht berekenen die nodig is om de pedalen op een bepaald weerstandsniveau te draaien. Omdat alles lineair gerelateerd is, kunnen we verhoudingen gebruiken om dit te doen.

Dit was in wezen wat de software moest berekenen tijdens de kalibratie en met behulp van een omweg om ons een gecompliceerde composiet te geven, maar een lineaire functie die helling aan weerstand relateert. Ik schreef alles op papier, berekende de uiteindelijke vergelijking en alle constanten werden drie coëfficiënten.

Dit is technisch gezien een 3D-functie die een vlak vertegenwoordigt (denk ik) die de helling en de overbrengingsverhouding als argumenten neemt, en deze drie coëfficiënten zijn gerelateerd aan die welke nodig zijn om een vlak te definiëren, maar aangezien de tandwielen discrete getallen zijn, was het gemakkelijker om er een parameter van te maken in plaats van te werken met projecties en dergelijke. De 1e en 3e coëfficiënt kunnen worden gedefinieerd door een enkele lijn en (-1)* de 2e coëfficiënt is de X-coördinaat van het punt, waar de lijn ronddraait bij het schakelen.

In deze visualisatie worden de argumenten weergegeven door de verticale lijn en de waarden door de horizontale, en ik weet dat dit vervelend kan zijn, maar het was intuïtiever voor mij en het paste beter in de GUI. Dat is waarschijnlijk de reden waarom de economen hun grafieken op deze manier tekenen.

Stap 5: Voltooi

Nu heb je wat apps nodig om mee te rijden op je nieuwe trainer (wat je ongeveer $ 900 heeft bespaard:)). Hier zijn mijn meningen over een aantal van hen.

  • RGT Cycling - naar mijn mening de beste - het heeft een volledig gratis optie, maar heeft een beetje weinig tracks. Behandelt het verbindingsgedeelte het beste, omdat je telefoon verbinding maakt via bluetooth en een pc de track weergeeft. Maakt gebruik van realistische video met een AR-fietser
  • Rouvy - veel nummers, alleen betaald abonnement, om de een of andere reden werkt de pc-app hier niet mee, je moet je telefoon gebruiken. Er kunnen problemen zijn wanneer je laptop dezelfde kaart gebruikt voor bluetooth en wifi, hij loopt vaak achter en wil niet laden
  • Zwift - een geanimeerd spel, alleen betaald, werkt redelijk goed met de trainer, maar de gebruikersinterface is vrij primitief - het opstartprogramma gebruikt Internet Explorer om het menu weer te geven.

Als je de build leuk vond (of niet), vertel het me dan in de comments en als je vragen hebt, kun je deze hier stellen of een probleem indienen bij github. Ik leg graag alles uit, want het is best ingewikkeld.

Aanbevolen: