Sumo Robot
1 Kg Class, 200mm Wide * 200mm Long * 300mm High Class
By Matt Hocking
Features:
- I am using a 40 gram flashlite 186 dos computer from JKMICRO
- I am developing the Sumo Robot with my little dos laptop and will transfer the exe over to the flashlite when I am happy with the sumo program.
- I am using the flashlite because the 68HC11 drives me mad.
- Wraith Technology MC8 control board to control the motors and to connect the flashlite to the real world.
- 4-wheel drive
- To sense the white line I am using four LDR's in a voltage divider circuit with a LED.
- I am using LDR's with LEDS because you can program calibrate the input voltage value at the start of each match. It is important to calibrate it for the competition arena because it might be slightly different to the surface that you are testing it on and the IR sensor might think the Black arena surface is reflective and this could cause you headaches on competition day.
- I am using the current sensors on the MC8 to detect collisions.
- I am using an ultrasonic sensor to detect the other Sumo.
- One ultrasonic sensors from SenseComp, a Mini-a 40 feet range. I am using this unit because it works stand-alone and just give out a 0 to 5 volt reading relative to the distance the object is away.
- I used the MC8 to test the sumo robot and get it all working then for the final design I used the MC2 DC Motor Control Board. The
MC2 is great because it has all the hardware needed, it's compact and plugs straight into Port E and F of the Flashlite 186.

The MC8 Multi Channel DC Motor Control Board in the Flashlite 186 Sumo Robot test rig.It is really important to hook up a
really good test rig.

The Sumo Robot on the test arena.

The Sumo Robot on the test arena.
The following is the THIRD Version of the Sumo Robot example Code for the Flashlite 186 JKMicro dos
computer. It is all tested and working on the Flashlite 186.
The newer versions will be added when they are created.
- DECLARE SUB avoidthelines ()
- DECLARE SUB CHECKVISION (FRONTRIGHTEYEVOLTAGE, FRONTLEFTEYEVOLTAGE, BACKRIGHTEYEVOLTAGE, BACKLEFTEYEVOLTAGE)
- DECLARE SUB CONTROLMOTORS ()
- DECLARE SUB FINDOBJECT (ULTRASONICVOLTAGE)
- 'TO TURN LEFT MOTOR1 NEEDS TO GO BACKWARDS AND MOTOR2 NEEDS TO GO FORWARD
- 'TO TURN RIGHT MOTOR1 NEEDS TO GO FORWARD AND MOTOR2 NEEDS TO GO BACKWARDS
- 'TO GO STRAIGHT FORWARD MOTOR1 NEEDS TO GO FORWARD AND MOTOR2 NEEDS TO GO FORWARD
- 'TO GO STRAIGHT BACKWARDS MOTOR1 NEEDS TO GO BACKWARDS AND MOTOR2 NEEDS TO GO BACKWARDS
- 'TO BRAKE MOTORS ALL BITS NEED TO GO HIGH
- 'THESE GLOBALS STORE THE DIRECTION BITS FOR THE MOTOR DIRECTION
- COMMON SHARED MLEFT, MRIGHT, MFORWARD, MBACKWARDS, MBRAKE AS INTEGER
- 'THESE GOLBALS STORE THE CALIBRATION NUMBERS FOR THE WHITE LINE DETECTORS WHICH
- 'ARE DETERMINE AS AN AVERGAE READING IN THAT FIRST 5 SECOND WAIT AT THE START OF THE MATCH
- COMMON SHARED FRONTRIGHTEYECALVOLTAGE, FRONTLEFTEYECALVOLTAGE, BACKRIGHTEYECALVOLTAGE, BACKLEFTEYECALVOLTAGE
- 'OBJDIRECTION GLOBAL STORES THE LAST DIRECTION THE SUMO HAD TO TURN LAST TIME THE
- 'OPONENT SUMO WENT OUT OF RANGE
- COMMON SHARED OBJDIRECTION AS INTEGER
- 'DIRECTION GLOBAL STORES THE DIRECTION THE SUMO HAS TO TURN TO FIND THE OPONENT
- 'SUMO. THIS IS ALTERED IN THE MAIN PROGRAM LOOP IN ORDER OF PRIORITIES OF THE
- 'SUB ROUTINES.
- COMMON SHARED direction, ADCCONTROLBITS AS INTEGER
- 'DELCARE GLOBAL REGISTER CONSTANTS
- COMMON SHARED IOCONF%, PORTA%, PORTB%, PORTC%, PORTD%, PORTE%, PORTF%
- COMMON SHARED mode, avoidline, mainmode AS INTEGER
- mainmode = 0
- avoidline = 1
- mode = mainmode
- 'MLEFT = PE5 + 0 + 1 AT PORTC
- MLEFT = 32
- 'MRIGHT = PE6 + 0 + 0 AT PORTC
- MRIGHT = 64 + 128
- 'MFORWARD = PE5 + PE7 + 0 AT PORTC
- MFORWARD = 32 + 128
- 'MBACKWARDS = PE6 + 0 + 1 AT PORTC
- MBACKWARDS = 64
- 'MBRAKE = PE5 + PE6 + PE7 + 1 AT PORTC
- MBRAKE = 32 + 64 + 128
- 'DECLAER WHITE LINE DETECTOR VOLTAGE VARS AND INITIALIZE THEM TO -1 TO KNOW WHEN A VOLTAGE
- 'HAS BEEN PLACED IN THEM
- CLS
- FRONTRIGHTEYECALVOLTAGE = -1
- FRONTLEFTEYECALVOLTAGE = -1
- BACKRIGHTEYECALVOLTAGE = -1
- BACKLEFTEYECALVOLTAGE = -1
- 'dim adc channels
- DIM adcch(7) AS INTEGER
- adcch(0) = -1
- adcch(1) = -1
- adcch(2) = -1
- adcch(3) = -1
- adcch(4) = -1
- adcch(5) = -1
- direction = MBACKWARDS
- 'VISION CONTANTS
- VISIONLIMIT = 10
- 'INITIALIZE VARS
- OBJDIRECTION = OBJLEFT
- b1% = 1
- b2% = 2
- b3% = 4
- b4% = 8
- b5% = 16
- b6% = 32
- b7% = 64
- b8% = 128
- 'INITIALIZE GLOBAL REGISTER CONSTANTS
- 'Ports A - F, 40 bits of I/O, are controlled by a CPLD. The I/O from the CPLD is grouped into two
- '4-bit ports (A & B) and four 8-bit ports (C thru F). Each of the six ports may be configured as
- 'either inputs or outputs. The following tables show the port registers, addresses, and
- 'configuration bits.
- 'Register Address
- 'Port A 0x600 = 1536
- 'Port B 0x601 = 1537
- 'Port C 0x602 = 1538
- 'Port D 0x603 = 1539
- 'Port E 0x604 = 1540
- 'Port F 0x605 = 1541
- 'IOConf 0x606 = 1542
- 'Write a 0 to
- 'the appropriate bit in the direction register to configure the port as an input, write a 1 to configure
- 'it as an output. All ports default to inputs.
- 'IO Configuration Register (I/O Port 606 hex)
- 'Bit 7 6 5 4 3 2 1 0
- 'Function
- 'Not
- 'Used
- 'Not
- 'Used
- 'Port F
- 'DIR
- 'Port E
- 'DIR
- 'Port D
- 'DIR
- 'Port C
- 'DIR
- 'Port B
- 'DIR
- 'Port A
- 'DIR
- 'Default 1 1 0 0 0 0 0 0
- 'FIRST CONFIGURE PORT DIRECTIONS
- 'PORT A WILL BE CONFIGURED AS AN OUTPUT PORT AND WILL BE USED AS THE CONTROL PORT FOR THE MOTORS AND ADC CONTROL OF THE MC8
- 'PORT B WILL BE CONFIGURED AS AN OUTPUT PORT AND WILL BE USED AS THE CONTROL PORT FOR THE ADC INPUT AND INTPUT PORTS OF THE
- 'MC8
- 'PORT C WILL BE CONFIGURED AS AN OUTPUT PORT TO CONTROL THE MOTORS AND ADC CONTROL OF THE MC8
- 'PORT D WILL BE CONFIGURED AS AN INPUT PORT TO GET THE DATA FROM THE ADC AND INPUT AND INTPUT PORTS OF THE MC8
- PORTA% = 1536
- PORTB% = 1537
- PORTC% = 1538
- PORTD% = 1539
- PORTE% = 1540
- PORTF% = 1541
- IOCONF% = 1542
- OUT IOCONF%, 0 + 0 + b3% + 0 + b5% + 0 + b7% + b8% 'IO Configuration Register
- ' Start ADC on first bit
- 'MAKE READ AND WRIGHT GO HIGH
- ADCCONTROLBITS = 0 + b4% + b5%
- OUT PORTE%, ADCCONTROLBITS + direction
- 'MAKE WRIGHT GO LOW AND KEEP READ HIGH
- ADCCONTROLBITS = 0 + b4%
- OUT PORTE%, ADCCONTROLBITS + direction
- 'MAKE READ AND WRIGHT GO HIGH
- ADCCONTROLBITS = 0 + b4% + b5%
- OUT PORTE%, ADCCONTROLBITS + direction
- 'MAIN PROGRAM LOOP FOR REAL TIME COMMAND STRUCTURE
- DO
- 'EXTRACT THE ADC VOLTAGES CHANNEL BY CHANNEL.
- 'TUNE ulcnt% SO THAT IT INTERVALS BY AT LEAST 100uS SO THAT THE ADC HAS FINISHED
- 'TAKEN EACH CHANNEL READING
- 'MAKE READ GO LOW AND KEEP WRIGHT HIGH
- ADCCONTROLBITS = vref% + b5%
- OUT PORTE%, ADCCONTROLBITS + direction
- 'GET VALUE FROM ADC AT PORTF
- adcch(vref%) = INP(PORTF%)
- IF vref% < 7 THEN
- vref% = vref% + 1
- ' Start ADC on NEXT bit
- 'MAKE READ AND WRIGHT GO HIGH
- ADCCONTROLBITS = vref% + b4% + b5%
- OUT PORTE%, ADCCONTROLBITS + direction
- 'MAKE WRIGHT GO LOW AND KEEP READ HIGH
- ADCCONTROLBITS = vref% + b4%
- OUT PORTE%, ADCCONTROLBITS + direction
- 'MAKE READ AND WRIGHT GO HIGH
- ADCCONTROLBITS = vref% + b4% + b5%
- OUT PORTE%, ADCCONTROLBITS + direction
- END IF
- IF vref% = 6 THEN
- vref% = 0
- ' Start ADC on FIRST bit
- 'MAKE READ AND WRIGHT GO HIGH
- ADCCONTROLBITS = vref% + b4% + b5%
- OUT PORTE%, ADCCONTROLBITS + direction
- 'MAKE WRIGHT GO LOW AND KEEP READ HIGH
- ADCCONTROLBITS = vref% + b4%
- 'MAKE READ AND WRIGHT GO HIGH
- ADCCONTROLBITS = vref% + b4% + b5%
- OUT PORTE%, ADCCONTROLBITS + direction
- END IF
- 'THESE IF STATEMENT LOAD THE FIRST WHITE LINE DTECECTOR VALUES INTO
- 'THE CALIBRATION CONSTANTS FOR EAH DETECTOR. THE FIRST VALUE WILL
- 'BE OVER MATT BLACK GROUND BECAUSE THE SUMO RULES DICTATE THIS
- IF adcch(5) <> -1 AND FRONTRIGHTEYECALVOLTAGE = -1 THEN
- FRONTRIGHTEYECALVOLTAGE = adcch(5)
- END IF
- IF adcch(1) <> -1 AND FRONTLEFTEYECALVOLTAGE = -1 THEN
- FRONTLEFTEYECALVOLTAGE = adcch(1)
- END IF
- IF adcch(2) <> -1 AND BACKRIGHTEYECALVOLTAGE = -1 THEN
- BACKRIGHTEYECALVOLTAGE = adcch(2)
- END IF
- IF adcch(3) <> -1 AND BACKLEFTEYECALVOLTAGE = -1 THEN
- BACKLEFTEYECALVOLTAGE = adcch(3)
- END IF
- 'adcch(5) IS FRONTRIGHTEYEVOLTAGE
- 'adcch(1) IS FRONTLEFTEYEVOLTAGE
- 'adcch(2) IS BACKRIGHTEYEVOLTAGE
- 'adcch(3) IS BACKLEFTEYEVOLTAGE
- 'DIRECTION IS RETURNED
- FRONTRIGHTEYEVOLTAGE = adcch(5)
- FRONTLEFTEYEVOLTAGE = adcch(1)
- BACKRIGHTEYEVOLTAGE = adcch(2)
- BACKLEFTEYEVOLTAGE = adcch(3)
- 'adcch(4) IS CONNECTED TO THE ULTRASONIC SENSOR
- ULTRASONICVOLTAGE = adcch(4)
- IF mode = mainmode THEN
- CALL FINDOBJECT(ULTRASONICVOLTAGE)
- CALL CHECKVISION(FRONTRIGHTEYEVOLTAGE, FRONTLEFTEYEVOLTAGE, BACKRIGHTEYEVOLTAGE, BACKLEFTEYEVOLTAGE)
- ELSEIF mode = avoidline THEN
- avoidthelines
- END IF
- CONTROLMOTORS
- LOOP
- SUB avoidthelines
- STATIC avoidlinecounter AS INTEGER
- CONST avoidlinecount = 200
- IF avoidlinecounter >= avoidlinecount THEN
- mode = mainmode
- avoidlinecounter = 0
- ELSE
- avoidlinecounter = avoidlinecounter + 1
- END IF
- END SUB
- SUB CHECKVISION (FRONTRIGHTEYEVOLTAGE, FRONTLEFTEYEVOLTAGE, BACKRIGHTEYEVOLTAGE, BACKLEFTEYEVOLTAGE)
- 'CHECK ALL THE WHITE LINE SENSOR TO SEE IF THEY HAVE DETECHED THE WHITE LINES. IF SO
- 'THEN GO IN THE OPPOSITE DIRECTION.
- 'ALLOWABLEDIFFERENCE IS THE DIFFERENCE THAT THE CURRENT WHITE LINE DETECTOR VOLTAGE
- 'CAN BE BEFORE IT THEY THINK IT HAS DETECTED A WHITE LINE.
- DIM ALLOWABLEDIFFERENCE AS INTEGER
- ALLOWABLEDIFFERENCE = 60
- IF FRONTRIGHTEYEVOLTAGE < FRONTRIGHTEYECALVOLTAGE - ALLOWABLEDIFFERENCE THEN
- direction = MFORWARD
- OBJDIRECTION = 0
- mode = avoidline
- END IF
- IF FRONTLEFTEYEVOLTAGE < FRONTLEFTEYECALVOLTAGE - ALLOWABLEDIFFERENCE THEN
- direction = MFORWARD
- OBJDIRECTION = 1
- mode = avoidline
- END IF
- IF BACKRIGHTEYEVOLTAGE < BACKRIGHTEYECALVOLTAGE - ALLOWABLEDIFFERENCE THEN
- direction = MBACKWARDS
- OBJDIRECTION = 1
- mode = avoidline
- END IF
- IF BACKLEFTEYEVOLTAGE < BACKLEFTEYECALVOLTAGE - ALLOWABLEDIFFERENCE THEN
- direction = MBACKWARDS
- OBJDIRECTION = 0
- mode = avoidline
- END IF
- END SUB
- SUB CONTROLMOTORS
- 'THIS SUB CONTROLS THE MOTORS BY SENDING OUT THE NUMBER STORED IN DIRECTION
- 'TO DICTATE THE DIRECTION
- OUT PORTE%, direction + ADCCONTROLBITS
- IF direction = MBRAKE OR direction = MBACKWARDS OR direction = MLEFT THEN
- OUT PORTC%, 1
- ELSE
- OUT PORTC%, 0
- END IF
- END SUB
- SUB FINDOBJECT (ULTRASONICVOLTAGE)
- 'CHECK TO SEE IF THE OBJECT HAS BEEN DETECHTED BY CHECKING IF THE ULTRASONICVOLTGE IS WITH IN RANGE.
- 'IF IT IS THEN SET DIRECTION = MFORWARD AND CLEAR MRIGHTCOUNTER = 0 AND MLEFTCOUNTER = 0
- 'SO THAT THE DIRECTION THAT THE OTHER SUMO LAST MOVED OUT OF DEAD AHEAD IS ALWAYS REMEBERED.
- STATIC MLEFTCOUNTER, MRIGHTCOUNTER, OBJDIRECTION AS INTEGER
- 'DECLARE AND INITALIZ OBJECT FINDING CONSTANTS
- DIM OBJLEFT, OBJRIGHT, CHANGEDIRECTIONCOUNTER AS INTEGER
- OBJLEFT = 0
- OBJRIGHT = 1
- CHANGEDIRECTIONCOUNTER = 600
- ULTRASONICVOLTAGELOWRANGE% = 0
- ULTRASONICVOLTAGEHIGHRANGE% = 38
- IF ULTRASONICVOLTAGE >= ULTRASONICVOLTAGELOWRANGE% AND ULTRASONICVOLTAGE < ULTRASONICVOLTAGEHIGHRANGE% THEN
- direction = MFORWARD
- MRIGHTCOUNTER = 0
- MLEFTCOUNTER = 0
- EXIT SUB
- ELSE
- 'IF THE OBJECT HAS NOT BEEN DETECKTED THE STEER TO FIND IT IN ON DIRECTION IF IT HAS NOT BEEN FOUND
- 'IN ONE DIRECTION THEN GIVE IT A GO IN THE OTHER DIRECTION
- IF OBJDIRECTION = OBJLEFT AND MLEFTCOUNTER < CHANGEDIRECTIONCOUNTER THEN
- MLEFTCOUNTER = MLEFTCOUNTER + 1
- direction = MLEFT
- ELSEIF OBJDIRECTION = OBJLEFT AND MLEFTCOUNTER >= CHANGEDIRECTIONCOUNTER THEN
- MLEFTCOUNTER = 0
- OBJDIRECTION = OBJRIGHT
- EXIT SUB
- END IF
- 'IF THE OBJECT HAS NOT BEEN DETECKTED THE STEER TO FIND IT IN ON DIRECTION IF IT HAS NOT BEEN FOUND
- 'IN ONE DIRECTION THEN GIVE IT A GO IN THE OTHER DIRECTION
- IF OBJDIRECTION = OBJRIGHT AND MRIGHTCOUNTER < CHANGEDIRECTIONCOUNTER THEN
- MRIGHTCOUNTER = MRIGHTCOUNTER + 1
- direction = MRIGHT
- ELSEIF OBJDIRECTION = OBJRIGHT AND MRIGHTCOUNTER >= CHANGEDIRECTIONCOUNTER THEN
- MRIGHTCOUNTER = 0
- OBJDIRECTION = OBJLEFT
- END IF
- END IF
- END SUB
Partner's Sites