Friday 26 August 2016

'Finally, let's get growing'

It took a lot of effort, money and time to get to this point so by now I had read a lot about lettuce being a good vegetable to start with; spinach I also found to germinate quickly and grow within a week.  My spring onions started to grow but oh so very slowly, so much so I would say they would probably have grown faster in the ground.  My radishes did not germinate at all.


Currently I'm experimenting growing flowers rather than vegetables.  A few thoughts behind this; firstly with vegetables you tend to have a dozen lettuces ready at the same time and end up giving them away whereas with flowers you don't need to 'consume' them all at once, you can transplant them in the garden.   With Brexit the cost of imported flowers (90% are imported) is likely to increase.

The nutrients

From what I have read the manufacture General Hydroponics three nutrient solution is considered the best especially for beginners.  I started with the litre bottles again bought from Amazon for around £10 each.  There is Flora Micro, FloraGro and FloraBloom of which you will need all three.  I noticed that the FloraMicro comes in both hard-water and soft-water with the hard-water version being three times as expensive as the software version.  My assumption is that purists of hydroponics say to use rainwater which is soft rather than tap water (no chlorine).  If you use tap water as I do it's suggested to leave it in direct sunlight for 24 hours to remove the chlorine.

Hydroponic purists also say not to use metal, sealants, and only food grade plastics in your setup.
Click here to continue reading on this subject.

feedchart is available from the General Hydroponics website which provides all the information you need.  I also found this video very useful as an overview.

You need to reduce the PH value of the water you are using to around 5.5 depending upon the plat you are growing.  I found that it's cheaper to buy the PH UP  and PH DOWN bottles together than just the PH DOWN on its own, which to be honest is the only bottle I have ever used.



The yellow device is called a PH Pen Tester which is around £10 from Amazon and is essential to check the PH of the reservoir water.  The hydroponics purists also recommend using a TDS Digital Water Quality Tester (the blue device).  This is a very useful video providing an overview into what TDM, PPM, conductivity and EC mean!

I haven't used my TDS meter simply because as soon as water passes through the clay balls the PPM reading goes through the roof makes it meaningless.  In a pure hydroponics setup where just water is used then it would be more beneficial.

Finally from a practical perspective using a large volume syringe makes life much easier when measuring the nutrient .  A recommendation I have seen is not to mix the nutrients together; instead reduce the waters PH then add each nutrient, one at a time to the water while mixing.

The temperature of the reservoir is important since warmer water absorbs less nutrient and oxygen this is why I buried my reservoir in the ground to keep the temperature constant and also use an aerator.  This is a very useful video on reservoir temperate.
Monitoring hydroponics

I originally set out to monitor and control my hydroponics setup using the Arduino however it soon became obvious that keeping everything as simple as possible is definitely the best idea.  I've now left growing down to Wilma and instead focused the Adrunio on monitoring the environment with multiple sensors.

I've discovered a fantastic website called ThingSpeak which enables you to send sensor readings from the Arduino, then you can graph and analyse data.


Click here to see the real-time hydroponics  monitoring in action!

Problem alerting

It's useful to log the environmental factors influencing the crop but it's even more important to know if there is a problem such as things are getting too hot in midday sun and you need to do something about it.  This is where I use a second really useful website called Prowl which pushes alerts to your mobile, tablet or computer etc.



About the Arduino environment

Just like the hydroponics setup there have been a number of versions of the Arduino design, originally with relays to control pumping (running via a 12v caravan battery), through to coupling of a Raspberry Pi 3 to provide monitoring, graphing and alerting - then ultimately superseded by ThingSpeak and Prowl.



The Arduino design running today simply collates sensor data and logs it to ThingSpeak.  In the 'control box' there is an electronic timer to control pumping cycles which are specific to the growing life-cycle of the plant, a complementary timer to switch the air pump on / off, and a home-plug to connect the Arduino to the Internet.  Further reading on aerating a hydroponics reservoir.

What's the Arduino is monitoring?
  • Environmental temperature
  • Plant temperature
  • Plant humidity
  • Reservoir temperature
  • Ground temperature
  • Arduino Temperature
  • Rain drop sensor alarm
  • Sensor failure alarm
Contact me if you would like a copy of the source code ;)
Version 3.0 - 'Third time lucky'

The PVC sheet concept worked much better than the flower troughs but it still continually leaked where the return hose ran back into the reservoir.  At this point I also started to get problems with the Arduino crashing when the water pump started.  My original goal was to remotely monitor the hydroponics setup using the Arduino and control it but I was now still struggling to even grow a single thing.  The pivotal moment came when one night all 30 of my seedlings were eaten by slugs!

Pests are indeed a very real risk to your hydroponics investment especially when you have the kit outside (with cost apportionment I was up to about £25 a lettuce at this point).  With experience I am now using a combination of stale larger, salt and copper tape, continue reading here.

So, I decided to cut my losses and go with the Atami Wilma 10 Pot Hydroponic Dripper System which cost me £97.98 from Amazon.  Thank God.

I also purchased a plastic cold-frame £31.50 to protect everything from the elements.  In the picture you can see the Arduino monitoring system (more on that later).  I also dug the Wilma into the ground for thermal stability.


Conclusion

I recommend buying a hydroponics system just so you can quickly get growing, then as your experience expands create your own system.  There are so many things to go right / wrong when attempting to build and grow initially.  If I had started with a purchased system I would have saved myself several months and a good few hundred pounds.


First results

From seed to a fully grown lettuce only took six weeks which was extremely satisfying (plus tasty) given the problems I initially had.


Version 2.0 - 'Back to the drawing-board'

I quickly discovered the clay pebbles continually became lodged in the pipes connecting the troughs which ultimately led to the problem where the first few troughs filled up with hydroponics solution and took a good 30 minutes for all ten troughs to fill and drain.  This posed a real headache preventing the reservoir getting pumped dry and burning the pump out.  The workaround was to pump for one minutes and wait for five minutes then repeat, ugh.



So v2.0 was a fundamental redesign whereby I removed all the flower troughs, leaking pipes that clogged with a simple PVC sheet lining the ground trough.

Lessons learned

At this point I was reminded about the laws of gravity.  

I had mounted the water pump in the relative safety of my garden shed which is next to the troughs with the thinking to protect it and be close to the Arduino control equipment (I'll cover this later).  By mounting it there it meant that as soon as the pump switched off water siphoned out of the pipe leaving the pump needing to be manually primed.  Cue max irritation.

The v2.1 design moved the pump under the reservoir which meant it never needed to be primed.

I also realised I needed protect the setup from the elements such as rain and debris so I purchased some grow tunnels.


Shopping list

  1. AmgateEu 30-Pack 2.8 Inch Mesh Plant Pot @ £9.90 Amazon
  2. 25 Litre Plastic Water Container Food Grade @ £10.58 eBay
  3. Kingfisher Transparent PE Grow Tunnel @ £7.28 Amazon
  4. GroDan Cuttings Rockwool Seeds Cubes 1 inch x 77 @ £11.97 Amazon

Version 1.1 - 'Optimise'

The plan was to remove the weakest link, the guttering.  I bought garden irrigation pipe used for hanging baskets so that the water from the pump would drip feed into each trough individually rather than gushing into each trough.  I soon found that this method works only due to mains water pressure, a small pump just can't create the necessary water pressure.

I abandoned that idea and instead used normal hosepipe linking the pump to trough number one, with connecting water pipes connecting subsequent troughs back into the reservoir, a bit like an overflow. This seemed such a simple idea I couldn't understand why after googling it I couldn't find anyone else who had done it (there is a reason!)





Lessons learned
  1. It was a nightmare to connect the troughs and pipes together especially as they are beneath the ground.  Getting one end in inevitably meant another pipe came out.  Even when using lots of silicon sealant I couldn't get a watertight seal which meant lots of expensive hydroponics solution was continually lost.
  2. Alas I didn't think about the reservoir size I actually needed so I just bought a food grade 25 litre container.  This an important point ensuring you have enough nutrients for the plants.
  3. Having ten flower troughs meant I needed over 90 litres of clay pebbles which not only added to the cost but also had an impact on the amount of nutrients needed (and ultimately the reservoir size).

Shopping list
  1. Canna 45L AquaClay Bag from @ £15.99 each Amazon
  2. 46m Micro Irrigation Watering Kit @ £12.77 Amazon
  3. VivReal 12V DC Submersible Water Pump @ £12 Amazon


Version 1.0 - 'Keep it simple'

In my mind I had visions of a simple Dutch Bucket design with a reservoir, pump and Arduino acting as the control.  I bought some flower troughs with holes in the bottom and guttering to return the water to the reservoir.





Lessons learned
  1. Although simple it was incredibly difficult to get a good gradient from trough one through to trough ten (yes ten troughs, what an idiot!) and back into the reservoir
  2. Dirt continually got into the water
  3. Putting the troughs in a trench however did keep them thermally stable with the rise and fall of heat in the summer.
My hydroponics project for beginners


About this blog

During 2016 I have been experimenting with hydroponics starting off as a complete novice to now being more accomplished.  This blog provides lessons learned, hints and tips for those starting out in hydroponics.  "I've already made most of the mistakes you are about just too!" - Mark Cunnell



What is hydroponics?

Hydroponics is a method of growing plants using mineral nutrient solutions, in water, without soil.

The concept surprised me having only ever seen hydroponics in Sci-Fi films but a bit of googling quickly proved just how popular it is from hobby enthusiasts and small holdings right through to huge commercial operations.  Equally surprising are its origins, rather than being Sci-Fi they date to circa 1627.  Wikipedia provides a great introduction into the subject, continue reading here.

You may well at this point be thinking "Yuk I'd never eat anything grown like that", well if you have eaten a tomato, lettuce, cucumber, basil....over the last few years you already have.  Hydroponics means you can grow more in a smaller area, faster, all year round and therefore at a greater profit.


Carpe Diem, Seize the day

Once I started reading around the subject I quickly became excited with the possibility of throwing in the day-job (sound familiar?!) and either setting up a small holding on cheap land or creating hydroponics kits commercially.

I quickly came to the conclusion that creating hydroponic kits is already highly automated especially at a commercial level, even setting up a small holdings the question soon became should I buy a kit or design and build my own - so, if I was going to do anything I first needed some experience.

A really interesting article in the Economist which discusses 'vertical gardening' opening up the possibility for huge yields even in cities.


Getting inspiration from YouTube

Thursday 20 August 2015

Arduino Weather Station

 

Overview


A quick rummage through eBay and you soon realise how many sensors types there are for the humble Arduino so in this project lets get to work with six interesting ones.  A weather station is the perfect scenario to combine data from all of these sensors and turn it into an interesting view of your surroundings.  I've captured the readings to an SD card but there's no reason why the data couldn't be sent via a network card, Wi-Fi to a remote location anywhere on Earth!


Here's a quick radar graph focusing in on the air around the Arduino during a 24 hours period, specifically studying its quality, humidity and temperature.

The five Keyes sensors (from left to right):



  • Ambient light
  • Air Temperature and humidity
  • Air pressure 
  • Air quality
  • Soil moisture

You could keep going with a rain drop sensor for example but after five sensors and an SD card you're going to run out of I/O pins on the Ardunio Nano and Uno, but if you want to keep expanding the Arduino Mega is your way forward.


Be autonomous...


You are going to need power and lots of it with all of those sensors, I've been using the EC Technology® 22400 mAh external battery which I bought from Amazon for £20 in July 2015.




Next you are going to need somewhere to keep it out of the rain, direct sunlight which really messes up you temperature readings, its proper name is a 'louvres' or 'Stevenson Screen'.





With all that information being captured you need to store it safely, I found the most reliable way is an SD card via the Arduino Shield which simply means you can add you prototype board on top, hence the three layers in the photo earlier.  The other reason to go for the shield is the real-time clock which you need to track the date / time when the readings are made.




To conserve power I didn't add an LCD screen but opted for a single LED based set of lights.  The green LED pulses on/off as the Arduino enters the sensor reading loop, if there is a problem (a bit like a try catch) then the red LED illuminates.  This way at a glance you can see if all is well or there is a problem.  To debug an issue such as a failed sensor the best way it to plug it into the computer and enable the serial.println debug command to see what the root cause is.




The Weather Station in action!

The source code ...

Good luck and here is the source code for the Weather Station project which you are free to download and use.

Any problems or a thank you leave a comment!

Friday 10 April 2015


Arduino Uno - Range Finder,  RF transmitter and receiver

The radio frequency in this project is 315 Mhz


Overview


The range finder sends out a sonic (ping) which bounces off a solid object, it then compares the time taken for the (echo) to be received.  All this hard work is taken care of by the HC SR04 ultrasonic module.  The transmitting Arduino reads the sensor every two seconds, then uses the VirtualWire library to encode the centimetre value and RF transmitter to broadcast the data at 315 Mhz.

The RF receiver on the second Aurdino is listening on the 315 Mhz channel and picks up the transmission which it then decodes and displays on the Liquid Crystal Display.

The 'clicking' on the video is RF interference from the transmitter!

Shopping list hardware

  • 2 * Arduino Uno
  • 1 * HC SR04 ultrasonic module (RF Transmitter and RF Receiver)
  • 1 * LCD
  • 2 * 10k ohm resisters


Aurdino software and libraries

  • Arduino Development Environment I'm using v1.6.3
  • VirtualWire to control the HC SR04 ultrasonic module
  • Liquid Crystal (this will already be in your Arduino Library folder)

Receiver circuit

See the official Arduino wiring diagram for the LCD, the only difference is that pin 8 is used instead of pin 11 (as 11 is needed for the receiver).  For more information on the HC SR04 see this very good overview page.

HC SR04 wiring
VCC to 5v
GND to Ground
Data to pin 11


Transmitter circuit




For the transmitter Audrino

#define trigPin 9
#define echoPin 8

#include <VirtualWire.h>

char strDistance[6];

void setup()
{
      // Initialize the IO and ISR
      vw_setup(2000); // Bits per sec
      
      Serial.begin (9600);
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      
      send("Meter is ready");
}

void loop()

      long duration, distance;
    
      digitalWrite(trigPin, LOW); 
      delayMicroseconds(2); 
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      
      duration = pulseIn(echoPin, HIGH);
      distance = (duration/2) / 29.1;
      
      if (distance >= 200 || distance <= 0){
        Serial.println("Out of range");
        send("Out of range");
      } else {
        Serial.print(distance);
        Serial.println(" cm");
        
        sprintf(strDistance, "%i cm", distance);
        send(strDistance);
      }
      delay(2000);
}

void send (char *message)
{
      vw_send((uint8_t *)message, strlen(message));
      vw_wait_tx(); // Wait until the whole message is gone
}



Sunday 5 April 2015

Arduino Uno, Laser, Morse Code, LCD and Humidity / Temperature Sensor


Simple Laser Communication Project


Overview

The temperature and humidity sensor sends its output to the first Ardunio Uno who creates the text which is displayed on the LCD.  The text is converted to Morse Code on the first Arduino and transmitted to the second Arduino using a red laser.

The second Arduino receives the laser light via a photosensitive resistor and decodes the received Morse Code into ASCII which it then sends both the original Morse Code and ASCII to the LCD.


  


Shopping list

Although this project looks complicated it's simply a number of smaller projects coupled together, if you're new to the Arduino take a look at 'Learning the basics'.


Hardware

  • 2 * Ardunio Uno
  • 1 * Laser Diode (Keyes KY008)
  • 1 * Photosensitive Resistor (Keyes KY018)
  • 1 * Temperature and Humidity Sensor (Keyes KY015)
  • 1 * Piezo buzzer (optional)
  • 1 * LCD 
  • 2 * 10K ohm resistors
  • 1 * 50 ohm resistor
  • 1 * 100 ohm resistor




Aurdino software and libraries



Receiver Circuit


Most of this circuit is devoted to wiring up the LCD.


















Transmitter Circuit

As a reminder the Arduino on the left in the video is responsible for reading the temperature sensor, created the text for the LCD, generating the Morse Code and transmitting through the laser.


For the Transmitting Arduino...

// Usage: morse( <pin number>, <speed WPM>, <1=beep, 0=PTT> )
//        sendmsg( "<text-to-send>" )

#include <Morse.h>
#include <dht11.h>
#define DHT11PIN 2

// Use pin 13 (built-in LED of Arduino 2009)
Morse morse(13, 8, 0);
dht11 DHT11;
String strMessage = "";

void setup()
{
    //Serial.begin(9600);
}

void loop()
{
      int chk = DHT11.read(DHT11PIN);

      Serial.print("Read sensor: ");
      switch (chk)
      {
        case 0: Serial.println("OK"); break;
        case -1: Serial.println("Checksum error"); break;
        case -2: Serial.println("Time out error"); break;
        default: Serial.println("Unknown error"); break;
      }

      // Use a . for a space as Morse Code does not have spaced!     
      strMessage = ".HUMIDITY." + String(DHT11.humidity) + ".PERCENT...TEMP.." + String(DHT11.temperature) + ".CELSIUS..";
  
      //Serial.print(strMessage);

      int intLength = strMessage.length() + 1;
      char charMessage[intLength];
      strMessage.toCharArray(charMessage, intLength);

      morse.sendmsg(charMessage);
     
      delay(30000);
}

Saturday 11 January 2014

Now with Text-to-Speech and Speech Recognition

Adding text-to-speech was equally painless - I used the System.Speech.Synthesis library and added the below lines of code to wherever speech was required.  Now as you say a command it is repeated back via text-to-speech and displays it in the journal.

            // Initialize a new instance of the SpeechSynthesizer.
            SpeechSynthesizer synth = new SpeechSynthesizer();

            // Configure the audio output.
            synth.SetOutputToDefaultAudioDevice();

            // Speak the recognised text passed to the recogniser event.
            synth.Speak(e.Result.Text);


About these videos:

To watch them in synchronisation start Arm Cam at 9 seconds and Computer Cam at 3 seconds.

Arm Cam: Speech controlled robotic arm with text-to-speech feedback

Computer Cam: Speech controlled robotic arm with text-to-speech feedback (no sound)

To help the speech recognition out I was toggling the mic between mute/un-mute and accidentally cut off part of the "wrist up"command, so it thought I said wrist down, quickly toggling the mic on again it picked up part of the text-to-speech repeating the command - this is why you hear "I have no idea what you said" which is triggered on the recognizer.SpeechRecognitionRejected event.  See the blooper at at 1:05 (Arm Cam).

Some links for further reading:
If you would like a copy of the full C# source code for my application let me know.
(Just in case you were wondering why the pink desk, its running on my daughters laptop!)

Thursday 9 January 2014

Speech recognition for the robotic arm

While waiting for the step motor to arrive I had the idea of adding speech recognition to the C# project.  It was incredibly simple using the in-build Speech Recognition capabilities of Windows.

In summary;
  1. Create a grammar with the phrased command (utterances) such as "light on", "shoulder down"
  2. Use the speech recogniser to pick up the spoken commands
  3. Parse the plain text result and use a simple Switch statement to run the relevant arm command
  4. It really was that simple!

Screenshot of the updated GUI which now accepts voice commands


A short video of the arm moving via voice commands


Some snippets of the code:

 Creating the grammar and running the recogniser



Parsing the recogniser results and calling the corresponding arm movement function

Sunday 5 January 2014

If at first you don't succeed, use YouTube and eBay!

There looks to be a feasible solution to the control precision issue which involves replacing the 5 DC motors with step motors and using a Raspberry Pi (which just happens to have been sitting in my cupboard since the summer) to control them.


Step motor and Pi (Raspberry)


The theory at least is to replace the USB I/O PCB which came with the arm and use the Raspberry Pi instead to translate the movement commands pushed to it from the C# app on the PC.  Michael Horne has created a project to control four step motors, albeit without PC input, in his blog.


Controlling the step motors individually (C)Michael Horne


Before getting too excited though I need to check I can actually get a step motor to fit within the robotic arm, they're currently £5.50 on eBay so it's worth a punt.

Wednesday 1 January 2014

Happy New Year!

To start the New Year off with a bang I've discovered a fundamental problem with the Robotic Arm, but more about that in a moment.

The core components 'in a nutshell'


So far I have addressed each of the four core components of this project individually and started to pull together a encompassing C# program to get them to working together.  It was at this point I started to put the arm through it's paces with one of the kids Christmas presents - Marble Madness.

The issue I discovered is despite sending an identical set of commands to the arm the final position was not the same place each time, in fact some axis where hugely off!  The PC I/O is the same each time as verified when using the PC application which came with the arm, it's the actual motors themselves.

Now for the fundamental oversight; the DC motors are of course affected by the weight of the arm, battery condition and arm position i.e., asking a motor to spin for 1 second could result in 10 degrees movement in one instance and 20 degrees movement in another.


The view from the arms claw


The view of the whole arm

Running the tests in the above videos several times resulted in the arm completely missing the marble drop position.

Noooo, now what?!   Maybe I need to take a look at some servos or a step motor to increase accuracy.

Sunday 1 December 2013

Controlling the robot arm with C#...

This video is rather busy so I'll explain what's going on.

The C# application (called 'Project AM.E') is the main application that will contain all the functionality to start the webcam, analyse the picture for colour bricks, AI to sort the bricks and control the robot arm.  The Microsoft LifeCam window is only there so you can see the robot arm moving.  At the moment the application is just displaying dummy data and moving the arm as a first test...

  • As the application loads it switches on the webcam (so the robot can see!)
  • I press the 'start button' which currently just simulates analysing the picture
  • As the robot arm starts to move I bring the Microsoft LifeCam window back into view so you can see it moving
  • Notice the log at the bottom of the application screen which is showing what's going on throughout


First test controlling the arm

Saturday 30 November 2013

First draft of the GUI ...

The basic elements are there, the webcam view, the interpreted brick colours and on the right will be the sorted bricks.

I've added a listbox to display the debug information which looks rather good while it is working.

Next is to start controlling the robot arm and coding all of the functionality together.

First draft of the Graphical User Interface v0.1

Friday 29 November 2013

No disassemble Number 5!

Anyone remember Short Circuit?

Yes, well that shows your age....anyway, one tip when building the robot arm, empty each packet for screws one-by-one, count them (which is the only way to recognise the subtle differences between them), then label them with their P number.

 Page 5 of 28


I think my cunning plan might have a hole it in, I'm not sure the pincers will open wide enough to pick up the webcam - so instead I might have to mount it on the yellow plastic shroud at the top....


And... finally page 28 of 28!



Thursday 28 November 2013

The Robot Arm's here ...

I best get some Super Glue and a large hammer!



ROBOTIC ARM USB!

Errr, oh oh, look at all these tiny bits

Ikea has nothing on this - more beer needed!

Wednesday 27 November 2013

Creating 'flight paths' for the robot arm...

To keep the logic simple when controlling the robot arm I've decided to create the concept of 'flight paths' as in predefined routes the arm will take rather than having a different route for each sort action.

So to move the unsorted green brick in position 0 into its sorted position 3 I would need to call the following predefined 'flight paths':

A - to move the arm to the default unsorted position
B.n - where n is the unsorted bricks position, 0 to 8
C.n - where n is the unsorted bricks return to default unsorted position
D - to move the arm to the default sorted position
E.n - where n is the sorted bricks position, 0 to 8
F.n - where n is the sorted bricks return to default sorted position
G - to move the arm to the default unsorted position
Either sort another brick or H - to move back to the arm start position

I could optimise the last brick sort step and move the arm directly from default sorted position to the arm start position, i.e., missing out G and H for the last sort and call it step I.

I'll also need a set of flight paths to pick up the web camera, take the picture and return the web camera before stating off sorting the blocks.  More code!!!

Robot arm 'flight paths'

Sunday 24 November 2013

Getting the webcam working ...

This was a lot more complicated than I first thought, there is example code on the Internet to capture images from webcams but not all of it works on Windows 8.1 64 bit with Microsoft Visual Studio Express 2013 Desktop, C#.

To cut a long story short I found that you need to use Windows Image Acquisition (WIA), which uses the Windows Driver Model (WDM) architecture.

Again this is just another piece of test code which will need stitching into a main application but what is does do in only a few lines of code is:
  1. Switches on the webcam so you can see the live video feed from the webcam
  2. Enables you to take a picture and automatically save it as a JPEG on your hard drive
  3. Switches off the webcam 

Webcam video and image capture


Using the example code that Samuel dos Anjos has written (link below) I simply added a new button 'Take Picture' to the Form and added a takePic function to the userControl class.

Calling the new Save Image functionality


The video feed is displayed via a PictureBox (ImgWebCam) control in Samuel's example so all I needed to do is use that control to save its current image as a JPEG.

Saving the current image as a JPEG


The earlier code can then pick up that JPEG and start analysing it.  The fact that you can see the live webcam video feed as the Robot arm is moving the webcam to take the picture will I'm sure look pretty cool!


Some useful example code from Samuel dos Anjos: