Author Archives: dale-blog

A Magnavox Odyssey Pong Clone Using Arduino

The Australian Centre for the Moving Image, or ACMI as it is more commonly called is home to the permanent exhibition Screen Worlds. The exhibition was first opened all the way back in 2009, and has a large range of exhibits that showcase different technologies and trends in film, television, and digital culture that date back more than 100 years. Now when screen worlds opened, I was only just graduating high school myself, but after joining the ACMI AV department as an AV Technician for the first time in 2013 I have had the opportunity to get well acquainted with the individual exhibits by performing maintenance and making sure they stay up and running for as long as possible despite using equipment and technology that is now almost 10 years old!

This is easier said than done. Sometimes we are talking about maintaining 40 year old gaming consoles that run 24 hours a day! A reoccurring victim of this ambitious operating schedule was the legendary Magnavox Odyssey that ran a copy of the original Pong. ACMI burnt through quite a few Magnavox Odysseys through the years which is not particularly surprising seeing as the console was released in 1972. Original functional Magnavox Odysseys have become increasingly rare, and with the exhibit closed for some time the ACMI AV department decided to commission a rebuild of Pong that would try to emulate the original as closely as possible. Seeing an opportunity to do something cool, I put my hand up to attempt building a clone.

JAMMA Boards and Emulation

So how do you attempt a clone of something like Pong? There are lots of different pre-existing solutions out there that will do the job, but what are they and how faithful are they to the original?

Unbranded and branded so called “multicade JAMMA boards” are available from a variety of online sources that usually contain one or more versions of Pong, although versions of Pong that emulate the Magnavox are rare. Perhaps the most well known branded multicade boards are the Pandora’s Box series. But don’t go rushing to find a website with information on these boards, they are mostly illegal. They use MAME emulators in conjunction with illegal game ROMs that have annoyed companies such as Nintendo for years. If you know someone who has an arcade machine with these old classics and it didn’t cost several thousands of dollars, it is almost certainly illegal! Because of this using any kind of emulation or third party board was out of the question. This includes the use of any kind of computer that uses emulation software to play illegally downloaded ROMs. While various linux distributions such as the widely popular RetroPi are not illegal, legal ROMs of Pong are not available for purchase.

Coding a Clone

In contrast to emulated ROMs, coding a clone from scratch that is devoid of any particular trademarks is perfectly legal, hence why so many Pong derivatives have existed over the years. With this being the case, I decided to give a go at coding one these. The easiest solution would have been to make a reasonably accurate clone that can run on a PC or Raspberry Pi, but after doing some quick googling I noticed quite a few people had tried to code Pong games using the Arduino Uno and the TVout library. This library makes it possible to create composite signals using a couple of resistors and a couple of GPIO pins. The graphics it produces are pretty rudimentary, but perfect for something like a pong clone. Composite type signals are often imperfect, which actually helps create a retro type effect in applications such as this! It also has a simple audio tone generator which can produce some pretty convincing 1 bit audio signals.

The Hardware

The existing controllers were custom made to resemble the old school Magnavox controllers, and had two potentiometers each, as well as one momentary push button. One potentiometer acts as the spin control for once the ball has been hit, and one acts as the paddle position control. The push button puts the ball back in to play. The potentiometers are connected to various ADC channels on the Arduino, and the pushbutton is connected to a GPIO pin.

Existing Magnavox clone controllers

A GPIO pin was also reserved for connecting to an RCA jack that acts as the audio output. Two resistors are used for the composite output as per the write up done on the TVout library reference.

Schematic of project showing where everything was connected.

The Code

The code for this project is available here and is licensed under GPL 3.0, so by all means go ahead and use this yourself! I won’t go in to the details of the code itself as it is pretty sufficiently commented, but if everything is wired up correctly this should work straight out of the box using Sketch.

This Pong clone is closer to the version released for the Magnavox Odyssey 300 rather than the original Magnavox Odyssey. Hopefully the kids in Screen Worlds don’t notice! Some bugs appeared after installing this at ACMI which I didn’t have the chance to fix. If the ball is going fast enough sometimes it will go straight through a paddle and win a point for the opponent. The spin control was a little difficult implement, and harder still seeing as I never got a chance to play Pong on an actual Magnavox. One of the tougher things to get right with the TVout library is to make sure the game and graphics have been sufficiently updated before TVout tries to bit bang the output. This can actually add a visual retro effect to the game, but is not ideal and highlights how even a simple Pong game can push an AVR Atmega microcontroller to it’s limit.

See it for yourself at ACMI in Screen Worlds!

University Portfolio

Throughout my degree I conducted a variety of assignments as assessments for various courses at RMIT. As a kind of portfolio, I decided to share some of the work here. Do keep in mind a lot of the work shown here was done through group assignments, so not all the work is mine alone. Code and documents are attributed as such when appropriate.

Introduction to Embedded Systems:

  • Sun Tracking unit. A dual axis servo sun tracking unit controlled by an Atmel Atmega32 with code written in assembler,

Wireless Sensor Networks:

Real Time Systems:

Capstone Project:


openSerial: A Graphical Serial Interface Suited for Microcontroller Applications

For a university group project involving IoT sensors I had the requirement of creating a graphical interface that helps send various commands via a serial port, and receive data on the same serial port from the same IoT sensors as a reply. Obviously this can be done fairly easily with command line programs such as screen and miniterm and there are almost certainly suitable programs out there, but as it was a requirement for the group project I decided to give my own a go.  Thus, openSerial was born.

Command line serial programs can at times be a pain, and take more time then they should to get up and running. So I tried to make openSerial as useful as possible for a wide range of situations, although the application is more targeted towards talking to microcontrollers. It was coded using Qt, and utilises Qt’s QtSerialPort library. It scans the available serial ports once a second and updates the port name combo box list. The user can define different serial settings such as baud rate, data bits setting, parity bit setting, stop bit settings, and flow control settings. It also automatically updates the connection status label based on what serial port is connected.

A quick tutorial of openSerial.

The user can read the full serial output in the console window, and send single line commands using the command lineEdit window. A history of sent commands is displayed in the Send Commands Window.

I have tested it out and it seems to work well! Sometimes if you disconnect from a serial connection, you have to unplug and plug the device in again before reconnecting. But this is more likely due to the behavior of the end device I used to test the software with. When in doubt, turn it off and on again!

You can find the source code, and a .zip file containing a binary and required Qt libraries on my github page at The program has been tested on a machine running Ubuntu 18.04. It’s a little messy in the naming department, but should be quite easy for anyone to get their head around. I highly recommend using Qt Creator when working with Qt projects!


PollutionPi: Project Proposal for an Indicative Air Quality Index Compatible Raspberry Pi Powered Air Quality Station

As a part of my volunteer position working on air pollution issues at CPI Fondacija located in Sarajevo, Bosnia and Herzegovina, I put together a project proposal for the design and prototyping of an inexpensive air quality station. This prototype would have provided the basis for building a network of air quality sensors that can provide indicative air pollution sensing in Sarajevo and other areas of Bosnia and Herzegovina. The aim was two fold. To advocate for action that curbs the severe air quality issues Bosnia and Herzegovina faces, and to provide awareness on how acute the air quality issue is in the region.

Unfortunately the project never went ahead, but I have decided to publish the project proposal here as I believe the project had merit and I did extensive research that I included in the proposal. I also think it is good to use in the sense portfolio as it shows some of my research and project design capabilities.

PollutionPi: An Indicative Air Quality Index Compatible Raspberry Pi Powered Air Quality Station

24 Hour Air Pollution Data in Federation of Bosnia and Herzegovina

In an attempt to make air pollution data in the Federation of Bosnia and Herzegovina more accessable to citizens, the Federal Hydrometeorological Institute of Bosnia and Herzegovina (FHMZBIH) has kindly given access to validated 24 hour air pollution data from the years of 2015, 2016, and 2017. The following interactive chart allows citizens to view this data.

24 hour data better shows the cycles of pollution across the Federation of Bosnia and Herzegovina, with a particular emphisis of poor air quality within the winter months.

Mobile Data

PMSA003 Low Cost Air Pollution Sensor Accuracy; An Attempt At Calibration in Sarajevo

In the last five or so years, affordable low cost air pollution sensors have become available on the market resulting in an explosion of open source online projects that measure the ambient quality of air. Much discussion and research has taken place within academic and government environmental organisations as to how accurate such sensors are and whether they have a place in the enforcing of environmental regulation, or even providing an indication of air quality trends to citizens.

As a part of project I am currently involved in with a NGO located in Sarajevo, I constructed multiple boxes that house low cost sensors which measure PM10 pollution. These boxes followed a design created by a locally based start up called CityOS. CityOS have resources available on their website including parts lists, a step-by-step guide to assembling an affordable air quality sensor that measures PM10, PM2.5, and PM1 particulate matters, a code base for the project, and an interface to view and download measured data. In order to gain a greater insight in to how accurate designs using these kinds of sensors are, I decided to attempt to get some comparison data on these sensors by using sensor collocation. The CityOS designed sensors will be placed in the immediate vicinity to professionally calibrated devices maintained by the Federal Hydrometeorological Institute of Bosnia and Herzegovina (FHMZBIH). With this data, I intend to attempt to calibrate these sensors as to increase their accuracy.

The PMSA003 Particulate Matter Sensor

The Plantower PA003

The Plantower PMSA003 is used in this particular CityOS sensor design. This sensor is available from a variety of online websites and generally costs between $15AUD and $20AUD a peice. No english datasheet exists for the device as far as I could find, however a datasheet written in Mandarin is available here.

The datasheet specifies a PM2.5 accuracy of +-10ug/ms when PM2.5 concentrations are below 100ug/m3, and a +-10% accuracy when PM2.5 concentrations are between 100ug/m3 and 500ug/m3. Already this is a little worrying, as according to EU and BiH regulations healthy PM2.5 concentrations exist below an annualised average of 25ug/m3, and healthy concentrations of PM10 exist bellow an hourly average of 50ug/m3. Having such a large inaccuracy at lower concentrations would likely result in unacceptable measuring accuracy for the majority of time. No PM10 accuracy information was included in the datasheet, which is problematic as this is the precise particulate matter that will be measured during the test.

The PMSA003 uses the method of laser diffraction to detect how much particulate matter is in the air. Laser diffraction typically requires calibration with a sensor using an alternative detection method such as Beta Attenuation due to the way different pollution diffracts light, and the highly sensitive nature of the technique to meteorological factors such as humidity.

The CityOS “Boxy” Sensor

The CityOS “Boxy” design includes a protective enclosure that houses various electronic components such as the ESP8266, as well as a DHT22 digital temperature and humidity sensor, and the PMSA003. The bottom of the enclosure is open so air can freely flow to the PMSA003, and so the electronics can be somewhat ventilated. The Boxy unit sends the data via a wifi connection, where the data can then be accessed on the CityOS or by utilising the CityOS API. Particulate matter measurements are taken every 60 seconds. When accessing the data via the CityOs API, the measurements are averaged to an hourly value.

The DHT22 sensor datasheet specifies a temperature reading accuracy of +-0.5 degrees Celsius, and a +-2% relative humidity accuracy.

The Reference PM10 Station and Test Setup

Verewa F-701 PM10 reference station

The Sarajevo based FHMZBIH kindly allowed us to place six CityOS Boxy units in the vicinity of their professionally calibrated Verewa F-701 PM10 measuring station so we could use it’s results as a calibration reference. This measuring station is located at the FHMZBIH offices in Bjelave, Sarajevo. The station completes a measurement once an hour and the result is accessible to the public on the FHMZBIH website.

The housing for the CityOS Boxy sensors.

The six units were placed approximately four metres away from the reference station within a basket in a small housing that contained vents that allowed air flow and sheltered from the elements such as rain.

Six Boxy units inside basket.

In addition to reference PM10 data,  reference temperature and humidity data were also to be recorded in order to correlate the CityOS Boxy PM10 measurement accuracy with various weather conditions. The accuracy of the DHT22 temperature and humidity measurements were also to be compared to this data. The temperature and humidity data could potentially be used to calibrate the PMSA003 sensor regardless of the weather conditions.

The Results

Mobile Data

The above interactive chart shows data collected over a ten day period from sources including data sourced from six CityOS Box units, FHMBIH PM10 reference station, and FHMBIH temperature/humidity reference station.


The PM10 measurement accuracy of the PMSA003 particulate matter sensor housed in the CityOS Boxy enclosure was poor in almost all conditions presented while the testing was conducted.  By navigating the above interactive chart, the following conclusions can be made:

  •  Over the ten day test period the average error of the PMSA003 sensor in a CityOS Boxy enclosure was approximately +- 60% when compared to the reference PM10 measurements.
  • PM10 measurement error is significantly higher at lower PM10 concentrations, thus confirming the datasheet specification of significant errors at particulate matter concentrations below 100ug/m3.
  • There is a trend of higher PM10 measurement error as humidity increases, however there is no significant statistical correlation that can be utilised for calibration.
  • There is no significant statistical correlation between PM10 measurement error and temperature.
  • PMSA003 and DHT22 measurements were broadly uniform across all units.
  • The DHT22 temperature measurements had an average accuracy of approximately +-15%. The discrepancy of this accuracy and that reported on the DHT22 datasheet is likely to be due to the sensor placement in the CityOS boxy enclosure.
  • The DHT22 humidity measurements had an average accuracy of approximately -+50%. The discrepancy of this accuracy and that reported on the DHT22 datasheet is likely to be due to the sensor placement in the CityOS boxy enclosure.

From these conclusions, it is apparent that calibration for measurements under 100ug/mg may not be possible. While there are some correlations between PM10 measurement accuracy and PM10 concentration and humidity, the correlations are not represented in a uniform in a way that may be useful for the calibration of the sensors.


Due to the high measurement errors at lower particulate matter concentrations that do not correspond to bias errors, it is not possible to calibrate PMSA003 sensor to provide more accurate data at concentrations below 100ug/m3.  This calls in to question the usefulness of the PMSA003 sensor in providing accurate particulate matter measurements.

However, it may still be possible to use the PMSA003 in a useful way to inform individuals about dangerous levels of particulate matter concentrations in the air when hourly averaged values indicate concentrations above 30ug/m3. The United States Environmental Protection Agency (EPA), in partnership with the Village Green Project, conducted research in to the usability of low cost sensor in informing the public of poor air quality within communities. By analyzing the data measured by low cost sensors they came up with a scaling system that provides useful information to the public for PM2.5 measurements, while taking in to account the inaccuracies of low cost sensors.

The Village Green Project PM2.5 scaling system.

For PMSA003 measurements to be useful a similar scaling system should be utilised, and individual measurements should be treated with skepticism. The data analysed from this test seems to corroborate with this scaling system in terms of the accuracy of the measurements at different concentration levels. More qualitative analysis of the test data is required in order to make an similar scaling system catered towards the  PMSA003, however at first analysis the Village Green Project scaling system appears to be a good solution to the issue of poor measurement accuracy.

Controlling Ultrasonic Piezo Transducer Output with PWM Duty Cycle

For my capstone project at university I am working with a bunch of ultrasonic piezo transducers that require a variable sound pressure level (SPL) output. One way of achieving this is by driving the transducer with a pulse width modulated (PWM) signal and varying the duty cycle. My application actually requires a way of changing the output SPL in a linear manner, so I decided to conduct an experiment to see what the SPL output is with different duty cycles of the piezo transducer I have on hand, the Murata MA40S4S.

The Experiment

To do this, I taped together two Murata MA40S4S transducers together directly. As both of these transducers are specified as transmitting transducers, this was not ideal, but for the purpose of this experiment it will do the job for both transmitting the pulses with varying duty cycle, and measuring the resulting output.

The two MA40S4S piezo transducers taped together.

I connected a Picoscope 2204A’s arbitrary wave generator (AWG) directly to one of the transducers, and the channel A input of the Picoscope 2204A to the remaining transducer. This formed the transmitter/receiver setup.

The transmitter/receiver setup

From there, I found the resonant frequency that resulted in the greatest voltage output from the receiving piezo transducer. To do this, I setup a 2Vpp square wave with a duty cycle of 50% with picoscope’s software, and then slowly sweeped different frequencies around 40kHz. I found that the highest receiver voltage peaked with a driving frequency of 43.9kHz.

The picoscope software setup for creating square waves with different duty cycles and measuring the response

Then everything was simple. I just changed the duty cycle of the square wave and recorded the peak to peak voltage of the receiving transducer.

The Results

The following charts show the measured receiver output when the transmitting transducer was driven with a 43.9kHz square wave signal with differing duty cycles.

Output measured from receiving transducer at different transmitting duty cycles

From these measurements we can see that the greatest output occurs with a duty cycle of 50%. We can also see that as duty cycle is decreased, the voltage output does not decrease in a linear manner. In order to get an idea of how non-linear the transducer is at different driving duty cycles, I made the following chart which displays the ideal and measured response in decibels relative to a duty cycle of 50%.

Transducer response relative a 50% duty cycle

We can see from this chart that the error is significant. If linearity is required in the reduction of SPL output from these transducers when using PWM with a varying duty cycle, some kind of calibration would have to take place. This is especially the case as piezo transducers of this kind often have large tolerances.

The Conclusion

Driving piezo transducers with PWM signals that vary in duty cycle is a great way to reduce SPL output in an easy manner. However changes in duty cycle do not result in a proportional change in SPL output. If linearity is required in this sense, some form of calibration should be performed.

It should be noted that the poor linearity of the results could be influenced by the receiving transducers own non-linearities. Frustratingly this kind of thing is not defined in the Murata MA40S4S or MA40S4R datasheet, but I have no way to know for sure other than by purchasing a decent ultrasonic microphone and performing the same measurements.