| Site map : 
 Last upgrade to the site:august 10th, 2002.
  
 
      There has been 
  access to my Lego pages since creation.
 
        
This is an unofficial LEGO® web site.LEGO® is a trademark of the LEGO® Group of companies
which does not sponsor, authorize or endorse this site.
 You can visit the official LEGO website at: http://www.lego.com
 Copyright 1996, 2000, Denis Cousineau 
        |  | 
  
    | Tutorial 1:What to make to obtain a Computer-controlled robot |  
  A computer controlled-robot involves the realization of three
  distinct units: 
  The robot itself: see my Robot section;The controller physical driver that connect
    the robot to the computerThe computer interface which decides the
    actions of the robot. There are
  many way to implements all of these elements. The first tutorial is dedicated
  to make an overview of all the alternatives. That way, your choices will be
  easier when you’ll start building your own robots. 
    I would like to thanks M. Paquette from College de L'Assomption for
  some hints on the use of transistors.  
  The controller is responsible to establish the link between computer and
  the robot. The reason for that is that the computer outputs only a few mA, not
  enough to start most motors. Therefore, a supply of power is usually appended
  to the controller (a 9volts, 1A in the case of Lego motors which are simple DC
  motors).    
 
  
    Choosing the motors 
  Before making a controller, you must choose what type of motors you want to
  use; your design will greatly depend on it.  Stepper motors are motors
  whose rotation can be controlled with a high precision. However, they require
  a pretty complex controller.  Servos are pretty weird motors, since they
  can rotate no more than 360 degrees. They are useful for short motion, but are
  clearly counter-indicated for propelling a car! I did not found circuit
  information for controlling servos.  DC motors are the most simple to
  control. Presence of voltage on one input makes them turn. They are however
  very imprecise. 
    
 The simplest way to control a dc motor is thru the use of a transistor.
  Transistors act like switches. In the first figure, R1 is a 1 kilo-ohms
  resistance, and R2 is any small resistance (10-300 ohms). Q1 is a very common
  type of transistor: a 2N2222. See part
  list for a drawing of these, and this
  for a picture. A transistor costs no more than 50 cents.
    
 In order to control bi-directional a motor (ON/OFF, and clockwise or
  counterclockwise), a H-type circuit is needed. In the second picture, if both
  upper left and lower right transistors are ON, the current will flow through
  the motor from left to right, yielding a CW rotation.  
   Trouble is that there is a lost of power. I have not been able to sink more
  than 500 mA through the motor in the H circuit. It is enough for small motors,
  but not for the Lego-type motors who need a full 1 ampere of
  current.  
   One alternative is to replace transistors with power-mofset. I haven't try,
  but you might look at MOSFET
  H-Bridge Schematic & Theory of Operation for more. Another alternative
  that I explored in tutorial 2 is to use a mechanical switch to control the
  direction of motion. Relays are electro-magnetic switch that can be controlled
  easily with a transistor. Since the current is independent of the
  transistor-magnet circuit, there is no lost of power.  
   For more on stepper motors, see  Controllers
  for servos motors with commercial drivers. 
 
  
    Choosing communication port 
  Choosing a mean of communication. Our computer needs to communicate to the
  controller. The two likely methods are to use the ports available. There is
  two kind of port. The parallel port (or printer port) is easy to program, but
  has a limited capacity at any given time. In the best case, it can only output
  8 bits of information, and can input from sensor 8 bits.  
 
  
    Choosing the kind of sensors you need.  
  There is a large variety in sensors, ranging from electronic thermometer to
  pressure sensors. The simplest kind is the on/off sensors. When pressure is
  applied, the switch turns on. One bit of information is enough per
  sensor.  
 
   
  Programming a computer-controlled robot can involves many embedded
  programs, or layers. 
 
  
    Basic moves / reading sensorsThe lowest level is basically a software that can send command to the
    controller, or receive data from the sensors. Otherwise said, it is a
    program that operates your parallel port (or serial port, whichever is
    connected to your controller), using meaningful commands such as TURN(30),
    START(2), IS_ON?(1), etc. It is best seen as a repository of what can be
    done by your robot. In WINDOWS, a good programming habit is to place these
    commands as functions in a library. Commands in libraries are retrieved
    whenever needed by any other program (higher layers). This type of library
    is called DLL (Dynamically linked library); the resulting file have to be
    located in the \WINDOWS or \WINDOWS\SYSTEM directory.
     
      If you want to be able to use functions in library, you have to declare them
    external. For example, in Visual Basic, you write in the (general
    declaration) section: Function ABOUT: integer EXTERNAL "LEGO"
    where Lego is the name of the DLL file.Most compilers can produces DLL. For example, in Pascal, you start
        with the word library LEGO; then type in the functions needed. The instruction you are likely to use in your library is PORT. That
    instruction can send or receive data from a computer parallel port. For
    example (in QBasic):PORT &H3F8, 9
 sends 00001001 to the first eight bits of the parallel port.
 With a serial port, use file access procedure OPEN:OPEN "COM1:9600,N,8,1" FOR RANDOM AS #1
 PRINT #1,9
 sends 00001001 to the COM1 port, at a speed of 9600.
 In my LEGO.DLL (see that),
    I programmed the procedure START(x) that light the motor number x using
    these procedures (in Pascal): function START (x: motor_no): integer; export;{light the motor x; use STOP to stop it}
 var mask, i: byte;
 begin
 if (x<1)or(x7) then START := -4
 else
 if base <= 0 then START := -3
 else begin
 mask:=1;
 for i:=1 to x-1 do mask:= mask*2;
 motor_state := motor_state or mask;
 output_motor_state;
 START:=0;
 end;
 end;
 procedure output_motor_state;{note that the last bit of port[base] is for the reverse of direction pin 9}
 var mask: byte;
 begin
 port[base]:= motor_state;
 end;
 base is the address of the port, determined by the INIT procedure (not
    shown here). If an error occurs, that is, if the function does not return
    zero, use ERROR(nbre returned). ERROR is available in the DLL, and contains
    a list of all the possible error with an explanation. The variable
    MOTOR_STATE keeps tracks (in binary) of all motor states. For example,
    00000001 means the last motor is ON while all other are OFF.
    Sending commands/receiving dataThe first layer is only a list of what can possibly be done with your robot.
    Now we need to send specific commands to your robot.
    Commands can be very simple, such as "Start motor 3 now", or
    more complex, such as "Start motor 3, wait 5 seconds, start motor
    2, and when sensor 2 gets on, stop all moves."
    The VBASIC interface that I proposed in another page is an example which can
    send only simple commands. A better interface would accept commands such as
    "Turn motor 3 for x seconds" or "Turn motor 3 until sensor 2
    gets on".
      
    Constraint control 
    Not all moves are safe for the health of your robots. For example, turning
    the arm to the left for an indefinite time is risky if your arm cannot do
    more than 360 degree turns (and most arms can not do that much).In order to avoid wreckage, your robot should know things about its
    limitations. These are called constraints. Example of constraints are: If the base is turning for more than 5 seconds, then you ought to stop
    turning the base.
 
 If the sensor in the hand feel excessive pressure, you ought to stop
    grasping. Constraints are easily expressed in the form "If … you ought to
    …". It is like a watching device that monitors the commands sent
    by the layer B so that no crash occurs. This layer should never be seen
    but always be on. 
    Artificial intelligenceHere I refer to giving some brain to your computer-robot. I can think of
    two kind, both related to machine learning. The first is learning new higher
    level commands, such as PICK, which is a string of various low-level
    commands. This learning could be performed by noting that some strings are
    common, and thus the machine should be asking the human a new name for it. The second type of learning is learning the constraints the robot must
    obey. This could be achieved by sending signals that could be termed
    "Pain" and let the robot figure out what sensors or movement
    started it. |