IR remote with arduino to control toy car.

Hello
My daughter has remote controlled car - but remote is missing. I found another remote which is IR instead of 2.4GHz. So I used arduino with IR receiver and motor driver module to replace original car board.

I read codes that IR remote is sending and made up sketch that will controll car. There is one thing I dont know how to do.

Car is going forward, backward, right left etc. as long as there is signal from remote when switch on remote is released remote is sending another code - STOP code- used to switch off motors. But if car looses signal from remote its doing last action he did before loosing signal - if going forward it will go forward until gets STOP code from remote and that is the problem I need help with.
How to stop motors if there is no code received when expected?

I tried it by 'default' case in switch - but that works only if value is different than other cases - not with 'no value received'. tried 'while' , 'if', 'else' but cant get that to work.

my code:

#include <IRremote.h>

int RECV_PIN = 3; //IR signal pin

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{ 
 Serial.begin(9600);
 
 Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
 Serial.println("Enabled IRin");
 
pinMode(6, OUTPUT); //motor controller sleep
 pinMode(8,OUTPUT); //drive 1
 pinMode(9,OUTPUT); //drive 2
 pinMode(10,OUTPUT); //turn 1
 pinMode(11,OUTPUT);  //turn 2
}

void loop() 
{
 digitalWrite(6,HIGH); //motor driver on - LOW signal can be used to turn off motors when signal lost
 if (irrecv.decode(&results)) 

 {Serial.println(results.value, HEX);
     switch(results.value)
     {        

       
       case 0x952D6661:  
       
       Serial.println("Forward Straight"); 
                        digitalWrite(8,LOW);
                        digitalWrite(9,HIGH);
                        digitalWrite(10,LOW);
                        digitalWrite(11,LOW);
                        break;       

       case 0x23262881:  
       Serial.println(" Forward Left"); 
                        digitalWrite(8,LOW);
                        digitalWrite(9,HIGH);
                        digitalWrite(10,LOW);
                        digitalWrite(11,HIGH);
                        break; 
   
        case 0x919A644A:  
        Serial.println(" Forward Right"); 
                        digitalWrite(8,LOW);
                        digitalWrite(9,HIGH);
                        digitalWrite(10,HIGH);
                        digitalWrite(11,LOW);
                        break;   


                        
         case 0xE213B5FC:  
         Serial.println("Back"); 
                        digitalWrite(8,HIGH);
                        digitalWrite(9,LOW);
                        digitalWrite(10,LOW);
                        digitalWrite(11,LOW);
                        break;    
                        
                               
        case 0x9AC34E4B:  
        Serial.println(" Back Right"); 
                        digitalWrite(8,HIGH);
                        digitalWrite(9,LOW);
                        digitalWrite(10,LOW);
                        digitalWrite(11,HIGH);
                        break; 
                        

           
       case 0xDAE44B8A:  
       Serial.println(" Back Left"); 
                        digitalWrite(8,HIGH);
                        digitalWrite(9,LOW);
                        digitalWrite(10,HIGH);
                        digitalWrite(11,LOW);
                        break;  

      case 0x64CBF9DA:  
      Serial.println(" Turn Left"); 
                        digitalWrite(8,LOW);
                        digitalWrite(9,LOW);
                        digitalWrite(10,LOW);
                        digitalWrite(11,HIGH);
                        break; 
   
        case 0x607B80BB:  
        Serial.println(" Turn Right"); 
                        digitalWrite(8,LOW);
                        digitalWrite(9,LOW);
                        digitalWrite(10,HIGH);
                        digitalWrite(11,LOW);
                        break;   

   case 0xEE587246:  
   Serial.println(" Neutral"); 
                        digitalWrite(8,LOW);
                        digitalWrite(9,LOW);
                        digitalWrite(10,LOW);
                        digitalWrite(11,LOW);
      
     }  

    
   }

   irrecv.resume(); // Receive the next value

 }

Any help will be appreciated.
Thank you

fdx:
Car is going forward, backward, right left etc. as long as there is signal from remote when switch on remote is released remote is sending another code - STOP code- used to switch off motors. but if car looses signal from remote its doing last action he did before loosing signal - if going forward it will go forward until gets STOP code from remote. and that is the problem I need help with.

Could you maybe throw some punctuation in there (periods, capitalization, etc.) to separate the various things you're trying to say?

It would help, too, if you edited your post to include code tags.

One way of handling this is to implement a timeout. No new signal received in some specified time can be counted as a stop.

It's not too difficult, try Googling "IRremote timeout". There are a few examples out there.

Steve

Thank you. Its not difficult to google something if you know what to search for.

In the mean time I'm still open for other ideas.

Thanks

I was thinking of what that part is doing:

if (irrecv.decode(&results))

isn't IF there is Result do SWITCH or continue rest of the code below SWITCH cases? can I do that line inside a little loop ?

something like

//  int i=0;


void loop() 
{
goto wait;

wait:
 
 if (irrecv.decode(&results)) 
{

digitalWrite(6,HIGH); 

i=0; //wait loop with no signal counter

goto switch;
}

else 
{

i=i+1;
if (i>64, digitalWrite(6, LOW));  //main loop goes 17 times between IR signals i=64 give it time to wait for three signals before stopping motors.
 
goto wait;

}

switch:

     switch(results.value)
     {        

       
       case 0x952D6661:  


...etc.. 


 irrecv.resume(); // Receive the next value

goto wait;
}

(I can test it on monday as car and remote are left in my workplace but maybe you can take a look on that code to see if there is a chance it will work)

Final code. I found example of timeout that use millis() and do action if no signal from remote for some time.

#include <IRremote.h>
#define MAX_TIME 500 // max ms between codes

int RECV_PIN = 3;//Pin should be PWM
long lastPressTime = 0;
int state = LOW;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{ 
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
 // Serial.println("Enabling IRin");
   irrecv.enableIRIn(); // Start the receiver
  //Serial.println("Enabled IRin");
  
pinMode(6, OUTPUT); //motor controller sleep
  pinMode(8,OUTPUT); //drive 1
  pinMode(9,OUTPUT); //drive 2
  pinMode(10,OUTPUT); //turn 1
  pinMode(11,OUTPUT);  //turn 2
   digitalWrite(6,LOW);
}
void loop() 
{
   //motor driver on - LOW signal can be used to turn off motors when signal lost
  if (irrecv.decode(&results)) 
 {
  
 // Serial.println(results.value, HEX);
  if (1) {     //if any code from remote received
      switch(results.value)
      {        
/*remote  
 * 
set for channel A:*/
 
        
        case 0x952D6661:  
        
      //  Serial.println("Forward Straight"); 
        digitalWrite(6,HIGH);
          state =HIGH;
                         digitalWrite(8,LOW);
                         digitalWrite(9,HIGH);
                         digitalWrite(10,LOW);
                         digitalWrite(11,LOW);
                       
                         break;       
                         
        case 0x23262881:  
      //  Serial.println(" Forward Left"); 
        digitalWrite(6,HIGH);
          state =HIGH;
                         digitalWrite(8,LOW);
                         digitalWrite(9,HIGH);
                         digitalWrite(10,LOW);
                         digitalWrite(11,HIGH);
                         break; 
    
         case 0x919A644A:  
       //  Serial.println(" Forward Right"); 
         digitalWrite(6,HIGH);
           state =HIGH;
                         digitalWrite(8,LOW);
                         digitalWrite(9,HIGH);
                         digitalWrite(10,HIGH);
                         digitalWrite(11,LOW);
                         break;   


                         
          case 0xE213B5FC:  
        //  Serial.println("Back"); 
          digitalWrite(6,HIGH);
            state =HIGH;
                         digitalWrite(8,HIGH);
                         digitalWrite(9,LOW);
                         digitalWrite(10,LOW);
                         digitalWrite(11,LOW);
                         break;    
                         
                                
         case 0x9AC34E4B:  
        // Serial.println(" Back Right"); 
         digitalWrite(6,HIGH);
           state =HIGH;
                         digitalWrite(8,HIGH);
                         digitalWrite(9,LOW);
                         digitalWrite(10,LOW);
                         digitalWrite(11,HIGH);
                         break; 
                         

            
        case 0xDAE44B8A:  
       // Serial.println(" Back Left"); 
        digitalWrite(6,HIGH);
          state =HIGH;
                         digitalWrite(8,HIGH);
                         digitalWrite(9,LOW);
                         digitalWrite(10,HIGH);
                         digitalWrite(11,LOW);
                         break;  

       case 0x64CBF9DA:  
    //   Serial.println(" Turn Left"); 
       digitalWrite(6,HIGH);
         state =HIGH;
                         digitalWrite(8,LOW);
                         digitalWrite(9,LOW);
                         digitalWrite(10,LOW);
                         digitalWrite(11,HIGH);
                         break; 
    
         case 0x607B80BB:  
        // Serial.println(" Turn Right"); 
         digitalWrite(6,HIGH);
           state =HIGH;
                         digitalWrite(8,LOW);
                         digitalWrite(9,LOW);
                         digitalWrite(10,HIGH);
                         digitalWrite(11,LOW);
                         break;   
    case 0xEE587246:  
   // Serial.println(" Neutral"); 
    digitalWrite(6,LOW);
      state = LOW;
                         digitalWrite(8,LOW);
                         digitalWrite(9,LOW);
                         digitalWrite(10,LOW);
                         digitalWrite(11,LOW);
       
      }
      lastPressTime = millis();  
  }
     
    irrecv.resume(); // Receive the next value
  }
  if (state == HIGH && millis() - lastPressTime > MAX_TIME) {
    state = LOW; // Haven't heard from the button for a while, so not pressed and last state value was HIGH - motors running
    
    digitalWrite(6, LOW); //stop motors
  //  Serial.println("STOP");
  }
}