Programming the Direction-master

### define x1 = 1
x2 = 2
x3 = 3
newposition = 4
TargetPosition = 5
d = 6
difference = 7
precision = 8

selectprgm(slot_4)
beginoftask(main)
  setvar(precision,con,20)
  setsensortype(sensor_3,no_type)
  setsensormode(sensor_3,raw_mode,0)
  setpower(motor_a+motor_c,con,4)
  setvar(targetPosition,con,140) {North-position}
  {for this robot, 100 degrees mesured represent 90 real
     degrees, E = 240, W=40}
  starttask(2) {mesure angle}
  starttask(1) {walk}
  setfwd(motor_a+motor_c)<-----
  on(motor_a+motor_c)
  {----------------example------------------}
  wait(con,1000) {wait 10 sec}
  setvar(targetPosition,con,40) {go West}
  wait(con,1000) {wait 10 sec}
  setvar(targetposition,con,240) {go east}
  wait(con,1000) {wait 10 sec}
  setvar(targetposition,con,140) {go north again}
  wait(con,1000) {wait 10 sec}
  stoptask(1)
  stoptask(2)
  off(motor_a+motor_c)

endoftask()



beginoftask(1) {walk and adjust motor-power in function of
direction} 
  loop(con,forever)
    while(var,TargetPosition,NE,var,newposition)
      if(var,targetposition,GT,var,newposition) <-----
         if(var,difference,LT,var,precision)
           gosub(1) {go smoothly right}
         else()
           gosub(3) {go roughly right}
         endif()
      else()
         if(var,difference,LT,var,precision)
           gosub(2) {go smoothly left}
         else()
           gosub(4) {go roughly left}
         endif()
      endif()
     endwhile()
    setpower(motor_a+motor_c,con,4) {go straight on}
    on(motor_a+motor_c)
 endloop()
endoftask()

beginoftask(2)
  loop(con,forever)
  setvar(x1,senval,sensor_3) {x1:=input}
  setvar(x2,con,27) {x2:=27}
  mulvar(x2,var,x1) {x2:=x2*x1}
  setvar(x3,con,1023) {x3:=1023}
  subvar(x3,var,x1) {x3:=x3-x1}
  divvar(x2,var,x3) {x2:=x2/x3}
  mulvar(x2,con,2) {x2:=x2*2}
  sumvar(x2,con,20) {x2:=x2+20, error correction}
  setvar(newposition,var,x2) {angle in degres} 
  setvar(d,var,targetposition)
  subvar(d,var,newposition)
  absvar(d,var,d)
  setvar(difference,var,d) {difference:=abs(targetpos-newPos)} 
  endloop()
endoftask()

beginofsub(1) {go smoothly right}
  setpower(motor_c,con,1)<-----
  setpower(motor_a,con,7)
endofsub()

beginofsub(2) {go smoothly left}
  setpower(motor_c,con,7)<-----
  setpower(motor_a,con,1)
endofsub()

beginofsub(3) {go roughly right}
  setpower(motor_a,con,4)
  off(motor_c)<-----
  on(motor_a)
endofsub()

beginofsub(4) {go roughly left}
  setpower(motor_c,con,4)
  off(motor_a)<-----
  on(motor_c)
endofsub()


For the Direction-master (II) add the following task
#define RotationSensorValue = 9
        addOrSub = 10
{-----------------------------------rotationsensor-reading---------}
setvar(addOrSub,con,1)   {to be set to 1, if the robot advances, else -1}
setvar(RotationSensorValue,con,0) {reset the rotation sensor}
{.....}
beginoftask(3)
loop(con,forever)
 while(senval,sensor_1,GT,con,0)
 endwhile()
  sumvar(RotationSensorValue,var,addorsub)
   
  while(senval,sensor_1,LT,con,5)
  endwhile()
endloop()
endoftask()
Adjust the tasks above:


Programming the direction-master (III) equipped with the Lego original rotation sensor

to change the direction, use the setvar() function and set the variable target_position.
{.....sensors.......}
#define(rotation_sensor,0)
{.....subroutines........}
#define(rough_right,1)
#define(rough_left,2)
#define(smooth_right,3)
#define(smooth_left,4)
#define(straight_on,5)
{.....tasks.......}
#define(direction_control,1)
#define(observe_sensor,2)
{.....variables......}
#define(target_position,1)
#define(real_position,2)
#define(difference,3)
#define(diff,4)
#define(abs_difference,5)
{......constants....}
#define(precision,10)

selectprgm(slot_1)

beginoftask(main)
  setsensortype(rotation_sensor,4)
  setsensormode(rotation_sensor,angle_mode,0)
  clearsensorvalue(rotation_sensor)
  starttask(observe_sensor)
  gosub(straight_on)
  starttask(direction_control)
endoftask()

{.........................................................................}

beginoftask(direction_control)
 loop(con,forever)
  while(var,difference,ne,con,0)
  if(var,difference,GT,con,0)
    if(var,abs_difference,GT,con,precision)
       gosub(rough_right)
    else()
       gosub(smooth_right)
    endif()
  else()
   if(var,abs_difference,GT,con,precision)
     gosub(rough_left)
   else()
     gosub(smooth_left)
   endif()
  endif()
  endwhile()
   gosub(straight_on)
 endloop()
endoftask()

{..........................................................................}

beginoftask(observe_sensor)
  loop(con,forever)
    setvar(real_position,senval,rotation_sensor)
    setvar(diff,var,target_position)
    subvar(diff,var,real_position)
    setvar(difference,var,diff)
    absvar(diff,var,diff)
    setvar(abs_difference,var,diff)
  endloop()
endoftask()

{..........................................................................}
beginofsub(straight_on)
 setpower(motor_a+motor_c,con,7)
 setfwd(motor_a+motor_c)
 on(motor_a+motor_c)
endofsub()

beginofsub(rough_right)
 setpower(motor_a+motor_c,con,4)
 setfwd(motor_a)
 setrwd(motor_c)
 on(motor_a+motor_c)
endofsub()

beginofsub(rough_left)
 setpower(motor_a+motor_c,con,4)
 setfwd(motor_c)
 setrwd(motor_a)
 on(motor_a+motor_c)
endofsub()

beginofsub(smooth_right)
  setfwd(motor_a+motor_c)
  setpower(motor_a,con,7)
  setpower(motor_c,con,1)
endofsub()

beginofsub(smooth_left)
  setfwd(motor_a+motor_c)
  setpower(motor_c,con,7)
  setpower(motor_a,con,1)
endofsub()