Pi - Flash a Led
What we are going to do is flash a light emitting diode on and
off. Not terribly exciting, but it does demonstrate the
fundamentals of using the Pi general purpose input output (gpio)
ports.
First a bit about about GPIO and the Pi.
Pins
The GPIO Pins have the following names and functions.
There are two naming conventions Broadcom numbers and the
standard pin location numbers.
Most of the pins can be either inputs or outputs.
For this demo we will be using one pin and setting it to an output.
GPIO# |
2nd func |
pin# |
|
pin# |
2nd func |
GPIO# |
- |
+3V3 |
1 |
|
2 |
+5V |
- |
GPIO2 |
SDA1 (I2C) |
3 |
|
4 |
+5V |
- |
GPIO3 |
SCL1 (I2C) |
5 |
|
6 |
GND |
- |
GPIO4 |
GCLK |
7 |
|
8 |
TXD0 (UART) |
GPIO14 |
- |
GND |
9 |
|
10 |
RXD0 (UART) |
GPIO15 |
GPIO17 |
GEN0 |
11 |
|
12 |
GEN1 |
GPIO18 |
GPIO27 |
GEN2 |
13 |
|
14 |
GND |
- |
GPIO22 |
GEN3 |
15 |
|
16 |
GEN4 |
GPIO23 |
- |
+3V3 |
17 |
|
18 |
GEN5 |
GPIO24 |
GPIO10 |
MOSI (SPI) |
19 |
|
20 |
GND |
- |
GPIO9 |
MISO (SPI) |
21 |
|
22 |
GEN6 |
GPIO25 |
GPIO11 |
SCLK (SPI) |
23 |
|
24 |
CE0_N (SPI) |
GPIO8 |
- |
GND |
25 |
|
26 |
CE1_N (SPI) |
GPIO7 |
(Models A and B stop here) |
EEPROM |
ID_SD |
27 |
|
28 |
ID_SC |
EEPROM |
GPIO5 |
- |
29 |
|
30 |
GND |
- |
GPIO6 |
- |
31 |
|
32 |
- |
GPIO12 |
GPIO13 |
- |
33 |
|
34 |
GND |
- |
GPIO19 |
- |
35 |
|
36 |
- |
GPIO16 |
GPIO26 |
- |
37 |
|
38 |
- |
GPIO20 |
- |
GND |
39 |
|
40 |
- |
GPIO21 |
We also need to know something about how much current a Pi pin can
supply and how much current it takes to run a LED.
- Amps the amount of current flowing in an electrical wire or
device. https://en.wikipedia.org/wiki/Ampere
- A typical electrical circuit in your home can provide 15
Amps - over that and the circuit breaker will trip.
- The typical power supply with your Pi provides a maximum of
2.5 Amps.
- The total current used from all pins on the Pi GPIO should
not exceed 50mA (milli Amps or .050 Amps). Each pin
should not exceed 16mA.
- amps - amount of electrical flow
- volts - electrical pressure
- resistance - resistance to electrical flow.
To calculate the amount of current we need to know about the
resistance of the led and the voltage supplied by the GPIO output.
Resistance of a LED - none - oops. Diodes are
interesting. In one direction they have infinite resistance,
no current will flow and in the other they have a fixed voltage drop
and then zero resistance. Voltage drop of the blue lead I am
using is about 2.6 Volts. I measured it.
to calculate current we use Ohms law which is I=E/R. In our
example this is (3.3 -2.6)/0, since leds have no resistance after
the fixed voltage drop. See why the oops. An infinite
amount of current - which means we probably toast the PI.
We solve this problem by adding resistance. A restriction in
the current flow created uniquely enough by a device called a
resistor.
So lets calculate the size of the resistor we want.
I=E/R or R = E/I. Max current per pin = 16 ma.
Lets go with 5 ma to be safe. So (3.3-2.6)/.005 = 0.7/.005 =
140 ohms. I think I actually have an approximately 470
ohm resistor in this circuit since I don't care about brightness.
A little more abouty leds.
As you can see from the above diagram leds have polarity - they must
be inserted in the circuit in the correct direction.
The end result the circuit looks like this:
Or as what we call a schematic diagram:
Note that although this schematic shows that we are connected to pin
16 we are actually using pin 19 in this circuit.
To Review
- The Pi can only supply so much current
- Leds without a resistor will allow an infinite amount of
current
- So we add a resistor calculated to limit the current to a
reasonable amount
- Leds only work in one direction in a ciruit.
Some Programs
Turn the led on
#! /usr/bin/python
# Import the Python gpio library
import RPi.GPIO as GPIO
# Turn off warnings
GPIO.setwarnings(False)
# This is the gpio pin I have the led connected to
pin = 19
# Set the pin number mode to Broadcom rather than connector order
GPIO.setmode(GPIO.BCM)
# Set the choosen pin to be an output and set the ouput true, on.
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, 1)
Or if we want it to flash a few times.
#! /usr/bin/python
# Flash a LED
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
pin = 19
GPIO.setup(pin, GPIO.OUT)
# Loop a bunch of times turning the led on and off with a delay of 1 second.
i=0
while i < 20:
GPIO.output(pin, 1)
time.sleep(1)
GPIO.output(pin, 0)
time.sleep(1)
i = i + 1
# Set the gpio pins we used back to the default input state.
GPIO.cleanup()