By Hans Näsström
This is a Virtual Cycling VIDEO-CONTROLER connected to a reed-switch on your training/spinning -bike.
This program can control video playback speed on a VLC media player by emulating Hot-key´s for the player,
works only on ARDUINO LEONARDO systems. It controls speed from 40% to 200% and stops and pause if you stop pedaling.
At normal pedaling speed the video will play at 100% speed.
For this to work properly ---
1: Start the video with a suitable video and then set it in pause mode (key U).
2: Start (connect) the ARDUINO LEONARDI and wait 10 sec. for it to set up.
3: And away you go! - Start pedaling!
Set VLC-Hotkeys as follows,---- Tools--Preferences--Hotkeys-----
[Pause/Play]: Double click, set and save both Hotkey and Global, set to: the letter u
[Slower (fine)]: Double click, set and save both Hotkey and Global, set to: numpad 4
[Faster (fine)]: Double click, set and save both Hotkey and Global, set to: numpad 6
Save these settings and close the player for it to take effect.
A large number of virtual cycling videos can be downloaded from YouTube, my favorite is:
You can download this video from this place, note the double ss before youtube…
[http://www.ssyoutube.com/watch?v=FTmPk8qpxQA&playnext=1&list=PLXx7G1Mb0J8V4lAGyRzL2g07LBLqLHYZL&feature=results_main]
You will need this hardware fixes:
Set a magnet on and a magnetic reed-switch by the trainer-bike´s wheel, closing only ONES every wheel turn,
(magnet north pole pointing towards the reed-switch).
Attached the reed-switch cables to Digital pin3 and Ground on the Arduino Leonardo.
Set a pull up resistor 100kOhm between +5V and Digital pin3
This software is free to use but on your one risk. Beware it will send keystrokes u, 4, and 6 now and then.
Happy Cycling/Training!
int videostep=1;
int steplevel=1;
int pause_run=0; // run = 1 pause = 0
int Rot = 0; // Wheel rotation counter
int bike_wheel_rev = 0;
unsigned long time;
float cruise=61; // ATTENTION!! Set this value to the number of wheelturns on YOUR bike during
// 4 sek and normal cruising speed (the video will go at 100% speed at this count)
void setup()
{
time=millis();
while ((time+5000)>millis()); { } // time for system to settle, setting up Com port etc
Serial.begin(9600);
attachInterrupt(0, rpm, FALLING); // Set a pull up 10K resistor from 5V to Digital pin 3 (interupt 0).
cli(); // Disable interrupts for now
// initialize control over the keyboard:
Keyboard.begin();
//Step down speed from 100% to 40%
int var = 0;
while(var < 6){
Keyboard.press('4'); delay(100); Keyboard.releaseAll();delay(100);
var++;
}
}
void loop ()
{
int Rot=0;
bike_wheel_rev = 0; //Set bike_wheel counter to 0
sei(); //Enables interrupts
delay (4000); //count # bike wheel rev during 4 sec
cli(); //Disable interrupts
Rot = (bike_wheel_rev); //Rot = revolutions during 4 sec
if (Rot<20 && pause_run == 1) {
pause_run = 0;
Keyboard.press('u'); delay(100); Keyboard.releaseAll(); delay(100);
}
if (Rot>19 && pause_run == 0) {
pause_run = 1;
Keyboard.press('u'); delay(100); Keyboard.releaseAll(); delay(100);
}
if (Rot<(cruise*0.4)) { steplevel=1;} // Serial.println("1-#");
if (Rot>(cruise*0.5)) { steplevel=2;} // Serial.println("2-##");
if (Rot>(cruise*0.6)) { steplevel=3;} // Serial.println("3-###"); wheel speed at 50% video speed
if (Rot>(cruise*0.7)) { steplevel=4;} // Serial.println("4-####");
if (Rot>(cruise*0.8)) { steplevel=5;} // Serial.println("5-#####");
if (Rot>(cruise*0.9)) { steplevel=6;} // Serial.println("6-######");
if (Rot>cruise) { steplevel=7;} // Serial.println("7-#######"); Wheel speed at 100% video speed
if (Rot>(cruise*1.1)) { steplevel=8;} // Serial.println("8-########");
if (Rot>(cruise*1.2)) { steplevel=9;} // Serial.println("9-#########");
if (Rot>(cruise*1.3)) { steplevel=10;} // Serial.println("10-##########");
if (Rot>(cruise*1.4)) { steplevel=11;} // Serial.println("11-###########");
if (Rot>(cruise*1.5)) { steplevel=12;} // Serial.println("12-############");
if (Rot>(cruise*1.6)) { steplevel=13;} // Serial.println("13-#############");
if (Rot>(cruise*1.7)) { steplevel=14;} // Serial.println("14-##############");
if (Rot>(cruise*1.8)) { steplevel=15;} // Serial.println("15-###############");
if (Rot>(cruise*1.9)) { steplevel=16;} // Serial.println("16-################");
if (Rot>(cruise*2)) { steplevel=17;} // Serial.println("16-################"); Wheel speed at 200% video speed
while (videostep<steplevel && steplevel<17) // adjust video speed by stepping controler to the right, (step up speed)
{
videostep = videostep +1;
Keyboard.press('6'); delay(100); Keyboard.releaseAll(); delay(100);
}
while (videostep>steplevel&&steplevel>0)// adjust video speed by stepping controler to the left, (step down speed)
{
videostep = videostep -1;
Keyboard.press('4'); delay(100); Keyboard.releaseAll(); delay(100);
}
}
void rpm () //This is the function that the interupt calls
{
bike_wheel_rev++;
delay(100);
}
/[Code]
[/code]