Öppen (cykel) klasssimulator - OpenGradeSIM: 6 steg
Öppen (cykel) klasssimulator - OpenGradeSIM: 6 steg
Anonim
Image
Image
Öppen (cykel) betygssimulator - OpenGradeSIM
Öppen (cykel) betygssimulator - OpenGradeSIM
Öppen (cykel) betygssimulator - OpenGradeSIM
Öppen (cykel) betygssimulator - OpenGradeSIM

Introduktion

Ett visst känt amerikanskt fitnessföretag (Wahoo) tog nyligen fram ett bra inomhus träningshjälpmedel som höjer och sänker cykelns framsida på turbotränaren enligt den simulerade backen som användaren åker (Kickr Climb).

Ser fantastiskt ut men tyvärr är detta inte tillgängligt för oss alla eftersom du kommer att behöva 1) en Wahoo -tränare i toppklass och 2) £ 500 kontanter för att göra detta ditt.

Jag bröt nyckelbenet (satte aldrig en cykel på en mountainbike) så jag hade fler mil på tränaren och mer tid att pyssla och tyckte att det här kunde vara ett roligt projekt.

Den kommersiella enheten simulerar -5% till +20% så jag ville komma nära det men på 10% av budgeten!

Detta är utformat runt min Tacx Neo men alla tränare som sänder sin effekt- och hastighetsdata via ANT+ eller BLE kan fås att fungera (jag tror!).

Eftersom hjulbasen på min racercykel mäter exakt 1000 mm skulle jag behöva lyfta gafflarna med 200 mm för att simulera 20% (se bild) så en 200 mm linjär ställdon skulle göra. Cykeln + ryttarens vikt kommer sannolikt inte att överstiga 100kg och eftersom detta är fördelat mellan axlarna och det mesta är på baksidan kommer 750N att lyfta 75kg och borde vara ok. Snabbare ställdon är tillgängliga för mer pengar men den här kostade mig runt £ 20 och klarar 10 mm/sek. Ställdon med potentiometrar som kan användas som enkla servon är också 2 till 3 gånger dyrare.

Tillbehör

3D -utskrift (PLA eller ABSetc) av genomgående axeladapterdel:

100 mm 3/4 tum 10 swg aluminiumrörslager (för en genomgående axelram)

80 mm av 6 mm stång i rostfritt stål

3D -utskrift (PLA eller ABSetc) av skon för den linjära ställdonets del:

3D-utskrift av fodralet för H-bron

3D -utskrift av fodralet för Arduino (version 1 med knappsats) https://www.thingiverse.com/thing:3984911 (version 2 som visas (https://www.thingiverse.com/thing:3995976)

Laserskuren bit av 3 mm klar akryl 32 x 38 mm för att hindra dig från att svettas över hela elektroniken (gjorde det, inte perfekt).

Några blödningsblock (anpassade för att lämna dynorna) för att förhindra att du av misstag trycker ut kolvkolvarna från dina Shimano -skivbromsar i din entusiasm

Linjär ställdon 750N 200 mm resa t.ex. Al03 minilinjära ställdon från

L298N H -brygga (som:

Arduino Nano IoT 33 www.rapidonline.com beställning 73-4863

2 -tangenters membrantangentbord, t.ex.

IIC I2C Logic Level Converter Bi-directional Module 5V to 3.3V For Arduino t.ex.

12V 3A DC -strömförsörjning - de för LED -belysning fungerar utmärkt!

NPE CABLE Ant+ to BLE bridge

3D -utskrivbart klipp för CABLE -bron

1,3 OLED LCD -displaymodul med IIC I2C -gränssnitt 128x32 3,3V

Steg 1: Lite matematik

Lite matematik
Lite matematik

Vi måste beräkna lutningen som simuleras. Jag hade hoppats att tränaren skulle annonsera dessa data tillsammans med hastighet, kraft, kadens etc. men tränaren ställer helt enkelt in motstånd för att bibehålla effekt enligt programvaran på surfplattan, datorn etc som används för att styra den. Jag hade inget sätt att enkelt fånga den 'simulerade betyget' från programvaran så jag skulle behöva jobba bakåt …

De krafter som verkar på cykeln och ryttaren är en kombination av resistiva förluster och den kraft som behövs för att bestiga backen. Tränaren rapporterar hastighet och effekt. Om vi kan hitta de resistiva förlusterna vid en given hastighet används den återstående kraften för att bestiga backen. Kraften att klättra beror på vikten av cykeln och ryttaren och stigningstakten och så kan vi arbeta tillbaka till lutningen.

Först använde jag den fantastiska https://bikecalculator.com för att hitta några datapunkter för resistiv effektförlust vid typiska hastigheter. Sedan omvandlade jag hastighetsdomänen till ett linjärt förhållande och hittade den bästa passformslinjen. Med linjens ekvation kan vi nu beräkna effekt (W) från motstånd = (0.0102*(Speedkmh^2.8))+9.428.

Ta kraften från motståndet från den uppmätta effekten för att ge kraften "klättring".

Vi känner till uppstigningshastigheten i km/tim och konverterar detta till SI -enheter på m/s (dividera med 3,6).

Lutning hittas från: Incline (%) = ((PowerClimbing/(WeightKg*g))/Speed)*100

där acceleration av fritt fall g = 9,8m/s/s eller 9,8 N/kg

Steg 2: Skaffa lite data

Skaffa lite data
Skaffa lite data

Lutningsberäkningen kräver hastighet och kraft. Jag använde en Arduino Nano 33 IoT för att ansluta till tränaren via BLE för att ta emot detta. Jag fastnade mycket först eftersom den nuvarande versionen v.1.1.2 av det inbyggda ArduinoBLE -biblioteket för den här modulen inte hanterar autentisering i någon form vilket innebär att de flesta (?) Kommersiella BLE -sensorer inte kommer att para med det.

Lösningen var att använda en NPE-kabel ANT+ till BLE-brygga (https://npe-inc.com/cableinfo/) som håller tränarens inbyggda BLE gratis så att träningsappen kan kommunicera över och kräver ingen autentisering på BLE sida.

BLE -effektkarakteristiken är ganska okomplicerad eftersom effekten i watt finns i den andra och tredje byten i den överförda datan som ett 16 -bitars heltal (lite endian, dvs. minst signifikant oktett först). Jag applicerade ett rörligt genomsnittligt filter för att ge 3s genomsnittlig effekt - precis som min cykeldator visar - eftersom det är mindre oregelbundet.

if (powerCharacteristic.valueUpdated ()) {

// Definiera en array för värdet uint8_t holdpowervalues [6] = {0, 0, 0, 0, 0, 0}; // Läs värde i array powerCharacteristic.readValue (holdpowervalues, 6); // Effekt returneras som watt på plats 2 och 3 (loc 0 och 1 är 8 bitars flaggor) byte rawpowerValue2 = holdpowervalues [2]; // effekt minst sig byte i HEX byte rawpowerValue3 = holdpowervalues [3]; // power most sig byte i HEX long rawpowerTotal = (rawpowerValue2 + (rawpowerValue3 * 256)); // Använd filtret för rörligt medelvärde för att ge '3s power' powerTrainer = movingAverageFilter_power.process (rawpowerTotal);

BLE -hastighetskarakteristiken (Cycling Speed and Cadence) är en av de sakerna som får dig att undra vad i helvete SIG rökte när de skrev specifikationen.

Karakteristiken returnerar en 16 -bytes array som varken innehåller hastighet eller kadens. Istället får du hjulvarv och vevvarv (totals) och tid sedan senaste händelsedata på 1024: e sekunder. Så mer matte då. Åh, och byten är inte alltid närvarande så det finns en flaggbyte i början. Åh, och byte är lite endian HEX så du måste läsa bakåt multiplicera den andra byten med 256, tredje med 65536 etc. sedan lägga till dem tillsammans. För att hitta hastighet måste du anta en vanlig cykelhjulomkrets för att veta avstånd ….

if (speedCharacteristic.valueUpdated ()) {

// Detta värde behöver en 16 -bytes array uint8_t holdvalues [16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Men jag ska bara läsa de första 7 speedCharacteristic.readValue (hållvalues, 7); byte rawValue0 = hållvärden [0]; // binära flaggor 8 bitars int byte rawValue1 = hållvärden [1]; // varv minst minsta byte i HEX -byte rawValue2 = hållvärden [2]; // varv nästa näst viktigaste byte i HEX byte rawValue3 = hållvärden [3]; // varv nästa näst viktigaste byte i HEX -byte rawValue4 = hållvärden [4]; // revolutioner mest signifikanta byte i HEX -byte rawValue5 = hållvärden [5]; // tid sedan senaste hjulhändelsen minst sig byte byte rawValue6 = hållvärden [6]; // tid sedan senaste hjulhändelsen mest sig byte if (firstData) {// Få kumulativa hjulvarv som lite endian hex i loc 2, 3 och 4 (minst signifikant oktett först) WheelRevs1 = (rawValue1 + (rawValue2 * 256) + (rawValue3 * 65536) + (rawValue4 * 16777216)); // Få tid sedan senaste hjulhändelsen på 1024: e av andra Time_1 = (rawValue5 + (rawValue6 * 256)); firstData = false; } annat {// Få andra uppsättningen data lång WheelRevsTemp = (rawValue1 + (rawValue2 * 256) + (rawValue3 * 65536) + (rawValue4 * 16777216)); lång TimeTemp = (rawValue5 + (rawValue6 * 256)); om (WheelRevsTemp> WheelRevs1) {// se till att cykeln rör sig WheelRevs2 = WheelRevsTemp; Time_2 = TimeTemp; firstData = true;}

// Hitta avståndsskillnaden i cm och konvertera till km float distanceTravelled = ((WheelRevs2 - WheelRevs1) * wheelCircCM);

flyta kmTravelled = distanceTravelled / 1000000;

// Hitta tid på 1024: e sekunder och konvertera till timmar

float timeDifference = (Time_2 - Time_1); float timeSecs = timeDifference / 1024; float timeHrs = timeSecs / 3600;

// Hitta hastighet kmh

speedKMH = (kmTravelled / timeHrs);

Arduino -skissen är värd på GitHub (https://github.com/mockendon/opengradesim).

Steg 3: Hårdvara 1 det linjära ställdonet

Hårdvara 1 det linjära ställdonet
Hårdvara 1 det linjära ställdonet
Hårdvara 1 det linjära ställdonet
Hårdvara 1 det linjära ställdonet
Hårdvara 1 det linjära ställdonet
Hårdvara 1 det linjära ställdonet

Genomgående axeln på min skivbromscykel anger en 19,2 mm axel för att rensa 12 mm genomgående axel med 100 mm mellan gafflarna.

Stock 3/4 tum 10swg aluminiumrör passar perfekt och en fin kille som heter Dave på ebay (https://www.ebay.co.uk/str/aluminiumonline) levereras och skär den i längd för mig för några kilo.

Ställdonet har en 20 mm stång med ett 6 mm hål så den 3D -tryckta delen länkar aluminiumröret till en 6 mm stålstång och eftersom krafterna är 90% kompression är vissa PLA / ABS klara utmaningen.

Om du kör en standardinställning för snabb release skulle något liknande detta (https://www.amazon.co.uk/Sharplace-Quick-Release-Conversion-Adapter/dp/B079DCY344) undvika att behöva göra om den här komponenten.

Stöveln är utformad för att passa in i höjningsblocket som levererades med min Tacx -tränare men skulle förmodligen passa i många liknande höjare eller så kan du bara redigera TinkerCad -filen för att passa dina krav.

Steg 4: Hårdvara 2 - H -bron

Hårdvara 2 - H -bron
Hårdvara 2 - H -bron
Hårdvara 2 - H -bron
Hårdvara 2 - H -bron
Hårdvara 2 - H -bron
Hårdvara 2 - H -bron

Dessa L298N H brokort som är mycket vanliga online har en inbyggd 5V regulator som är utmärkt för att driva Arduino från 12V strömförsörjning som krävs för det linjära ställdonet. Tyvärr är Arduino Nano IoT -kortet 3,3V -signalering, varför behovet av en logisk nivåomvandlare (eller en optoisolator eftersom signalerna endast är enriktad).

Fodralet är utformat för att acceptera strömkontakter som vanligtvis används i LED -belysningsprogram. Jag slaktade en USB -förlängningskabel för att göra det möjligt att enkelt ansluta / koppla från Arduino -huvudenheten och medan jag var säker på att använda kraftledningarna för ström och datalinjerna för 3.3V -signalen skulle jag ärligt ge råd mot detta eftersom jag hatar någon att steka sina USB -portar eller kringutrustning genom att ansluta dem av misstag!

Steg 5: Hårdvara 3 kontrollelektroniken (Arduino)

Hardware 3 the Control Electronics (Arduino)
Hardware 3 the Control Electronics (Arduino)
Hårdvara 3 Control Electronics (Arduino)
Hårdvara 3 Control Electronics (Arduino)
Hårdvara 3 Control Electronics (Arduino)
Hårdvara 3 Control Electronics (Arduino)

Fodralet för Arduino OLED och logic -nivåomvandlare har ett standardfäste i 1/2 varv i Garmin -stil på baksidan så att det kan monteras säkert på cykeln. Ett "utåt" -fäste gör att enheten kan lutas uppåt eller nedåt till "noll" accelerometerpositionen eller en kodrad bara för att automatiskt nolla vid starten skulle vara lätt att lägga till.

Fodralet har plats för ett membranknappsats - detta används för att ställa in den kombinerade ryttar- och cykelvikten. Du kan bara ställa in detta programmatiskt, särskilt om du inte delar en tränare med någon.

Det kan vara trevligt att implementera ett manuellt läge. Kanske kan ett manuellt läge startas genom att trycka på båda knapparna och sedan kan knapparna öka / minska lutningen. Jag lägger till detta i att-göra-listan!

Ärendets STL -fil är återigen tillgänglig på Thingiverse (se länken till leveransavsnittet).

Arduino -skissen är värd på GitHub (https://github.com/mockendon/opengradesim).

Du kan skriva ut ett snyggt litet klipp för din CABLE -bro härifrån

Steg 6: 'The Rear Drop Outs'

'The Rear Drop Outs'
'The Rear Drop Outs'
'The Rear Drop Outs'
'The Rear Drop Outs'
'The Rear Drop Outs'
'The Rear Drop Outs'

Många människor har tagit upp frågan om den bakre släppningen när cykeln rör sig. Vissa tränare har en axel som rör sig (som Kickr) men många gör det inte.

För närvarande är min bästa lösning för mig att montera några vanliga 61800-2RS djupa spårlager (cirka £ 2 vardera) på snabbkopplingsadaptrarna och sedan montera de genomgående axeldropparna på dessa (se bilder) med en överstor QR-spett

Lagren behöver en tunn mellanläggsbricka, t.ex. M12 16 mm 0,3 mm mellan adaptern och lagret.

De passar perfekt och roterar med cykeln och spetten oberoende av tränaren.

För närvarande ändrar detta förskjutningen på drivsidan med ett par mm så du måste indexera om

Jag konstruerar anpassade delar (se pdf-plan) för maskin (på min blivande svågers svarv när han har en timme att hjälpa till!). Dessa är inte testade än !!! Men att slipa 1 mm från den inre ytan av lageradapterens QR -adapter är en snabb lösning utan specialverktyg;)