Turning on LEDs using the GPIO on the Raspberry Pi is pretty simple. You just turn on or off the relevant GPIO pin, and your LED (connected via a 330r resistor) will come on and go off.
This is great until you want to control the brightness of the LED. You can control the LED Brightness using timers in Python (the slower/faster you pulse the GPIO, the brightness changes). There are a few issues though:
As you slow the frequency, the LED flickers. As you speed up the LED, it does eventually start to dim, but uses all the Pi cpu resources (well on zero it does).
So the most elegant solution is to use the PWM function. Its very simple to use, however there are only a couple of pins on the GPIO that support it. This is hardware based PWM, so it doesn't consume CPU resource.
I have not used this in Python yet, so for now I am doing it from the command line, using the WiringPi libraries. Check out the WiringPi page if you need to set this up (takes about 20 seconds).
I found this information regarding the Raspberry Pi GPIO for the Pi2. I have not found the same information for the Pi 3 yet.
There are two hardware PWM channels on the BCM2385/6.
PWM0, which can be set to use GPIOs 12, 18, 40, and 52. Only 12 (pin 32) and 18 (pin 12) are available on the B+/2B, and PWM1 which can be set to use GPIOs 13, 19, 41, 45 and 53. Only 13 is available on the B+/2B, on pin 35 (but I think PWM1 is used for something - is it the audio output?)
For this example I am going to use GPIO12 (or Physical Pin32).
The steps to use the GPIO in PWM mode are very simple:
For this we need to just type in the following line:
gpio -g mode 12 out
This sets the mode to Output
gpio -g mode 12 pwm
This sets the GPIO Pin mode to PWM.
The PWM frequency is a 10 Bit number, so has a range of 0-1023
gpio -g pwm 12 50
The Higher the number, the brighter the LED. Simple.