03-Mar-2024, 09:31 AM
(Dit bericht is het laatst bewerkt op 03-Mar-2024, 09:56 AM door HugoW1975.)
De plannen zijn een beetje gewijzigd, de wens voor een goedkope vermogensmeter niet. Ik vond het concept van het 'zwevende' tandwiel mechanisch niet echt haalbaar. Of in ieder geval niet makkelijk te doen voor een amateur. Bij het maken van mijn bagagedrager keek ik naar de fiets en toen viel me op dat er een kettinggeleidewieltje op het trekkende part zit. Daar komt een kracht op en die kracht varieert met hoe hard de ketting trekt. En dus hoe hard je trapt.
De hoek tussen de kettingdelen is 168 graden, als ik met 80 kg tegen het pedaal druk (kruklengte, tandwielradius, Piet Agoras, etc), dan heb ik een 16 kg load cell nodig op die plek. Dus 20, want een maatje kleiner op Amazon is meteen 5, en da's wat weinig. Zo, ik weet dan dus koppel.
Vervolgens wil ik op het hoofdtandwiel een inductieve sensor zetten (hier kom ik later nog op terug) en het volgende doen:
Bij iedere puls het koppel meten en accumuleren.
Bij iedere puls een teller ophogen.
Na evenveel pulsen als er tanden op het tandwiel zitten, het gemiddelde koppel van die omwenteling berekenen (accumulatie / aantal pulsen). En ik kan ook meten hoelang dat aantal pulsen geduurd heeft, dus weet ik toerental per seconde. Met koppel en toerental weet ik vermogen. Jee! Gelukt!
Dus ben ik aan de slag gegaan met een Arduino Uno, ik heb de load cell met HX711 versterkertje en de inductieve sensor gekocht. Ik had nog een TM1637 4-cijferig displayjte liggen, perfect voor de toepassing. Voor de testopstelling heb ik de inductieve sensor even door een drukknopje vervangen, zo kan ik makkelijk pulsen genereren. Ik heb code geschreven (daar ben ik nog een beginner in), waarbij ik het aantal tanden per omwenteling even op '5' gezet heb. Dus ik hoef maar 5 keer te drukken op het knopje voor een omwenteling, geen 55 (? Ik moet nog eens echt tellen hoeveel het er zijn op mijn fiets).
Dit is de code:
Het lijkt al een beetje te werken (de factor '-1000' in regel 84 heb ik even toegevoegd voor een toonbaar getal) maar nu komen de problemen uiteraard pas boven. De 'TorqueTare' en de 'TorqueFactor' boeien me nog niet zoveel, dat wordt een kwestie van meten en uitrekenen als de boel op de fiets gemonteerd is. Ijken. Andere dingen boeien mij wel. Zo blijkt mijn HX711 maar 10 signalen per seconden te geven. Da's wel erg weinig. Ik kan dat aanpassen naar 80, dat lijkt me beter. Maar ik krijg bij 150 toeren per minuut van het hoofdtandwiel (heb ik even als max ingeschat, is denk ik wat hoog) en 55 tanden op het tandwiel wel 137,5 pulsen per seconde van de inductieve sensor. Ik weet niet of dat teveel is, het lijkt me wel.
Zo, dat is waar ik nu ben, alle input is welkom. Liefst wel positief opbouwend
Hugo
De hoek tussen de kettingdelen is 168 graden, als ik met 80 kg tegen het pedaal druk (kruklengte, tandwielradius, Piet Agoras, etc), dan heb ik een 16 kg load cell nodig op die plek. Dus 20, want een maatje kleiner op Amazon is meteen 5, en da's wat weinig. Zo, ik weet dan dus koppel.
Vervolgens wil ik op het hoofdtandwiel een inductieve sensor zetten (hier kom ik later nog op terug) en het volgende doen:
Bij iedere puls het koppel meten en accumuleren.
Bij iedere puls een teller ophogen.
Na evenveel pulsen als er tanden op het tandwiel zitten, het gemiddelde koppel van die omwenteling berekenen (accumulatie / aantal pulsen). En ik kan ook meten hoelang dat aantal pulsen geduurd heeft, dus weet ik toerental per seconde. Met koppel en toerental weet ik vermogen. Jee! Gelukt!
Dus ben ik aan de slag gegaan met een Arduino Uno, ik heb de load cell met HX711 versterkertje en de inductieve sensor gekocht. Ik had nog een TM1637 4-cijferig displayjte liggen, perfect voor de toepassing. Voor de testopstelling heb ik de inductieve sensor even door een drukknopje vervangen, zo kan ik makkelijk pulsen genereren. Ik heb code geschreven (daar ben ik nog een beginner in), waarbij ik het aantal tanden per omwenteling even op '5' gezet heb. Dus ik hoef maar 5 keer te drukken op het knopje voor een omwenteling, geen 55 (? Ik moet nog eens echt tellen hoeveel het er zijn op mijn fiets).
Dit is de code:
Citaat:[font=Consolas, "Courier New", monospace]/*
02-03-2024 HugoW
This is the sketch for my Arduino based bicyle power gauge.
It uses an Arduino Nano, a TM1637 display, an inductive sensor on the bike's main sprocket
and a load cell with a wheel pressing on the power-part of the chain.
The harder you push on the pedal, the bigger the chain tension.
The sketch records the load cell value at each passing of a tooth and adds those numbers together.
After one full revolution, the accumulated number is devided by the number of teeth, is the average torque (with a bit of
calculating to get from load cell amplifier signal to real torque in Nm). The average torque multiplied by RPS(revolutions per second) is Watts.
*/
// Include libraries:
#include <Arduino.h>
#include <TM1637Display.h>
#include <HX711.h>
// Declare variables and pins:
// For torque measurement and power calculation:
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;
long Torque;
HX711 scale;
int TorqueSum;
int TorqueTare;
int TorqueFactor;
int Wattage;
// For TM1637 display:
#define CLK 9
#define DIO 10
TM1637Display display = TM1637Display(CLK, DIO);
// For tooth pulse input:
int ToothSensorState;
int ToothSensor = 5;
int ToothState;
int ToothCount;
int NumberOfTeeth;
// For cycle time:
int StartMillis;
int StopMillis;
int CycleDuration;
void setup()
{
// Declare pins and such:
Serial.begin(9600);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
pinMode(ToothSensor, INPUT);
// Setup display:
display.clear();
display.setBrightness(7);
// Set changing values to zero
ToothSensorState = 0;
TorqueSum = 0;
StartMillis = 0;
StopMillis = 0;
display.showNumberDec(0, false);
// Set fixed values:
NumberOfTeeth = 5;
TorqueTare = 0;
TorqueFactor = 1;
}
void loop()
{
ToothSensorState = digitalRead(ToothSensor);
if ((ToothSensorState == 1) && (ToothState == 0) && (ToothCount < NumberOfTeeth))
{
Torque = scale.read();
ToothState = 1;
TorqueSum = (TorqueSum + Torque);
ToothCount = (ToothCount + 1);
}
if ((ToothSensorState == 1) && (ToothState == 0) && (ToothCount >= NumberOfTeeth))
{
Torque = scale.read();
ToothState = 1;
TorqueSum = TorqueSum + Torque;
ToothCount = 0;
StopMillis = millis();
CycleDuration = ((StopMillis - StartMillis) / 1000);
StartMillis = millis();
Wattage = (((TorqueSum * -1000 / NumberOfTeeth) - TorqueTare) * TorqueFactor / CycleDuration);
TorqueSum = 0;
display.showNumberDec(Wattage, false);
Serial.println(Wattage);
}
if ((ToothSensorState == 0) && (ToothState == 1))
{
ToothState = 0;
}
}
[/font]
Het lijkt al een beetje te werken (de factor '-1000' in regel 84 heb ik even toegevoegd voor een toonbaar getal) maar nu komen de problemen uiteraard pas boven. De 'TorqueTare' en de 'TorqueFactor' boeien me nog niet zoveel, dat wordt een kwestie van meten en uitrekenen als de boel op de fiets gemonteerd is. Ijken. Andere dingen boeien mij wel. Zo blijkt mijn HX711 maar 10 signalen per seconden te geven. Da's wel erg weinig. Ik kan dat aanpassen naar 80, dat lijkt me beter. Maar ik krijg bij 150 toeren per minuut van het hoofdtandwiel (heb ik even als max ingeschat, is denk ik wat hoog) en 55 tanden op het tandwiel wel 137,5 pulsen per seconde van de inductieve sensor. Ik weet niet of dat teveel is, het lijkt me wel.
Zo, dat is waar ik nu ben, alle input is welkom. Liefst wel positief opbouwend
Hugo