The Final Exhibition

Exhibiting my work was very interesting, as it allowed me to communicate with other people who seemed to be enthusiastic about my project.

In addition to the rover and the control station, I made some museum exhibition style information boards that I thought might make things more interesting.









viking spiritoppy sojourner phoenix curiosity






As it turned out, people had difficulty working out that the rover was an actual real robot that they were controlling until they saw the thing itself. I therefore definitely think that if this was to be exhibited in a museum that I would allow people to see the rover driving. Perhaps not at the same time as they are controlling it however.

Another thing that was suggested was the inclusion of goals for the driver to achieve. I initially wanted this too, with the purpose of the goals to be the delivery of the information, but as discussed in a previous post, this was a whole new project unto itself. I had also thought about the inclusion of fun goals such as finding little aliens that would be fun for younger users, but i decided that this was unscientific.

Here is a video of the final exhibit in action.


Finalising the Project

My project is currently in a prototype form, however I am feeling confident about the final outcome. Even though it is not as smooth as I had initially planned it especially in terms of the control of the rover and the delivery of information, i still feel that it works correctly and achieves most of what I wanted it to do in the beginning.

To complete the project I plan to recreate the rover body in a better looking, sturdier material and add detail to make the rover resemble those that have already been sent to Mars more closely. I also plan to complete the redesign of the user interface and add more facts to the information delivery. Finally, once the terrain is in place I will add a thin layer of unglued sound and rocks to add a level of realism.

The prototype rover on the terrain.

The prototype rover on the terrain.

Changing the Information Delivery Method

After spending large periods of time researching various methods of image and colour recognition in various environments including PureData, Quartz Composer and JavaScript, most of my trials were unsucessful. PureData and Quartz Composer were both unable to recognise the MJPEG stream coming from the Raspberry Pi in order to import it. Even though I found many working examples of JavaScript tracking colours and doing various things once the colour was detected, I could not manage to get it to work with the stream from the Pi either. The following videos demonstrate this.

The main issue seemed to be that they are working with a video, and the MJPEG stream outputs images and writes them to the canvas. I found an example that detected a red ball in an image on the JavaScript canvas, however that had specific checks for the size of the ball, and i could not compile the two scripts together without causing the stream to cease being displayed.

I have had to settle for a working but less interesting alternative, which is different to the  other contingency plans that I initially thought up, as it is more reliable.

On the left hand side of the main viewing screen I have created a script that will randomly redirect the user from the iframe with the telemetry .gif inside of it to one of a number of different facts about Mars. The user will then be redirected after a period back to the telemetry. I have also added a flashing warning triangle .gif and alert noise to draw the user’s attention.


The warning .gif which animates for a short period of time when the page loads

Creating the User Interface

The user interface and controls are both web based due to the ease of customisation and wide range of functions that can be achieved via the various web languages such as HTML, JavaScript and PHP.

Main Screen

interfaceFor the main viewing screen I have decided that the central focus should of course be the camera’s video feed. I decided to centre this, and then overlay a clear .png image of the same size in a separate ‘div’ on the page  to create the ‘artificial horizon’ overlay on the camera. I found however that when the screen resolution is changed, it moved the png from the correct position. This is mainly an issue when moving it from the computer that I am developing it on to the projector or other monitor that might be of a different resolution. I solved this by leaving one page with the video feed and png overlay, and creating a new page with an iframe in the centre of it.

Similarly, I decided that to make the main page as simple and flexible as possible that everything should be in iframes, so the code for the main page only consists of three iframes, each aligned to a spate part of the page.

For the telemetry and satellite displays I decided that they should occasionally change to reflect new data coming in. I looked into JavaScript’s random function for this, and I decided that it would require a too high of a refresh rate to achieve the effect that I wanted. I therefore opted to create looping .gif images instead. For the telemetry, I decided to use two separate .gifs on two separate pages, and have a JavaScript function that occasionally refreshes the page to the other one.

Control Interface


My Initial draft of the control interface.

For the first draft of the controls I have stuck to the triangular design for the buttons, and I have redesigned the .gif on the ‘waiting’ page that is called when using some of the controls so that it incorporates the font and feel that is used on the main viewer page.

Additionally, it only runs through once before returning to the previous page as opposed to the old gif that was on a loop.

Note that the wheel direction triangles change colour depending on what the current direction is.

Original .gif

Original .gif


For the final design I want to smarten up the interface and make the buttons resemble what they are more clearly. I want to keep the triangle theme, but I also would like to make it feel more like a professional user interface, whilst retaining some of the brightness to engage younger users.

Creation of the Rover Body

Although the main purpose of the rover is that the user views everything from the on-board camera, I have decided that it would make it visually more appealing if it could be seen in its terrain environment afterwards and if it could resemble an actual Martian rover.

Having to use the RC car chassis however does limit what I am able to achieve, although it does provide a solid base from which to start.

Possible Materials:

ABS Plastic construction.

ABS Plastic construction struts and sheet material.

  • Strong
  • Easy to drill, saw and sand
  • Paintable
  • Easy to glue with poly cement

Balsa Wood

  • Light
  • Cheap
  • Easy to glue


  • Free
  • Widely available
  • Easy to cut
  • Lightweight


  • Lightweight
  • Sturdy
  • Easy to glue and paint
  • Cheap

I decided that my initial design should be in cardboard due to the availability and economic benefits, and then could be more easily measured up for creation in balsa wood, plastic or foamboard.


Final Prototype Design


Working with Electronics: Controlling the Electronic Speed Controller via the Web

The Electronic Speed Controller (ESC) can be controlled in the same way as the servo using the Raspberry Pi’s GPIO pins. The biggest difference is that theCapture pulse widths to control it are different.

To find out what pulses made it do what I decided that it would be easier to set the duty cycle to 10o and then to change the pulse widths based on this. I discovered that then at a pulse width of 15 the ESC made the motor go forwards, and after much trial and error, that a pulse width of 13 made it go backwards.

Control via PHP

PHP runs python scripts on page load, so I needed to have the control buttons link to a page with the python script called on it. I could do this in a similar way to how I did with the servo control and have several different pages that look the same but with different scripts called when they load, however this would leave me with over 10 different pages, and this seems like a lot.

I therefore decided that I would load a page that calls the ‘forwards’ or ‘backwards’ script, then goes back to the page the user was just on. To do this I needed some JavaScript.

<script type=”text/javascript”>

window.setTimeout(‘history.back();’, 1000); // waits a specified number of seconds before going back


This simple bit of script went into the <head> of my document. By changing the value ‘1000’ to another number you can change the time period that the page waits before going back. I then decided to add a simple message to the page that told the user that their previous command was currently in progress. I decided a .gif would make the page more interesting.



Change of Electronics

After many unsuccessful attempts at working the stepper motor I came across other projects using the Raspberry Pi that connected it to the servo and speed controller of a radio controlled car. Although in total more expensive and less customisable, it would save me plenty of time and effort to create the rover itself this way.

The biggest drawback would be the battery life. The rechargeable battery pack for the Pi lasts about 6 hours but the battery for the car is supposed to last only 15 minutes. I guessed it would last longer however because I would only be using it in short bursts of less than a second at a time, and the ESC would be drawing power from the Pi rather than that battery.

I chose a 1/18th scale model because it is smaller and therefore will have more room to move around.

After purchase the first thing I did was connect the servo in the same way as the one I was planning on using to move the camera with. This worked fine, however, the wheels obviously do not turn 180 degrees in each direction so I had to adjust the pwm time so that it would turn the wheels up to a maximum of 45 degrees in each direction. I also upgraded to a metal geared servo to stop the gears from shredding so easily if it was trying to turn too far in one direction or the other.