In a previous post, http://smokespark.blogspot.co.uk/2013/04/15-programming-attiny85-with.html I experimented with RGB LEDs and control of LED brightness using Pulse Width Modulation (PWM). That post includes explanations of how our human Persistence of Vision (POV) enables us to perceive a flashing LED as having less than maximum brightness. That was using the ATMega 328 (Arduino) chip to program an ATTiny85 microchip to produce Pulse Width Modulation.
The difference here, of course, is that we are programming the Raspberry Pi in the Python language. Not only are there coding differences, but we are working with 3V3 from the Pi's GPIO logic levels instead of 5V.
The circuit is a bit simpler than the last post at
http://smokespark.blogspot.co.uk/2014/10/55-exploring-pis-gpio-ports.html. The switches have been removed as there are now no input GPIO ports, only outputs corresponding to the red, green and blue anodes of the RGB LED. So the RGB LED is wired exactly the same as before - with its common cathode going to GND through a 325Ω resistor. You may have noticed that I still have wires running to GPIO ports 21, 22 and 23. These are not connected to anything on the breadboard - I just forgot to remove them when I took off the switches!
What the experiment does is simply to increase the brightness of the red LED from zero to maximum, decrease it back to zero, move on the green LED, do the same, and then do this all over again for the blue LED. The routine is in an infinite loop, but can be terminated gracefully by pressing CTRL-C on the keyboard:
For this video, I turned the ambient lighting down, as the LED colours all look white to the camera, in bright light. You can see that there is a little bit of flicker, and this is intentional. With a frequency of 40 hertz (40 Hz), my personal vision can detect flicker when the LEDs are in the dim part of their cycle. A higher frequency will easily remove this flicker.
It's interesting that this looping program doesn't use much in the way of processor resources. You can see from the above image of the Pi's desktop, that the Raspberry Pi's CPU indicator is fairly activity-free, presumably because the code keeps the processor in the idle state for most of the time with the sleep() command.
This experiment has been using software controlled PWM. There are some GPIO pins (GPIO12, GPIO13 & GPIO18 - although I have also seen GPIO18 described as the PWM pin*) which are labelled PWM and therefore seem to have a special role in pulse width modulation. When I find out how and when to use these, I'll post it up.
* servos require accurately timed pulses - which software alone cannot always provide, but GPIO18 with special software can (not sure I understand the subtleties here).