If you have used the GPIO Python library before, you have seen that to turn on a GPIO pin you would use
GPIO.output(pin, True), and to turn it off you would type
GPIO.output(pin, False). The key here is the
False. Just like a light switch, a GPIO pin can only be completely on, or completely off. This is called
digital because the Raspberry Pi sends a binary signal of 1 or 0 to the GPIO pins, for on and off respectively, just like computers operate only in binary.
But, what if you want something in between? Something not fully on, but not off, either. Like, if you wanted to turn on a light three-quarters of the way on such as a dimmer, or make a buzzer buzz at a different frequency, or read a temperature from a sensor. This is called
analog. Real life examples are volume knobs, speakers, and TV backlights. However, the Raspberry Pi can only output either digital signals (
False) by itself. This is why we need something called Pulse Width Modulation.
Pulse Width Modulation (PWM) acts as an analog signal by outputting a pin on and off very quickly. Using PWM, you can dim an LED with the same effect of applying a smaller amount of electricity, but using digital pulses. Here is a link to an example of an LED fading using a PWM signal. The more pulses a second, the brighter the LED will seem to be.
PWM is easy to try. The GPIO Zero library supports it. For a start, try this:
from gpiozero import PWMLED
led = PWMLED(18)
for i in range(10):
led.value(i / 10)