Caenorhabditis Elegans (C. Elegans) Nematode Project
This project started with a couple of less than perfect hardware experiments but ended with some software fun.
Without easy access to a 3D printer or even a laser cutter I am usually confined to using “off the shelf” boxes or serendipitous finds to house or support my projects. I can manage a bit of woodwork but this is usually at a “macro” scale (as examples, I reroofed our house and built a lapstrake canoe) and this makes me wary of attempting fine detail. I know I thought, “I will try Perspex”. A bit of online shopping took me to acetate sheet and I quickly ordered a sample.
I had a couple of continuous servo motors sitting in my “bit box” and had in mind to use as the basis for a lightweight robot chassis. Then addition of a couple of wheels and a small ball castor looked likely to make a good trial for an acetate sheet platform base.
A laser cutter would be great for acetate sheet as I quickly found out. It can be cut by scoring with a Stanley knife and snapping over an edge in a similar manner to glass cutting. It can be drilled with care but gluing calls for a polychloride glue that takes hours to set. I am sure that with enough time and patience I could have built up a composite base using layers of acetate sheet but I have to confess that I ended up with a “bodge”. The original plan to trial building a lightweight robot meant I was using an Arduino Nano and the low power requirements of the servos allowed me to use a 9v PP3 battery as an external power source. The initial trial sensor was a very cheap ultrasonic rangefinder board.
As a proof of concept for the continuous servo motors this was acceptable. All I have to do now is find a way of stacking and mounting the components to achieve a smaller overall package.
However, after a very simple test program confirmed that the motors could be happily driven together using the Arduino Servo.h library I put some though into how to get this little device trundling around the room without too much intervention. I remembered reading about a project that used an artificial neural network to simulate some of the behaviours of a nematode worm.
Caenorhabditis elegans is a free-living, transparent nematode about 1 mm in length that lives in temperate soils. This short lived but easy to study nematode has been widely used in research labs since the sixties. In 2012 C elegans became the only animal to have its entire connectome mapped – this is the only creature where we have a complete neural wiring diagram. This includes all of the connections between the 302 neurons and their interaction with the 95 muscle cells. TheOpen Worm project intends to build a complete simulation of the whole organism.
With a less ambitious aim than the Open Worm group, Nathan Griffith posted a project to GitHub for the C software supporting a simulation of the C elegans neurons controlling a robot and running on an Arduino. Compressing the connectome into a program that requires only 13,542 bytes of program space with global variables taking up just 825 bytes of SRAM is impressive. The short video of his Nematoduino robot navigating a room and responding to a barrier is also impressive.
The artificial neural network takes selected input from code running the ultrasonic rangefinder and runs a simulation of that stimulus through the neurons. Output values are collected from neurons that would (in viva) be connected to the worm “neck” muscles and used to control two motors running them independently at different speeds forward or reverse.
This was clearly just the thing for my bodge of a robot. I needed to adapt the motor control code for the simpler requirements of the servo motors and could not help making a few other small changes. However, the code is essentially the code I downloaded from GitHub. Does it work? Well yes it does. Disarmingly well, considering that there are no procedural rules ("if this, do that") in play – just stimulation and response through a set of weighted connections. This is clearly an area for further development although artificial neural networks make big demands upon memory and increasing demands upon processing power as they grow. Shoehorning a small network onto an Arduino Nano worked well but any next step presents greater challenges.
If you fancy giving this approach a try then you can download the code from GitHub or grab my small modifications from the website supporting my book “Practical Arduino C”.
Artificial Neural Networks (ANNs) are an active area of research and the founding technology for a great deal of the Artificial Intelligence (AI) projects and start-up businesses today. I had some instructional fun a few years ago building an ANN to play an acceptable game of noughts and crosses (tic tac toe) with some success although I don’t recall my model ever beating a trained simulation of Donald Michie’s MENACE“machine”.
ANNs started out as an attempt to model the function of brain neurons and later developments in the techniques has seen success in diverse AI areas such as computer vision, speech recognition and board game play. The big challenge in trying to model animal brain activity (with human brain activity as the ultimate goal maybe) is one of scale. While our little nematode has only 302 neurons, animals needing greater neurological support rely upon vastly greater numbers. However the huge numbers of neurons are dwarfed in turn by the numbers of connections between them. These connections being continuously laid down within an active brain.
Outside of some research labs, almost all ANNs are run on digital computers while animal brains are essentially analogue. Connections between brain neurons may run at varying speeds (due to their type and length) but they can all run as and when they are stimulated and multiple signals can arrive at any given neuron from a range of sources simultaneously and/or in a meaningful sequence. This is impossible to achieve using a digital computer which is incapable of managing more than a few parallel processes. Even when an ANN is scaled up to run on a large cluster of computers the achievement is dwarfed by the parallel processing capacity of even a simple animal brain.
So there we have the challenge. I love the idea of building new ANNs to tackle robot tasks but in the short term I need to switch to a more robust and stable hardware chassis. Anyone up for an Arduino cluster?
Last 2 pics just to show I can work OK even if only at a larger scale. Honest.