NRC Maze 2017


Our Robot in Action

Videos are on our YouTube channel!


Figure 1: Isometric view of our SolidWorks® CAD model.

We chose to use omni-wheels because this would eliminate our need to turn our chassis 90 degrees at every turn. We built the chassis out of ¼" plywood. This was a good choice, as it was light and easy to work with. We designed it in SolidWorks® and laser-cut the parts. There was maybe 0.05-0.10 mm of play in the joints, but after we glued it up with PVA wood glue, this didn’t seem to be a problem.

Performance of the Omni-Wheels

The omni-wheels worked as planned for the most part. One unforseen flaw, however, was that they were very poor at allowing Sunny to drive up the ramp. We aren't 100% sure why, but our best guess is this: the omni-wheels, by their nature, do not have a lot of surface area in contact with the ground. Furthermore, we think they don't all make even contact with the ground at the same time. This is normally manageable (on flat stretches or negative slopes). But on a ramp, the wheels experience lower friction due to being on a sloped surface. That, coupled with greater resistance due to gravity on the positive incline, is what we think causes this slippage when attempting to drive up the ramp.

Sensing the Walls

How it worked

We chose to use 8 ultrasound sensors (HC-SR04). We decided to use 8 because this would give our robot enough information to be able to keep parallel to the walls. We built a custom circuit to gather sensor data (more on this below).

HC-SR04’s are cheap -- we got them for $1.12 each. The alternative would be some type of infrared sensors, which tend to give unpredictable values when their beam doesn’t bounce off of something within range. For the onboard microcontroller, we chose to use an Arduino Mega because it has 8 Analog to Digital Converters (ADC’s). The Arduino Uno has only 6.

The Circuit

Figure 3: A schematic of the circuitry for one set of sensors, drawn in Easy EDA. Our full circuit implemented two of these sets.

The operation of our circuit relies on 8 op-amps used as voltage buffers, 8 capacitors, and two (2) 4-input NOR-gates. The sensors are operated in two groups, in the following sequence. Group A is triggered, which causes the sensors to send out their ultrasonic pulses and begin waiting for a response. The processor checks in each loop for a positive logic signal from the NOR gate, which would indicate that all sensors have received a signal. Upon seeing a positive logic signal, it samples the output of the op-amp buffers for that group, then discharges the capacitors. This process always seems to take around 60 ms to complete. The process is then repeated for group B. Hence, updated sensor values can be guaranteed once every 0.12 seconds. By extension, the oldest a value can be is ~0.12 seconds. This seemed to be adaquate for our purposes.

If we triggered and sampled all 8 at once, there would be interference between the sensors and we may never get accurate data.

Illustration of the interference we would have if we triggered all sensors simultaneously.
Diagram of the sensors operating in two groups.

The function of the NOR gate is to monitor the storage capacitors. When all 4 sensors in the group have given a response pulse, the circuit gives a positive logic signal.

The circuit required more power than we expected. On the first test, we burned out the arduino’s built-in voltage regulator (rated for 800 mA) and had to add a beefier one so we could power everything.

Figure 2: Our contructed sensor-sampling-circuit, pre-voltage-regulator.


The software was a big part of this project. You can find code on the github repo for the project.

Performance at Competition

Most robots, including Sunny, did not complete the maze. In our case, it was due to difficulties going up the ramp. It seemed that a competitive time was around 25 to 30 seconds. Videos of Sunny can be found on our youtube channel.