Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
Introduksjon
Et velkjent amerikansk treningsselskap (Wahoo) har nylig hentet ut et flott innendørs treningshjelpemiddel som hever og senker fronten på sykkelen på turbotreneren i henhold til den simulerte høyden som brukeren sykler (Kickr Climb).
Ser fantastisk ut, men dessverre er dette ikke tilgjengelig for oss alle, da du trenger 1) en Wahoo -trener i toppklasse og 2) £ 500 kontanter for å gjøre dette ditt.
Jeg brakk en krageben (satte aldri en landeveissyklist på en terrengsykkel) så jeg hadde flere kilometer på treneren og mer tid til å tinke og tenkte at dette kunne være et morsomt prosjekt.
Den kommersielle enheten simulerer -5% til +20%, så jeg ønsket å komme nær det, men på 10% av budsjettet!
Dette er designet rundt min Tacx Neo, men en hvilken som helst trener som sender sine strøm- og hastighetsdata via ANT+ eller BLE kan få det til å fungere (jeg tror!).
Siden hjulbasen på landeveissykkelen min måler nøyaktig 1000 mm, må jeg løfte gaflene med 200 mm for å simulere 20% (se bilde), slik at en 200 mm lineær aktuator ville gjøre det. Sykkelen + ryttervekten vil neppe overstige 100kg, og siden dette er fordelt mellom akslene og det meste er på baksiden, vil 750N løfte 75kg og burde være ok. Raskere aktuatorer er tilgjengelige for mer penger, men denne kostet meg rundt £ 20 og klarer 10 mm/sek. Aktuatorer med potensiometre som kan brukes som enkle servoer er også 2 til 3 ganger dyrere.
Rekvisita
3D -utskrift (PLA eller ABSetc) av adapteren for gjennomgående aksel:
100 mm 3/4 tommer 10 SWG aluminiumsrørlager (for en gjennomgående akselramme)
80 mm 6 mm rustfritt stålstanglager
3D -utskrift (PLA eller ABSetc) av skoen for den lineære aktuatordelen:
3D-utskrift av saken til H-broen
3D -utskrift av saken til Arduino (versjon 1 med tastatur) https://www.thingiverse.com/thing:3984911 (versjon 2 som vist (https://www.thingiverse.com/thing:3995976)
Laserskåret stykke 3 mm klar akryl 32 x 38 mm for å hindre deg i å svette over elektronikken (gjorde det, ikke ideelt).
Noen blødningsblokker (tilpasset for å la putene ligge i) for å forhindre at du ved et uhell skyver skyvekolbe stemplene ut av Shimano skivebremsene i din entusiasme
Lineær aktuator 750N 200 mm reise f.eks. Al03 mini lineære aktuatorer fra
L298N H -bro (som:
Arduino Nano IoT 33 www.rapidonline.com bestilling 73-4863
2 -tasters membrantastatur f.eks.
IIC I2C Logic Level Converter Bi-directional Module 5V til 3.3V For Arduino f.eks.
12V 3A DC strømforsyning - de for LED -belysning fungerer bra!
NPE CABLE Ant+ to BLE bridge
Utklippbart 3D -klipp for CABLE -broen
1.3 OLED LCD -skjermmodul med IIC I2C -grensesnitt 128x32 3.3V
Trinn 1: Litt matematikk
Vi må beregne stigningen som simuleres. Jeg hadde håpet at treneren ville annonsere disse dataene sammen med hastighet, kraft, tråkkfrekvens etc. men treneren setter ganske enkelt motstand for å opprettholde effekt ut fra programvaren på nettbrettet, datamaskinen osv. Som brukes til å kontrollere dem. Jeg hadde ingen måte å enkelt fange den "simulerte karakteren" fra programvaren, så jeg måtte jobbe bakover …
Kreftene som virker på sykkelen og rytteren er en kombinasjon av resistive tap og kraften som trengs for å bestige bakken. Treneren rapporterer hastighet og kraft. Hvis vi kan finne de resistive tapene ved en gitt hastighet, blir den gjenværende kraften brukt til å bestige bakken. Kraften til å klatre avhenger av vekten på sykkelen og rytteren og stigningshastigheten, slik at vi kan jobbe tilbake til stigningen.
Først brukte jeg den fantastiske https://bikecalculator.com for å finne noen datapunkter for resistivt effekttap ved typiske hastigheter. Så transformerte jeg hastighetsdomenet til å produsere et lineært forhold og fant linjen som passer best. Ved å ta ligningen for linjen kan vi nå beregne effekt (W) fra motstand = (0.0102*(Speedkmh^2.8))+9.428.
Ta kraften fra motstanden fra den målte kraften for å gi kraften til 'klatring'.
Vi kjenner oppstigningshastigheten i km/t og konverterer dette til SI -enheter på m/s (divider med 3,6).
Helling er funnet fra: Helling (%) = ((PowerClimbing/(WeightKg*g))/Speed)*100
der akselerasjon av fritt fall g = 9,8m/s/s eller 9,8 N/kg
Trinn 2: Få noen data
Beregning av stigning krever hastighet og kraft. Jeg brukte en Arduino Nano 33 IoT for å koble til treneren via BLE for å motta dette. Jeg ble veldig fast først da den nåværende v.1.1.2 -versjonen av det opprinnelige ArduinoBLE -biblioteket for denne modulen ikke håndterer autentisering i noen form som betyr at de fleste (?) Kommersielle BLE -sensorer ikke vil koble seg til den.
Løsningen var å bruke en NPE-kabel ANT+ til BLE-bro (https://npe-inc.com/cableinfo/) som holder treneren innebygd BLE fri for at treningsappen skal kommunisere og krever ingen autentisering på BLE side.
BLE -effektkarakteristikken er ganske enkel ettersom effekten i watt er inneholdt i den andre og tredje byten av de overførte dataene som et 16 -bits heltall (lite endian, dvs. minst signifikant oktett først). Jeg brukte et glidende gjennomsnittsfilter for å gi 3s gjennomsnittlig effekt - akkurat som sykkelcomputeren min viser - da dette er mindre uberegnelig.
if (powerCharacteristic.valueUpdated ()) {
// Definer en matrise for verdien uint8_t holdpowervalues [6] = {0, 0, 0, 0, 0, 0}; // Les verdi i array powerCharacteristic.readValue (holdpowervalues, 6); // Strøm returneres som watt på plassering 2 og 3 (loc 0 og 1 er 8 biters flagg) byte rawpowerValue2 = holdpowervalues [2]; // kraft minst sig byte i HEX byte rawpowerValue3 = holdpowervalues [3]; // power most sig byte in HEX long rawpowerTotal = (rawpowerValue2 + (rawpowerValue3 * 256)); // Bruk filter for glidende gjennomsnitt for å gi '3s power' powerTrainer = movingAverageFilter_power.process (rawpowerTotal);
BLE -hastighetskarakteristikken (Cycling Speed and Cadence) er en av de tingene som får deg til å lure på hva i all verden SIG røykte da de skrev spesifikasjonen.
Karakteristikken returnerer en 16 -bytes matrise som hverken inneholder hastighet eller kadence. I stedet får du hjulomdreininger og sveivomdreininger (totaler) og tid siden siste hendelsesdata på 1024 sekunder av et sekund. Så mer matte da. Oh, og byte er ikke alltid tilstede, så det er en flaggbyte i starten. Oh, og byte er lite endian HEX, så du må lese bakover multiplisere den andre byten med 256, tredje med 65536 osv. Og deretter legge dem sammen. For å finne hastighet må du anta en standard sykkelhjulomkrets for å vite avstand ….
if (speedCharacteristic.valueUpdated ()) {
// Denne verdien trenger en 16 byte matrise uint8_t holdvalues [16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Men jeg skal bare lese de første 7 speedCharacteristic.readValue (holdvalues, 7); byte rawValue0 = holdvalues [0]; // binære flagg 8 bit int byte rawValue1 = holdvalues [1]; // revolusjoner minst signifikante byte i HEX byte rawValue2 = holdvalues [2]; // revolusjoner neste viktigste byte i HEX byte rawValue3 = holdvalues [3]; // revolusjoner neste viktigste byte i HEX byte rawValue4 = holdvalues [4]; // revolusjoner mest signifikante byte i HEX byte rawValue5 = holdvalues [5]; // tid siden siste hjulhendelse minst sig byte byte rawValue6 = holdvalues [6]; // tid siden siste hjulhendelse mest sig byte if (firstData) {// Få kumulative hjulomdreininger som lite endian hex i loc 2, 3 og 4 (minst signifikant oktett først) WheelRevs1 = (rawValue1 + (rawValue2 * 256) + (rawValue3 * 65536) + (rawValue4 * 16777216)); // Få tid siden siste hjulhendelse i 1024. av en annen Time_1 = (rawValue5 + (rawValue6 * 256)); firstData = false; } annet {// Få andre sett med data long WheelRevsTemp = (rawValue1 + (rawValue2 * 256) + (rawValue3 * 65536) + (rawValue4 * 16777216)); lang TimeTemp = (rawValue5 + (rawValue6 * 256)); hvis (WheelRevsTemp> WheelRevs1) {// sørg for at sykkelen beveger seg WheelRevs2 = WheelRevsTemp; Time_2 = TimeTemp; firstData = true;}
// Finn avstandsforskjell i cm og konverter til km float distanceTravelled = ((WheelRevs2 - WheelRevs1) * wheelCircCM);
flyte kmTravelled = distanceTravelled / 1000000;
// Finn tid på 1024 sekunder av sekundet og konverter til timer
float timeDifference = (Time_2 - Time_1); float timeSecs = timeDifference / 1024; float timeHrs = timeSecs / 3600;
// Finn hastighet kmh
speedKMH = (kmTravelled / timeHrs);
Arduino -skissen er arrangert på GitHub (https://github.com/mockendon/opengradesim).
Trinn 3: Maskinvare 1 den lineære aktuatoren
Gjennomgående aksel på min skivebrems landeveissykkel angir en 19,2 mm aksel for å fjerne 12 mm gjennomgående aksel med 100 mm mellom gaflene.
Lager 3/4 tommer 10swg aluminiumsrør er en perfekt passform og en fin fyr som heter Dave på ebay (https://www.ebay.co.uk/str/aluminiumonline) leveres og kutter det i lengden for meg for et par kilo.
Aktuatoren har en 20 mm stang med et 6 mm hull, så den 3D -trykte delen knytter aluminiumsrøret til en 6 mm stålstang, og siden kreftene er 90% kompresjon, er noen PLA / ABS opp til utfordringen.
Hvis du kjører et standard hurtigoppsettoppsett, ville noe som dette (https://www.amazon.co.uk/Sharplace-Quick-Release-Conversion-Adapter/dp/B079DCY344) unngå å måtte redesigne denne komponenten.
Støvelen er designet for å passe inn i raiser -blokken som fulgte med min Tacx -trener, men vil trolig passe inn i mange lignende raisers, eller du kan bare redigere TinkerCad -filen for å passe dine behov.
Trinn 4: Maskinvare 2 - H -broen
Disse L298N H brokortene som er veldig vanlige på nettet har en innebygd 5V regulator som er flott for å drive Arduino fra 12V strømforsyningen som kreves for den lineære aktuatoren. Dessverre er Arduino Nano IoT -kortet 3,3V signal, og derfor er det behov for en logisk nivåomformer (eller en optoisolator siden signalene bare er enveis).
Etuiet er designet for å godta strømkontaktene som vanligvis brukes i LED -belysningsprogrammer. Jeg slaktet en USB -forlengelsesledning for å gjøre det mulig å koble / koble fra Arduino -hovedenheten enkelt, og mens jeg var sikker på å bruke kraftlinjene for strøm og datalinjene for 3.3V -signalering, vil jeg ærlig gi råd mot dette da jeg hater noen å steke USB -porter eller eksterne enheter ved å koble dem til ved en feiltakelse!
Trinn 5: Maskinvare 3 kontrollelektronikken (Arduino)
Etuiet til Arduino OLED og logisk nivåomformer har en standard 1/2 omdreining i Garmin -stil på baksiden slik at den kan monteres sikkert på sykkelen. Et "ut foran" feste vil tillate at enheten kan vippes opp eller ned til "null" akselerometerposisjonen eller en kodelinje bare for automatisk null i starten ville være lett å legge til.
Etuiet har plass til et membrantastatur - dette brukes til å angi kombinert rytter- og sykkelvekt. Du kan bare sette dette programmatisk, spesielt hvis du ikke deler en trener med noen.
Det kan være fint å implementere en 'manuell' modus. Kanskje du kan starte en manuell modus ved å trykke på begge knappene, og deretter kan knappene øke / redusere stigningen. Jeg skal legge dette til huskelisten!
STL -filen i saken er igjen tilgjengelig på Thingiverse (se forsyningsdelen for lenke).
Arduino -skissen er arrangert på GitHub (https://github.com/mockendon/opengradesim).
Du kan skrive ut et pent lite klipp for din CABLE -bro herfra
Trinn 6: 'The Rear Drop Outs'
Mange mennesker har tatt opp spørsmålet om den bakre slippingen mens sykkelen beveger seg. Noen trenere har en aksel som beveger seg (som Kickr), men mange gjør det ikke.
For øyeblikket er min beste løsning for meg å montere noen vanlige 61800-2RS dype sporlagre (ca. £ 2 hver) på hurtigutløseradapterne og deretter montere de gjennomgående akselfallene på disse (se bilder) med en overstørrelse QR-spyd
Lagrene trenger en tynn mellomleggsskive, f.eks. M12 16 mm 0,3 mm mellom adapteren og lageret.
De passer perfekt og roterer med sykkelen og spydet uavhengig av treneren.
For øyeblikket endrer dette forskyvningen på drivsiden med et par mm, så du må indeksere den på nytt
Jeg designer tilpassede deler (se pdf-plan) til maskin (på min fremtidige svogers dreiebenk når han har en time til å hjelpe!). Disse er ikke testet ennå !!! Men å slipe 1 mm av den indre overflaten av QR -adapteren på lagerstasjonen, er en rask løsning uten spesialverktøy;)