![]() Update! BiBimBot won the 2015 AHRC Mini Sumo Competition! It was one of the most evenly matched Mini Sumo competitions imaginable. Delta Force won 2 out of 3 rounds in the first match up, but BiBimBot made its way through the losers bracket and won two consecutive rounds against Delta Force to win the double elimination competition. Check out the video below:
So how did BiBimBot win this time? Well, I made two minor changes to the bot since 2014. The first change was to epoxy a number of small copper weights to the existing steel weights wherever there was a little extra room. BiBimBot was up to 498 grams in 2015 vs weighing in at only 468 grams in 2014. The additional weight increased the amount of friction so its push was stronger this year.
The second change was in the code. If you look closely at the video from 2014 below, there is a match where Delta Force and BiBimBot lock head-to-head and it looks like a draw. Suddenly Delta Force seems to surge forward and push BiBimBot out with relative ease. Back then, BiBimBot was programmed to automatically change strategy if it got stuck in a particular mode for too long. Having BiBimBot attempt to spin away from Delta Force was a bad idea, especially considering that BiBimBot wasn't any faster than Delta Force. For 2015, I removed all the timeout scenarios and BiBimBot pushed and pushed until it won!
Mini SumoMini Sumo is an autonomous robotic competition in which two Sumo bots try to push each other out of a ring. Mini Sumo is different than battle robots in that they are autonomous and make no attempt to injure the opponent.
Mini Sumo robot competitions are held throughout the world. The Atlanta Hobby Robot Club hosts a Mini Sumo competition at their annual Robot Rally. For more than a decade, the AHRC Mini Sumo contest has been dominated by Dale Heatherington's Delta Force. While it would be naive to think I could beat Delta Force on my first attempt at building a Mini Sumo bot, I wanted to build a competitive robot and learn as much as possible in preparation for building a second one.
RulesMini Sumo competitions use a bracket structure and each match is won by winning two out of three rounds. During each round, two Mini Sumo robots have 90 seconds to push each other out of the Sumo ring, and the first robot to leave the ring loses even if it drives out on its own. The ring is a 77 cm diameter black circle with a 2.5 cm wide white line around the edge. Each robot must weigh 500 grams or less, and must fit within a 10 x 10 cm square (i.e. about 1.1 pounds and 4x4 inch). There is no limit to the height of the robot. Remote control is not allowed, although the robot may freely transmit data to an external station for logging. Robots are not allowed to store or throw any objects including liquids, powders, or air. No flammable devices are permitted and no attempt to adhere the robot to the ring is allowed. The judges have significant discretion to disqualify any robot which violates the spirit of the competition. Judges may also stop any round early and declare a winner if any competitor is broken, failed to start, or the robot has otherwise "lost the will to fight".
![]() Bibimbot with its cover removed.
Mechanical Design![]() The primary goal of Mini Sumo is to generate pushing force greater than your opponent. This is achieved by designing a robot which is as heavy as possible with wheels having the highest amount of friction. Since the maximum weight of the robot is fixed, selecting the robot's wheels is a critical design step. I had some old silicone lego tires around as well as some natural rubber rollers from old copier machines. I performed a test where I attached two wheels together, set them on a piece of wood, and steadily increased the angle of the wood until the wheels began to slide off. The Lego tires started sliding off around 40-50 degrees incline, while the rubber rollers held steady until about 60 degrees incline of the wood. With this being my first Mini Sumo bot, I wasn't sure how good the wheels needed to be. I searched online and found a number of options which could work. Slot car racing wheels stood out since there was a very wide variety of shapes and sizes available. I contacted a few suppliers and Alpha Piranha racing tires seemed to be a good bet and were readily available. I ordered a pair and ran the incline test. To my surprise, the wheels didn't fall off until the wood was inclined at an impressive 70 degrees. I decided to go with the slot car wheels.
Selecting the motors was not too critical because there are a lot of options available with sufficient torque and speed in the size range required, my primary concerns were mounting to the wheels and the chassis. After performing some calculations, I decided to use Pololu 75:1 micro metal gear motors which are also used on the Zumo kit. Operating at 7.2 V with 0.825" wheels, the robot would travel at a max of 0.4 m/s with each motor generating 1.5 kg of pushing force - more than enough to spin the tires. The motor's 3mm shafts could mount directly to the slot car racing wheels, and Pololu's mounting brackets would hold the motors to the chassis.
![]() Mocking up the Mini Sumo layout using cardboard
I quickly realized that selecting a battery for Bibimbot would be an important decision due to the large amount of volume that the battery would occupy. I prefer to use NiMH batteries so I don't have to worry about accidental over-discharge or catching on fire. While LiPo batteries are somewhat smaller than NiMH, they are significantly lighter and I needed the robot to be as heavy as possible. I drew up a bunch of blocks in CAD to represent each item inside the robot and moved them around and around trying to figure out where to place all the parts. Once the wheels and motors arrived I mocked up the robot using cardboard to get a better feel for how tight the space would be. I eventually decided on a set of 400mah NiMH cells in a two sticks of three arrangement, ordered as a custom pack from onlybatterypacks.com. ![]() Design of the Stainless Steel Chassis
![]() ![]() ![]() Exposure to Acetone Vapor eliminates white discolorations of the ABS
Welding the corners with Acetone would occasionally cause the ABS to develop a white discoloration on the surface. I never figured out why it happened, but I was able to make the discolorations disappear. I read an article on Hackaday where a guy was smoothing out the surfaces of his ABS 3D prints by exposing them to an Acetone vapor on top of the printer's hot plate. I figured the same trick might fix the surface discolorations, but I didn't want to smooth it so much that the outer texture of the ABS disappeared. I filled a small polyethylene container with 1/4" of acetone and dropped it into an empty paint can. I rested the ABS body on the top edges of the container, and set the lid on top of the paint can. Exposure to the acetone vapor caused the white discolorations to disappear after a few hours, and didn't significantly affect the texture. The entire ABS body felt much more pliable afterwards, but regained its original rigidity after sitting out for a day or so.
SensorsThe original Bibimbot design called for 3 sets of sensors, but the breakout board for the accelerometer and gyro had to be sacrificed to make room for chunks of steel. The two remaining sets of sensors are both Infrared. One set of sensors looks for the opponent and the other set looks for the white line at the edge of the ring.
The sensor which looks for the opponent works just like Bot-Choy's obstacle detector, with some small differences and minor improvements. There are 3 sets 3 IR LED's which are each pulsed at 0.8A for 100 microseconds. The IR light from the LEDs is reflected off the opponent and is sensed by IR phototransistors mounted to the opposite side of the circuit board. One set of LEDs looks forward, while the other two look left and right. If the opponent is a dark color, Bibimbot may not be able to see the opponent until it is very close, because less of the IR light will be reflected.
![]() Each of the IR LEDs used on Bibimbot has a much narrower viewing angle than those used on Bot-Choy, which increases the sensors range as more of the light is concentrated in a smaller area. As a result of the narrow viewing angle of each LED, more LEDs were required to still maintain a 180 degree field of view. The microprocessor didn't have enough I/O to control 9 separate LED channels, so I grouped them into 3 sets of 3 LEDs. The angular resolution of Bibimbot's obstacle detector sensor is not as good as Bot-Choy's, but it gains a few extra inches of sensing distance.
The circuit which drives the pulsed IR LEDs has been upgraded vs the Bot-Choy version. Instead of using a series resistor to control the LED current, I used the constant-current regulator circuit design from the Aquarium Light project. While the Aquarium light had a separate constant-current regulator for each LED, Bibimbot uses a single high-side P-FET constant current regulator which is shared among all of the pulsed LEDs. Much smaller N-FET transistors are used on the low-side of each LED, allowing the microprocessor to turn each LED on or off without level shifting. As a result of the tighter current regulation, I was able to increase the nominal current through the LEDs from 0.5A to 0.8A without fear of burning up the LEDs.
![]() The sensitivity of the phototransistors decreases as the source of the IR light changes it angle to the sensor. At around 40 degrees, the sensitivity is half of what it would be if the light source was directly in front of the sensor. On Bot-Choy, I spaced the sensors apart by 80 degrees. In theory, an obstacle directly in front of Bot-Choy will reflect light into each of the two sensors, which will sense this light with 50% sensitivity. The combined sensor sensitivity should seamlessly transition between one sensor and the other. In practice, there is a bit of a blind spot directly in front of Bot-Choy where the combined sensitivity of the two phototransistors does not add up to 100%. To prevent this from happening again, Bibimbot has 3 phototransistors instead of two, providing better sensitivity at the extreme left and right sides, and more overlap to avoid blind spots when the light source is angled half-way between two of the sensors.
![]() ElectronicsBibimbot needed to be small, so I decided to design my own circuit board and have it professionally fabricated. Unlike my previous PCB designs which I made myself using toner transfer, I now had to pay attention to the soldermask, silk, cream, dimension, and many other layers I previously ignored. I now have a full appreciation of how much time it takes to smash every component and drag around all the reference designators so they don't land on top of pads, vias and other components. Since it was my first board and I wasn't sure what the quality would be, I stuck with 16 mil traces and 0.6mm drills for the vias. I sent the gerber files out to iTead Studios because they were the cheapest. About three weeks after sending it out I received 10 circuit boards for less than $30. The quality was good, I couldn't find anything wrong with any of them. Looks like my toner transfer days are finally over.
![]() The Nano didn't have enough analog inputs for all the on-board sensors so I added an 8 channel multiplexer. This was my first attempt at soldering a SMD chip, and after watching a lot of youtube videos I decided to use the drag soldering technique. I was pleasantly surprised that given enough flux, drag soldering the SO16 package really is as easy as it looks in the videos. I didn't have any issues with solder bridging or pads lifting off the boards.
Bibimbot can be reprogrammed wirelessly and transmit telemetry data using a Bluefruit EZ-Link wireless bluetooth connection from Adafruit. I can't describe how annoying it was to chase around Bot-Choy with its USB cable tethered to my computer, not to mention hours of time wasted troubleshooting bad cables. Bibimbot was a joy to test as I could stop the bot, reprogram it, restart it, collect more data, and do it all again without ever getting up from my chair.
The Arduino, Bluetooth, and Line Sensors are powered using a small 5V switching regulator from Pololu. These regulators are very small - much smaller than anything I could ever hope to solder to a circuit board myself. There is a jumper on the main PCB to optionally connect the Arduino's VIN pin directly to the V+ battery supply and use it's internal 5V LDO regulator. By default the Arduino is powered directly from the 5V switching regulator as this is more efficient.
The motors are controlled using two DRV8833 Dual H-Bridge motor driver breakout boards from Pololu. Channels A and B of each of the Dual H-Bridges are connected in parallel providing up to 4A max stall current to the motors. Both left side and both right side motors are connected in parallel. The Fault outputs of each of the Dual H-Bridges are wired together and connected to a single LED to indicate if any fault condition has occurred with the motor drivers.
![]() Each of Bibimbot's motors can draw up to 2A when stalled. When combined with all the other parts drawing current, the maximum current draw could be be over 9 amps. Connectors rated for 10 amps tend to be fairly large, so I avoided using a connector by soldering the battery wires directly to the PCB. When the robot is turned off, the main power switch connects the battery's positive side to a charging port. Bibimbot's ABS cover must be removed in order to access the charge port. The main power switch is rated for 6 amps and takes up a considerable volume, sticking out of the top of the cover. On future robots I'll probably use a much smaller slide switch in combination with a MOSFET as a main power switch to save space.
With all of the components plugged in and soldered to the PCBA, I pulled out the old cardboard templates and trial fit the electronics with the motors, battery and IR sensors in place.
![]() Trial Fit of the PCBA with Motors, Battery and Breakout Boards in place
I made two mistakes in the electronics design of Bibimbot. The first mistake was not realizing that pins A6 and A7 of the Arduino Nano couldn't be used as GPIO. After receiving the boards and testing, I had to run a green wire from pin A6 over to pin D6 in order to get the forward facing obstacle detector LEDs to turn on.
![]() Arduino Microcontroller and Analog Mux
The second mistake was in configuring the current sense resistor values for the DRV8833 motor drivers. When installed, the motor drivers will use these current sense resistors to set the maximum current which is sent to the motors. I didn't want to limit the current, so I set the resistor values to the smallest possible value which would still permit 4A of current flow: 62 milliOhms. The no-load current of two motors in parallel is only 80 mA, and the analog voltage sensing resolution of the Arduino is 5 mV. With 0.080 A flowing through 0.062 ohms, there is less than 5mV generated at the current sense resistor. In operation, the wheels slip long before the motors ever get close to stalling, and the useful current sense range is limited to 2-3 LSB of the A/D converter which is hardly usable. To achieve a more usable range for the current sensing, I would have to increase the resistor values, limiting the current to 1 amp or less. At some point I may put larger resistors on the H-Bridges, but I probably should have designed in some kind of op-amp circuit to scale the current sense output before sending it to the processor.
SoftwareIn a spectacular example of overkill, I developed a rudimentary control sequencer for Bibimbot. The linked presentation explains it much better than I could in a few paragraphs here. I programmed it in C and learned a lot about pointers and dereferencing and defining pointers within structures and lists of function pointers, etc. When I tried explaining it to some folks in the club they told me I really should learn C++.
Bibimbot has few sensors and so the controls options are very basic. Some examples of the controls can be described as "Drive Forward for up to 10 seconds or until a line is seen in the front", "Turn for 300 ms in the opposite direction of where the line was last seen", "Drive Reverse for 800 ms unless a line is seen in the rear", and "Drive forwards towards the opponent". By stringing different controls together in a sequence, various robot behaviors can be created. The video below shows some of these controls in action.
The part of the sequencer which was most interesting to me was the concept of creating a "World Model". A World Model takes the data from one or more sensors and may combine it in a way to create a model of information that is relevant to the robot. For example, Bibimbot needs to know if there is a line seen in the front of the robot so it can stop before it drives out of the ring. Bibimbot has no single sensor which indicates if there is a line in the front of the robot, but the information from the front left and the front right line sensors can be combined to indicate if there is a line anywhere in the front. A boolean variable can be created called "frontLine", which is true if there is a line anywhere in the front, and false if there is not a line anywhere in the front. Whenever frontLine changes from False to True, Bibimbot can quickly stop. There is another boolean variable called "opponentDetected" which indicates whether the obstacle sensor sees an opponent, regardless of where the opponent is. If an opponent is seen anywhere, then the "Drive towards the Opponent" control is now an option. Otherwise if no opponent is seen, any attempt to execute the "drive towards opponent" control could result in unpredictable and undesirable behavior. The variables that make up the World Model can be anything that is useful to the control of the robot. On a more sophisticated robot, the World Model could consist of 2D or 3D maps of the environment, or historical information. The robot would reference this database of information in order to decide what action it should take next. The World Model should be updated constantly and asynchronously to any actions that the robot might take. In this last respect, Bibimbot is different than any of my previous robots which always checked the sensors on demand as opposed to asynchronously updating a model.
Learning about and creating the control sequencer for Bibimbot stretched my programming skills and was a great learning experience. I'm sure the control sequencer will find its way into other robots over time - robots which can actually take advantage of all the features.
2014 Robot Rally CompetitionBibimbot performed well during the 2014 AHRC Mini Sumo competition. It did lose one round to a Zumo competitor, as I forgot to flip the power switch on. The stock Zumo hit Bibimbot head on but was too lightweight to move Bibimbot. The judge ruled that Bibimbot had lost the will to fight, and declared the Zumo as the winner of that round. Thankfully I remembered to turn Bibimbot on for the other two rounds and won the best two out of three. In the final match it was Bibimbot vs Delta Force. Dale won the first round with an approach from behind, pushing Bibimbot out of the ring. In the second round, the two robots hit head on and nervously chattered about as both robots' wheels were spinning. Eventually Delta Force pushed Bibimbot out of the ring, continuing Delta Force's winning streak.
Bibimbot put up a good fight, and I learned a lot about what matters for a successful Mini Sumo robot. The biggest area for improvement is sensing the opponent. Bibimbot was unable to see Delta Force during the final match due to its black color, and Delta Force seemed to have the same issue. The final weight of Bibimbot was 468 grams, so it may perform slightly better if I figure out where to squeeze in another 30 grams of steel. Designing such a small robot to have a weight of 500 grams is rather difficult. In the future I'll need to plan for the weight in the very early design stages. I'm definitely looking forward to designing a smaller, faster, and stronger little brother for Bibimbot to play with next year.
Schematic (pdf)
|