Guest User

Honda Speedo VSS signal generator

a guest
Apr 24th, 2014
2,120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.22 KB | None | 0 0
  1. #include <TimerOne.h>
  2.  
  3. // Emulate the Honda Integra VSS signal.
  4. // +5v square wave @ 50% duty cycle, 4 pulses per revolution.
  5. // 637 rpm -> 60km/h
  6.  
  7. // uses Timer1 to do PWM: http://playground.arduino.cc/Code/Timer1
  8.  
  9. // Author: thetoolman at gmail dot com
  10.  
  11. int vss = 10;                     // Pin that VSS signal will be output on
  12.  
  13. float scaleFactor = 1;            // scale signal length  
  14. int pulsesPerRevolution;          // expect 1+
  15. float rpmPerKmh;                  // expect > 0
  16. int dutyCycle;                    // expect 0-100
  17. unsigned long micro;              // period of pwm cycle
  18.  
  19. char serialBuffer[32];
  20. int bufferPtr = -1;               // current last char
  21.  
  22. void setup() {    
  23.   Serial.begin(9600);             // initialize serial port
  24.   pinMode(vss, OUTPUT);           // initialize pin as an output
  25.  
  26.   Timer1.initialize();            // initalise timer1
  27.  
  28.   setPulsesPerRevolution(4);      // Honda VSS default
  29.   setDutyCycle(50);               // Honda VSS default
  30.   setRpmPerKmh((637.0 / 60.0));   // Honda VSS default; Integra manual specifies 637 rpm -> 60km/h (and 1km for odo)
  31.  
  32.   setScaleFactor(1.033);          // experimentally, my Integra unit was 3.3% overreading.
  33.                                   // Integra does 140km/h in 180 degrees, Mini does 105Km/h, so:
  34.                                   // Mini speedo scale:  1.033 x (140/105) = 0.77475
  35.  
  36.   setKmh(20.0);
  37.  
  38.   Serial.println("Type in a value followed by a command to update the speedo signal, eg:");
  39.   Serial.println("");
  40.   Serial.println("'100k' - update the (k)m/h displayed to 100km/h");
  41.   Serial.println("'1.5s' - scale future km/h updates by 1.5x");
  42.   Serial.println("'200h' - send a 200hz signal");
  43.   Serial.println("'100r' - send 100 RPM equivalent signals");
  44.   Serial.println("'100m' - send a signal every 100 usec");
  45.   Serial.println("'20d'  - set duty cycle to 20%");
  46.   Serial.println("");
  47. }
  48.  
  49. void loop() {
  50.   checkSerial();
  51. }
  52.  
  53. void checkSerial() {
  54.   while(Serial.available()) {
  55.     serialBuffer[++bufferPtr] = Serial.read();
  56.    
  57.     //check for non-numeric value for action
  58.     char thisChar = serialBuffer[bufferPtr];
  59.     if((thisChar < '0' || thisChar > '9') && thisChar != '.'){
  60.       if(bufferPtr < 1) {
  61.         Serial.println("No quantity specified.");
  62.        
  63.       } else if (bufferPtr >= 32) {
  64.         Serial.println("Too much input, ignoring it.");
  65.        
  66.       } else {
  67.         serialBuffer[bufferPtr + 1] = 0; // add null to end
  68.         float quantity = atof(serialBuffer);
  69.          switch (thisChar) {
  70.           case 'k':
  71.           case 'K':
  72.             setKmh(quantity); // Km/h
  73.             break;
  74.            
  75.           case 'h':
  76.           case 'H':
  77.             setHz(quantity);
  78.             break;
  79.            
  80.           case 'r':
  81.           case 'R':
  82.             setRpm(quantity);
  83.             break;
  84.            
  85.           case 'm':
  86.           case 'M':
  87.             setCycleLengthMicros((long) quantity);
  88.             break;
  89.            
  90.           case 'd':
  91.           case 'D':
  92.             setDutyCycle((int) quantity);
  93.             break;
  94.            
  95.           case 's':
  96.           case 'S':
  97.             setScaleFactor(quantity);
  98.             break;
  99.            
  100.           default:
  101.             Serial.print("Couldnt understand command: ");
  102.             Serial.println( thisChar );
  103.         }
  104.       }
  105.       bufferPtr = -1;
  106.     }
  107.   }
  108. }
  109.  
  110. void setKmh(float kmh) {
  111.   if(kmh <= 0.0) return;
  112.   printFloat(kmh);
  113.   Serial.print(" Km/h");
  114.   if(scaleFactor != 1.0) {
  115.     kmh = kmh / scaleFactor;
  116.     Serial.print(" scaled by ");
  117.     printFloat(scaleFactor);
  118.     Serial.print("");
  119.   }
  120.   Serial.println( "" );
  121.   setRpm(kmh * rpmPerKmh); 
  122. }
  123.  
  124. void setHz(float hz) {
  125.   if(hz <= 0.0) return;
  126.   printFloat(hz);
  127.   Serial.println(" Hz");
  128.   setCycleLengthMicros((unsigned long) (1000000.0 / hz));  
  129. }
  130.  
  131. void setRpm(float rpm) {
  132.   if(rpm <= 0.0) return;
  133.   printFloat(rpm);
  134.   Serial.println(" RPM");
  135.   setCycleLengthMicros( (unsigned long)
  136.      (60.0 * 1000000.0 / (rpm * pulsesPerRevolution)) );   
  137. }
  138.  
  139.  
  140. // actual signal representation setters
  141. void setCycleLengthMicros(unsigned long newMicro) {
  142.   Serial.print("Cycle length: ");
  143.   Serial.print(newMicro);
  144.   Serial.println(" micros");
  145.   micro = newMicro;
  146.   Timer1.pwm(vss, dutyCycle, micro);
  147. }
  148.  
  149. void setDutyCycle(int newDutyCycle) {
  150.   if(newDutyCycle > 100 || newDutyCycle < 0) return;
  151.   Serial.print("Duty cycle: ");
  152.   Serial.print(newDutyCycle);
  153.   Serial.println("%");
  154.   dutyCycle = (newDutyCycle * 10.23); //% -> 0-1023
  155.   Timer1.pwm(vss, dutyCycle, micro);
  156. }
  157.  
  158. // setters that only affect the next change
  159. void setRpmPerKmh(float rpk) {
  160.   if(rpk <= 0) return;
  161.   Serial.print("Revolutions per Km/h: ");
  162.   printFloat(rpk);
  163.   Serial.println("");
  164.   rpmPerKmh = rpk;
  165. }
  166.  
  167. void setPulsesPerRevolution(int ppr) {
  168.   if(ppr <= 0) return;
  169.   Serial.print("Pulses per revolution: ");
  170.   Serial.println(ppr);
  171.   pulsesPerRevolution = ppr;
  172. }
  173.  
  174. void setScaleFactor(float sf) {
  175.   if(sf <= 0) return;
  176.   Serial.print("Scale factor: ");
  177.   printFloat(sf);
  178.   Serial.println("");
  179.   scaleFactor = sf;
  180. }
  181.  
  182. //helper function
  183. void printFloat(float in) {
  184.   char sprintfbuffer[15];
  185.   dtostrf(in, 5,3,sprintfbuffer);
  186.   Serial.print(sprintfbuffer);
  187. }
Advertisement
Add Comment
Please, Sign In to add comment