ayuda unificar codigos

hola gente. necesito su ayuda. resulta que quiero unificar los codigos de dos proyectos, uno es el forcefeedback para juegos con arduino, proyecto que publique en la sección proyectos. y el otro es un tacometro con motor pap bipolar y un control manual de posición de la aguja. como una imagen vale mas que mil palabras les dejo los videos asi puedo darme entender mejor cual es la función de cada codigo.
tacometro

codigo:

//codigo tacometro con motor pap
//nicko_esx2014


#include <Stepper.h>

#define STEPS 200

Stepper stepper(STEPS,10,11);


int rpm;
int i;
int previous_potion = 0;
int rotate;



int led = 13; 


char kind_of_data;

int botonpin = 2;
int botonpin2 = 3;

int botonState;
int botonState2;


void setup(){

 Serial.begin(9600);

 stepper.setSpeed(100);
 
 pinMode(led, OUTPUT); 
 
 pinMode(botonpin, INPUT);
 pinMode (botonpin2, INPUT);
 
 
 
}

void loop()
{
 
  botonState = digitalRead(botonpin);
botonState2 = digitalRead(botonpin2);
 
 while(Serial.available() > 0)  
 {
   kind_of_data = Serial.read();
   
      
   if (kind_of_data == 'R' ) Read_Rpm();
     
}
 
 
 
 
 
 
 if (botonState == HIGH && botonState2 == LOW)
 {
   rotate = 0; 
   
   stepper.step(rotate + 1);
   delay(10);
 }
 
 if (botonState == LOW && botonState2 == HIGH)
 {
   rotate = 0;
   
   stepper.step(rotate - 1);
   delay(10);
 }
   
   
   
  
 }
 
 
 

 
void  Read_Rpm(){

 delay(2);
int Rpm100 = Serial.read()- '0';
 delay(2);
 int Rpm10 = Serial.read()- '0';
 delay(2);
 int Rpm1 = Serial.read()- '0';

 
 
 
 
 int rpm = 100*Rpm100 + 10*Rpm10 + Rpm1;
 rpm = map(rpm,0,200,0,200);
  rotate = rpm - previous_potion;
 stepper.step(rotate);
 previous_potion = rpm;




delay(10);

  
 if (rpm >=250) {digitalWrite(led,HIGH); 
 delay(10);
 digitalWrite(led,LOW);}
 
if (rpm < 250) {digitalWrite(led,LOW);

}
 
   
   
}

forcefeedback

codigo:

//codigo forcefeedback arduino
//nicko_esx2014
    int motor = 5;
int motor2 = 6;
    int giroi;
    int girod;
    int Gforce = 0;
    int Gforce1 = 0;
    int Gforce10 = 0;
    int Gforce100 = 0;

    char kind_of_data;

    void setup() {
                     
      
      Serial.begin(9600);
    }

    void loop() {

      
      while(Serial.available() > 0) {
       
        kind_of_data = Serial.read(); //para USO X~a01~ Y~a02~
        if(kind_of_data == 'X') {
          Read_Pos(kind_of_data);
        }
        if(kind_of_data == 'S') {
          Read_Pos(kind_of_data);
        }
      }
    }
       
    void Read_Pos(char motor_ffb){
      delay(2);
      int Gforce100 = Serial.read()- '0';
      delay(2);
      int Gforce10 = Serial.read()- '0';
      delay(2);
      int Gforce1 = Serial.read()- '0';
     
      
     //if (Gforce1 < 0) { Gforce = Gforce10 + 10*Gforce100; }
     // if (Gforce1 < 0 && Gforce10 < 0) { Gforce = Gforce100; }
    // if (Gforce100 < 0) { Gforce = 127; }
    //  if (Gforce1 >=0 && Gforce10 >= 0 && Gforce100 >= 0) { Gforce = 100 * Gforce100 + 10 * Gforce10 + Gforce1; }
Gforce = 100 * Gforce100 + 10 * Gforce10 + Gforce1;
      
      if (motor_ffb == 'X') {
        
        //Gforce = constrain ( Gforce, -255 , 255); 
        
        if (Gforce < -100) {
             giroi = Gforce ;    
       giroi = map(Gforce  ,-255 ,-100 , 100, 200);  
       giroi = constrain (giroi, 100 , 200);
        analogWrite(motor2,0);
        analogWrite(motor,giroi);
        
        delay(10);

      
        }
      if(Gforce > 100){
       girod = Gforce;
        girod = map (Gforce , 100, 255, 100 , 200 );
        girod = constrain (girod, 100 , 200);
        analogWrite(motor,0);
        analogWrite(motor2,girod );
        
        delay(10);

      }
     
      
  if (Gforce >= -80 && Gforce <= 80){
analogWrite(motor,0);
        analogWrite(motor2,0);
        delay (10);
      }
  
  }
      if (motor_ffb == 'S') { //para el stop
        analogWrite(motor,0);
        analogWrite(motor2,0);
    }
    }

ahora al unificarlos como en el siguiente codigo, surgen problemas... aparentaria ser que en algun momento queda en un loop y no puede salir. digo esto por que no varia la fuerza del force es decir queda tirando sin respuesta para un solo lado, como tambien el tacometro comienza a dar vueltas para cualquir lado. gira sin sentido...... y no responde el swich manual. otro problema que me hace deducir que puede ser un loop es que no responde a la señal de stop,

if (motor_ffb == 'S') { //para el stop
        analogWrite(motor,0);
        analogWrite(motor2,0);

la verdad e intentado cambiar varias cosas y no dan resultado. intente incluir el breack pero sigue dandose los loop. en algun momento pude tener algo de estabilidad combinando solamente la seccion del codigo del tacometro sin el control manual junto con el forcefeedback. pero tarde o temprano vuelve a suceder lo mismo.
podrian hecharle un vistaso?
codigo combinado:

//codigo unificado forcefeedback y tacometro con control manual
//nicko_esx 2014


#include <Stepper.h>

#define STEPS 200

Stepper stepper(STEPS,10,11);


int rpm;
int i;
int previous_potion = 0;
int rotate;

 

int led = 13; 



int botonpin = 2;
int botonpin2 = 3;

int botonState;
int botonState2;


//



    int motor = 5;
int motor2 = 6;
    int giroi;
    int girod;
    int Gforce = 0;
    int Gforce1 = 0;
    int Gforce10 = 0;
    int Gforce100 = 0;

    char kind_of_data;

    
    
    
    
    
    void setup() {
                     
      
      Serial.begin(9600);
      
      stepper.setSpeed(100);
 
 pinMode(led, OUTPUT); 
 
 pinMode(botonpin, INPUT);
 pinMode (botonpin2, INPUT);

botonState = digitalRead(botonpin);
botonState2 = digitalRead(botonpin2);
       
     
    }

    void loop() {

 

   /* if (botonState == HIGH && botonState2 == LOW)
 {
   rotate = 0; 
   
   stepper.step(rotate + 1);
   delay(10);
 }
 
 if (botonState == LOW && botonState2 == HIGH)
 {
   rotate = 0;
   
   stepper.step(rotate - 1);
   delay(10);
 }
      
   */
    
      
      while (Serial.available() > 0) {
       
        kind_of_data = Serial.read(); //para USO X~a01~ Y~a02~
        if(kind_of_data == 'X') {
          Read_Pos(kind_of_data);
        }
        if(kind_of_data == 'S') {
          Read_Pos(kind_of_data);                 
        }
        if (kind_of_data == 'R' && botonState == LOW && botonState2 == LOW ) {Read_Rpm();
        }
      if (kind_of_data == 'R' && botonState == HIGH && botonState2 == LOW)
 {
   rotate = 0; 
   
   stepper.step(rotate + 1);
   delay(10);
 }
   
   
   if (kind_of_data == 'R' &&  botonState == LOW && botonState2 == HIGH)
 {
   rotate = 0;
   
   stepper.step(rotate - 1);
   delay(10);
 }
   
     
break;
}                  
}
       
void Read_Pos(char motor_ffb){
      delay(2);
      int Gforce100 = Serial.read()- '0';
      delay(2);
      int Gforce10 = Serial.read()- '0';
      delay(2);
      int Gforce1 = Serial.read()- '0';
     
      
     //if (Gforce1 < 0) { Gforce = Gforce10 + 10*Gforce100; }
     // if (Gforce1 < 0 && Gforce10 < 0) { Gforce = Gforce100; }
    // if (Gforce100 < 0) { Gforce = 127; }
    //  if (Gforce1 >=0 && Gforce10 >= 0 && Gforce100 >= 0) { Gforce = 100 * Gforce100 + 10 * Gforce10 + Gforce1; }
Gforce = 100 * Gforce100 + 10 * Gforce10 + Gforce1;
      
      if (motor_ffb == 'X') {
        
        //Gforce = constrain ( Gforce, -255 , 255); 
        
        if (Gforce < -100) {
             giroi = Gforce ;    
       giroi = map(Gforce  ,-255 ,-100 , 100, 200);  
       giroi = constrain (giroi, 100 , 200);
        analogWrite(motor2,0);
        analogWrite(motor,giroi);
        
        delay(10);

      
        }
      if(Gforce > 100){
       girod = Gforce;
        girod = map (Gforce , 100, 255, 100 , 200 );
        girod = constrain (girod, 100 , 200);
        analogWrite(motor,0);
        analogWrite(motor2,girod );
        
        delay(10);

      }
     
      
  if (Gforce >= -80 && Gforce <= 80){
analogWrite(motor,0);
        analogWrite(motor2,0);
        delay (10);
      }
  
  }
if (motor_ffb == 'S') { //para el stop
        analogWrite(motor,0);
        analogWrite(motor2,0);
}
 
 
 
 }
    
  
  
  
   void  Read_Rpm(){

 delay(2);
int Rpm100 = Serial.read()- '0';
 delay(2);
 int Rpm10 = Serial.read()- '0';
 delay(2);
 int Rpm1 = Serial.read()- '0';

 
 
 
 
 int rpm = 100*Rpm100 + 10*Rpm10 + Rpm1;
 rpm = map(rpm,0,200,0,200);
  rotate = rpm - previous_potion;
 stepper.step(rotate);
 previous_potion = rpm;




delay(10);

  
 if (rpm >=250) {digitalWrite(led,HIGH); 
 delay(10);
 digitalWrite(led,LOW);}
 
if (rpm < 250) {digitalWrite(led,LOW);

}
 
  
   
}

espero les guste el proyecto, al que le interese lo puedo guiar con el armado.