Projektin ideana oli rakentaa arduino+lcd -yhdistelmästä “tehomittari” polkupyörän traineriin. Idean perustana on Kurt Kineticin Road Machine traineri, ja tälle määritetty nopeus-teho yhtälö jonka perusteella poljentatehon voi laskea tunnetun nopeuden perusteella.
http://www.kurtkinetic.com/road-machine-p-35-l-en.html
Funktio on: P = (5.244820) * mph + (0.01968) * 3 * mph
Absoluuttisen oikeita treenitehoja yhtälöllä ei luonnollisestikkaan saa, koska tuo on Kineticin luoma matemaattinen malli sille kuinka paljon tehoa pitää tuottaa jonkun tietyn nopeuden ylläpitämiseksi stabiilissa ympäristössä (tuuleton tasamaa yms…). Pieni virhe todellisesta tehosta ei haittaa kunhan se pysyy saman harjoituksesta toiseen.
Projektin esikuva on Kurt Kineticin oma tehotietokone, joka pitää sisällään tuon edellämainitun tehokaava.
http://www.kurtkinetic.com/kinetic-wired-power-computer-p-152-l-en.html
Arduino tehomittarin toiminta perustuu reed-anturiin. Anturin avulla lasketaan renkaan pyörähtämiseen kulunut aika, ja tämän perusteella nopeus ja teho. Anturi sijoitettiin Sigman polkupyörän nopeusmittarin anturin yhteyteen ja magneettina toimi hyvin Sigman oma pinnaan sijoitettu magneetti.
#include <glcd.h>
#include "fonts/allFonts.h"
#include "bitmaps/allBitmaps.h"
const int reedPin = 48;
const float circu = 2.1; // circumference of a 700x23 tyre (in meters)
unsigned long loopTimer = 0;
unsigned long lastSeen = 0;
unsigned long startTime = 0;
unsigned long delta = 0;
float delta_s = 0;
float spd = 0;
float spd_fra = 0;
int pwr = 0;
int running = 0;
char line[20];
void setup(){
GLCD.Init(NON_INVERTED);
GLCD.ClearScreen();
GLCD.SelectFont(System5x7);
GLCD.ClearScreen();
pinMode(reedPin, INPUT);
Serial.begin(9600);
}
void loop(){
loopTimer = millis();
running = 0;
while (millis() - loopTimer < 1000 ){
if ( digitalRead(reedPin) == HIGH ) {
lastSeen = millis();
running = 1;
}
delta = lastSeen - startTime;
startTime = lastSeen;
delta_s = (float)delta / 1000;
if ( delta > 10 ) {
spd = ( circu / delta_s ) * 3.6;
spd_fra = ( spd - (int)spd )*100;
pwr = ((5.244820) * (spd / 0.62 )) + ((0.01968) * (spd / 0.62 ) * 3);
}
}
if (running != 1 ) {
spd = 0;
spd_fra = 0;
pwr = 0;
}
sprintf(line, "Speed: %02d,%02d km/h", (int)spd, (int)spd_fra);
GLCD.CursorTo(1,1);
GLCD.print(line);
sprintf(line, "Pwr: %03d Watts", pwr);
GLCD.CursorTo(1,2);
GLCD.print(line);
}
Ja mittari toiminnassa
Jatkoprojektina seuraaksi tuon kotelointi ja softan jatkokehittäminen (trippitoiminnot jne.).
Vielä kuin kerkeisi treenaamaan, eikä vaan neppailemaan arduinoa…