The Raspberry Pi is a small credit-card sized linux computer. Developers and hobbyists around the world are creating miraculous applications and projects, and now you can join them. This presentation covers the first steps to using your Pi. From the basics, like burning your SD Card to creating a Weather Reporter. Discussing GPIO Basics and simple Python tools. Communication between other components using SPI or I2C is also covered.
28. UNO
MEGA
DUE
Pi Model A
Pi Model B
Operating
Voltage
5V
5V
3.3 V
3.3 V
3.3 V
SRAM
2 KB
8 KB
96 KB
265 MB
512 MB
FLASHMemory
32 KB
256 KB
512 KB
up to 64 MB
up to 64 MB
Clock Speed
16 MHz
16 MHz
84 MHz
700 MHz*
700 MHz*
USB Host
n/a
n/a
1
1
2
Network
n/a
n/a
n/a
n/a
10/100 wired
Ethernet RJ45
HDMI, Composite
Video,
TRS-audio jack
Audio / Video
n/a
n/a
n/a
HDMI, Composite
Video,
TRS-audio jack
Current I/O
pins
40 mA
40 mA
total 130 mA
2 to 16 mA
2 to 16 mA
54 (12 PWM)
17 (1 PWM)
17 (1 PWM)
Digital I/O Pins 14 (6 PWM) 54 (15 PWM)
Analog Input
Pins
6
16
12
2DAC Analog Out
0*
0*
Price
$30
$59
$50
$25
$35
44. Install Your OS
1. Download and Unzip the .zip from www.raspberrypi.com
2. Format the SD Card to clear all Data
3. Drag Drop the contents of the .zip onto the SD Card
54. blink.py
!
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
#use the common numeration,
#also the one found on the Adafruit Cobbler
led = 21 # GPIO Port to which the LED is connected
delay = .5
GPIO.setup(led, GPIO.OUT) # Set 'led' as and Output
print Press CTRL+C to exit
try:
while True:
GPIO.output(led, True) # led On
sleep(delay) # wait 'delay' seconds
GPIO.output(led, False) # led Off
sleep(delay) # wait another 'delay' seconds
except KeyboardInterrupt:
GPIO.output(led, False)
finally:
GPIO.cleanup()
60. RaspberryPi
Serial Peripheral Interface Bus - SPI
SPI requires four signals:
clock (SCLK)
master output/slave input (MOSI)
master input/slave output (MISO)
slave select (SS) or (CS) chip-select
61. pi@raspberrypi ~ $ cat /etc/modprobe.d/raspi-blacklist.conf!
# blacklist spi and i2c by default (many users don't need them)!
blacklist spi-bcm2708!
blacklist i2c-bcm2708!
!
Loading Kernel Modules:
Edit the raspi-blacklist.conf, so that the spi module gets loaded,
Reboot, and confirm with lsmod that ‘spidev’ and ‘spi_bcm2708’ are now loaded and
ls /dev/spi* shows two spi devices: /dev/spidev0.0 and /dev/spidev0.1
!
Installing Dependencies:
sudo apt-get install python-dev git-core!
!
Install Python bindings for Linux SPI access through spidev:
cd ~!
git clone git://github.com/doceme/py-spidev!
cd py-spidev/!
sudo python setup.py install!
!
... which creates /usr/local/lib/python2.7/dist-packages/spidev.so
SPI
65. def
analogRead(port, bus=0, ce=0):
Read the given ADC port and preform the necessary shifting of bits
spi.open(bus, ce) # CE port that the MCP3008 is connected to
if (port 7) or (port 0):
print 'analogRead -- Port Error, Must use a port between 0 and 7'
return -1
r = spi.xfer2([1, (8 + port) 4, 0])
value = ((r[1] 3) 8) + r[2]
spi.close()
return value
66. ADC1.py
import time
import spidev
import RPi.GPIO as GPIO
# This program reads an analogue value form a potentiometer attached to port 0 on the MCP3008 Chip
spi = spidev.SpiDev()
pot_adc = 0
statusLED = 23 # GPIO port that our Status led is connected to
GPIO.setmode(GPIO.BCM)
GPIO.setup(statusLED, GPIO.OUT)
print Press CTRL+C to exit
try:
while True:
GPIO.output(statusLED, True) # Status Led On
print analogRead(pot_adc) # Print read value
time.sleep(.125) # Wait a little
GPIO.output(statusLED, False) # Status Led Off
time.sleep(.175) # Wait a bit longer
except KeyboardInterrupt:
GPIO.output(statusLED, False)
finally:
GPIO.cleanup()
70. RaspberryPi
Inter-IC Bus - I2C
I2C connects the same two signal lines
to all slaves. I.e. addressing is required
and all devices need a unique address
SDA - Serial Data
SCL - Serial Clock
71. pi@raspberrypi ~ $ cat /etc/modprobe.d/raspi-blacklist.conf!
# blacklist spi and i2c by default (many users don't need them)!
blacklist spi-bcm2708!
blacklist i2c-bcm2708!
!
Loading Kernel Modules:
- Edit the raspi-blacklist.conf, so that the i2c module gets enabled.
- Add the following lines to /etc/modules
i2c-dev
i2c-bcm2708
Reboot, and confirm ls /dev/i2c*
shows
/dev/i2c-0
/dev/i2c-1
!
Installing Dependencies:
sudo apt-get install python-smbus i2c-tools!
!
With i2c devices connected, run somthing like this, to discover devices addresses.
sudo i2cdetect -y 0
I2C
73. ADC2.py
!
import time
import spidev
import RPi.GPIO as GPIO
from lib.Char_Plate.Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
import smbus
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
lcd = Adafruit_CharLCDPlate()
spi = spidev.SpiDev()
pot_adc = 0 # ADC
l = list() # List for Light Sensor Averaging
statusLED = 23
print Press CTRL+Z to exit
GPIO.setup(statusLED, GPIO.OUT)
lcd.backlight(lcd.ON)
lcd.clear()
!
def
movavg(list, length, value):
A function that smooths the results by averaging a list
list.append(value)
if length len(list):
del list[0]
sum = 0
for x in list[:]:
sum += x
return sum / len(list)
74. ADC2.py
try:
while True:
# Change the Back-light based on what button has been pressed
if lcd.buttonPressed(lcd.DOWN):
lcd.backlight(lcd.ON)
if lcd.buttonPressed(lcd.UP):
lcd.backlight(lcd.OFF)
lcd.home()
GPIO.output(statusLED, True) #
lcd.message('Potentiometer:n' + str(
movavg(l, 4, analogRead(pot_adc))) + ' ') #
sleep(.1) #
GPIO.output(statusLED, False) #
sleep(.155) #
except KeyboardInterrupt:
GPIO.output(statusLED, False)
spi.close()
finally:
lcd.clear()
lcd.backlight(lcd.OFF)
GPIO.cleanup()
Status Led On
Read analog value
Wait a little
Status Led off
Wait a bit longer
76. ADC3.py
def
colorChange(channel):
global color
if channel == green:
if color == lcd.ON:
color = lcd.GREEN
elif color == lcd.GREEN:
color = lcd.OFF
else:
color = lcd.ON
for i in range(3):
lcd.backlight(color)
sleep(.01)
sleep(bounce/1000)
77. ADC3.py
try:
GPIO.add_event_detect(green, GPIO.RISING, callback=colorChange, bouncetime=bounce)
while True:
GPIO.output(statusLED, True) # Status Led On
l = movavg(light_Average, 4, analogRead(light_adc)) # Read the light sensor
lcd.home()
lcd.message('Pot: ' + str(analogRead(pot_adc)) + ' nLight: ' + str(l) + ' ')
GPIO.output(statusLED, False) # Status Led Off
sleep(rate) # Wait a little
except KeyboardInterrupt:
GPIO.output(statusLED, False)
spi.close()
finally:
lcd.clear()
lcd.backlight(lcd.OFF)
GPIO.cleanup()
108. User Data...
Main.py
app_info_folder = '/etc/WeatherUnderground'
LocationData = app_info_folder + '/locations.conf'
try:
info = open(LocationData)
data = info.readlines()
length = int(str(data).count(',')) + 1
l1 = data[0].split(',')
for x in range(0, length):
l2 = l1[x].split(':')
locations[str(x) + 's'] = l2[0]
locations[str(x) + 'c'] = l2[1]
info.close()
except IOError:
lcd.message('WelcomenNew User!')
print 'Adding New Location...'
State = raw_input('Enter The name of the State your desired location is in, using the abbreviation -CAn')
City = raw_input('Now, Enter the name of the Cityn')
print 'nThank You!'
State = State.upper()
City = City.capitalize()
if not os.path.exists(app_info_folder):
os.makedirs(app_info_folder)
info = open(LocationData, 'w')
info.write(State + ':' + City)
locations = {'0' + 's': State, '0' + 'c': City}
info.close()
109. User Data...
AddLocation.py
app_info_folder = '/etc/WeatherUnderground'
LocationData = app_info_folder + '/locations.conf'
info = open(data)
State = raw_input('Enter The name of the State your desired location is in, using the abbreviation -CAn')
City = raw_input('Now, Enter the name of the Cityn')
print 'nThank You!'
State = State.upper()
City = City.replace(' ','_')
if raw_input(Is this Information Correct? Type 'y'n) == 'y':
info = open(data, 'a')
info.write(',' + State + ':' + City)
info.close()
111. Wow! We have learned a lot!!
Summary
1. Initial Setup of the Raspberry Pi
2. Made a little LED blink
3. Dealt with an Analog Value and Displayed it
4. The Basics of JSON
5. Got our feet wet by finding the Time in different places
6. Used our new Knowledge to find the Weather
7. Learned how to save Custom User Data