Bumper sensor using GPIO - Add bumper sensor on the simulated mobile robot


1. Start "SPL script editor for MSRDS" and add SPL simulation script
  1. Add script on the editor as follows.



      
    MFEmulator    emul1
    	/TargetEmulator:SPLMFConsoleEmulator
    	/Procedure_I2CWrite:proc_i2c_write
    
    StartSimulationEngine  "SimState/basicenv4.xml"
    
    AddDifferentialDriveEntity    base1
    
    FlushScript  
    
      



2. Add bumper sensor as follows.
  1. Add script on the editor as follows.



      
    MFEmulator    emul1
    	/TargetEmulator:SPLMFConsoleEmulator
    	/Procedure_I2CWrite:proc_i2c_write
    
    StartSimulationEngine  "SimState/basicenv4.xml"
    
    AddDifferentialDriveEntity    base1
    
    AddBumperEntity    bumper1
    	/ParentEntity:base1
    	/Procedure_SensorNotify:proc_bumper
    
    FlushScript  
    
      



3. Add procedure definition named "proc_bumper" for bumper event.
  1. Add script on the editor as follows.



      
    MFEmulator    emul1
    	/TargetEmulator:SPLMFConsoleEmulator
    	/Procedure_I2CWrite:proc_i2c_write
    
    StartSimulationEngine  "SimState/basicenv4.xml"
    
    AddDifferentialDriveEntity    base1
    
    AddBumperEntity    bumper1
    	/ParentEntity:base1
    	/Procedure_SensorNotify:proc_bumper
    
    FlushScript  
    
    Procedure  proc_bumper
    	
    	if (value.HardwareIdentifier == 0)
    		emul1.SetGPIO("port5", value.Pressed)
    	else if (value.HardwareIdentifier == 1)
    		emul1.SetGPIO("port6", value.Pressed)
    
    End
    
      



4. Add procedure definition named "proc_i2c_write" for MF emulator event.
  1. Add script on the editor as follows.



      
    MFEmulator    emul1
    	/TargetEmulator:SPLMFConsoleEmulator
    	/Procedure_I2CWrite:proc_i2c_write
    
    StartSimulationEngine  "SimState/basicenv4.xml"
    
    AddDifferentialDriveEntity    base1
    
    AddBumperEntity    bumper1
    	/ParentEntity:base1
    	/Procedure_SensorNotify:proc_bumper
    
    FlushScript  
    
    Procedure  proc_bumper
    	
    	if (value.HardwareIdentifier == 0)
    		emul1.SetGPIO("port5", value.Pressed)
    	else if (value.HardwareIdentifier == 1)
    		emul1.SetGPIO("port6", value.Pressed)
    
    End
    
    Procedure  proc_i2c_write
    	
    	if (value.Id == "i2c1")
    	{
    		command_type = value.ReceivedBytes[0]
    		
    		if (command_type == 1)
    		{		
    			distance = value.ReceivedBytes[1]
    			power = value.ReceivedBytes[2]
    	
    			power = power - 100
    
    			distance = Util.ToDouble(distance / 10.0)
    			power = Util.ToDouble(power / 100.0)
    
    			print "Distance -> " + distance.ToString() + " m / Power -> " + power.ToString()
    			
    			base1.GoTo(distance, power)
    		}
    		else if (command_type == 2)
    		{		
    			degrees = value.ReceivedBytes[1]
    			power = value.ReceivedBytes[2]
    	
    			degrees = degrees - 100
    			power = power - 100
    
    			degrees = Util.ToDouble(degrees)
    			power = Util.ToDouble(power / 100.0)
    
    			print "Degrees -> " + degrees.ToString() + " / Power -> " + power.ToString()
    			
    			base1.Turn(degrees, power)
    		}
    		else if (command_type == 4)
    		{		
    			left_power = value.ReceivedBytes[1]
    			right_power = value.ReceivedBytes[2]
    	
    			left_power = left_power - 100
    			right_power = right_power - 100
    
    			left_power = Util.ToDouble(left_power / 100.0)
    			right_power = Util.ToDouble(right_power / 100.0)
    
    			print "Left -> " + left_power.ToString() + " / Right -> " + right_power.ToString()
    			
    			base1.Go(left_power, right_power)
    		}
    	}
    
    End
    
    
      


  2. Save script.

  3. Press "F5" key or click "Run" icon.