Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <TimerOne.h>
- // Emulate the Honda Integra VSS signal.
- // +5v square wave @ 50% duty cycle, 4 pulses per revolution.
- // 637 rpm -> 60km/h
- // uses Timer1 to do PWM: http://playground.arduino.cc/Code/Timer1
- // Author: thetoolman at gmail dot com
- int vss = 10; // Pin that VSS signal will be output on
- float scaleFactor = 1; // scale signal length
- int pulsesPerRevolution; // expect 1+
- float rpmPerKmh; // expect > 0
- int dutyCycle; // expect 0-100
- unsigned long micro; // period of pwm cycle
- char serialBuffer[32];
- int bufferPtr = -1; // current last char
- void setup() {
- Serial.begin(9600); // initialize serial port
- pinMode(vss, OUTPUT); // initialize pin as an output
- Timer1.initialize(); // initalise timer1
- setPulsesPerRevolution(4); // Honda VSS default
- setDutyCycle(50); // Honda VSS default
- setRpmPerKmh((637.0 / 60.0)); // Honda VSS default; Integra manual specifies 637 rpm -> 60km/h (and 1km for odo)
- setScaleFactor(1.033); // experimentally, my Integra unit was 3.3% overreading.
- // Integra does 140km/h in 180 degrees, Mini does 105Km/h, so:
- // Mini speedo scale: 1.033 x (140/105) = 0.77475
- setKmh(20.0);
- Serial.println("Type in a value followed by a command to update the speedo signal, eg:");
- Serial.println("");
- Serial.println("'100k' - update the (k)m/h displayed to 100km/h");
- Serial.println("'1.5s' - scale future km/h updates by 1.5x");
- Serial.println("'200h' - send a 200hz signal");
- Serial.println("'100r' - send 100 RPM equivalent signals");
- Serial.println("'100m' - send a signal every 100 usec");
- Serial.println("'20d' - set duty cycle to 20%");
- Serial.println("");
- }
- void loop() {
- checkSerial();
- }
- void checkSerial() {
- while(Serial.available()) {
- serialBuffer[++bufferPtr] = Serial.read();
- //check for non-numeric value for action
- char thisChar = serialBuffer[bufferPtr];
- if((thisChar < '0' || thisChar > '9') && thisChar != '.'){
- if(bufferPtr < 1) {
- Serial.println("No quantity specified.");
- } else if (bufferPtr >= 32) {
- Serial.println("Too much input, ignoring it.");
- } else {
- serialBuffer[bufferPtr + 1] = 0; // add null to end
- float quantity = atof(serialBuffer);
- switch (thisChar) {
- case 'k':
- case 'K':
- setKmh(quantity); // Km/h
- break;
- case 'h':
- case 'H':
- setHz(quantity);
- break;
- case 'r':
- case 'R':
- setRpm(quantity);
- break;
- case 'm':
- case 'M':
- setCycleLengthMicros((long) quantity);
- break;
- case 'd':
- case 'D':
- setDutyCycle((int) quantity);
- break;
- case 's':
- case 'S':
- setScaleFactor(quantity);
- break;
- default:
- Serial.print("Couldnt understand command: ");
- Serial.println( thisChar );
- }
- }
- bufferPtr = -1;
- }
- }
- }
- void setKmh(float kmh) {
- if(kmh <= 0.0) return;
- printFloat(kmh);
- Serial.print(" Km/h");
- if(scaleFactor != 1.0) {
- kmh = kmh / scaleFactor;
- Serial.print(" scaled by ");
- printFloat(scaleFactor);
- Serial.print("");
- }
- Serial.println( "" );
- setRpm(kmh * rpmPerKmh);
- }
- void setHz(float hz) {
- if(hz <= 0.0) return;
- printFloat(hz);
- Serial.println(" Hz");
- setCycleLengthMicros((unsigned long) (1000000.0 / hz));
- }
- void setRpm(float rpm) {
- if(rpm <= 0.0) return;
- printFloat(rpm);
- Serial.println(" RPM");
- setCycleLengthMicros( (unsigned long)
- (60.0 * 1000000.0 / (rpm * pulsesPerRevolution)) );
- }
- // actual signal representation setters
- void setCycleLengthMicros(unsigned long newMicro) {
- Serial.print("Cycle length: ");
- Serial.print(newMicro);
- Serial.println(" micros");
- micro = newMicro;
- Timer1.pwm(vss, dutyCycle, micro);
- }
- void setDutyCycle(int newDutyCycle) {
- if(newDutyCycle > 100 || newDutyCycle < 0) return;
- Serial.print("Duty cycle: ");
- Serial.print(newDutyCycle);
- Serial.println("%");
- dutyCycle = (newDutyCycle * 10.23); //% -> 0-1023
- Timer1.pwm(vss, dutyCycle, micro);
- }
- // setters that only affect the next change
- void setRpmPerKmh(float rpk) {
- if(rpk <= 0) return;
- Serial.print("Revolutions per Km/h: ");
- printFloat(rpk);
- Serial.println("");
- rpmPerKmh = rpk;
- }
- void setPulsesPerRevolution(int ppr) {
- if(ppr <= 0) return;
- Serial.print("Pulses per revolution: ");
- Serial.println(ppr);
- pulsesPerRevolution = ppr;
- }
- void setScaleFactor(float sf) {
- if(sf <= 0) return;
- Serial.print("Scale factor: ");
- printFloat(sf);
- Serial.println("");
- scaleFactor = sf;
- }
- //helper function
- void printFloat(float in) {
- char sprintfbuffer[15];
- dtostrf(in, 5,3,sprintfbuffer);
- Serial.print(sprintfbuffer);
- }
Advertisement
Add Comment
Please, Sign In to add comment