28. UNO MEGA DUE Pi Model A Pi Model B
Operating
Voltage
SRAM
FLASH-
Memory
Clock Speed
USB Host
Network
Audio /Video
Current I/O
pins
Digital I/O Pins
Analog Input
Pins
Price
5V 5V 3.3V 3.3V 3.3V
2 KB 8 KB 96 KB 265 MB 512 MB
32 KB 256 KB 512 KB up to 64 MB up to 64 MB
16 MHz 16 MHz 84 MHz 700 MHz* 700 MHz*
n/a n/a 1 1 2
n/a n/a n/a n/a
10/100 wired
Ethernet RJ45
n/a n/a n/a
HDMI, Composite
Video,
TRS-audio jack
HDMI, Composite
Video,
TRS-audio jack
40 mA 40 mA total 130 mA 2 to 16 mA 2 to 16 mA
14 (6 PWM) 54 (15 PWM) 54 (12 PWM) 17 (1 PWM) 17 (1 PWM)
6 16
12
2DAC Analog Out
0* 0*
$30 $59 $50 $25 $35
42. Creating Your Image
1. Download and Unzip the .img from www.raspberrypi.com
2. Format the SD Card to clear all Data
Windows Users:
Use
Win32DiskImager
Mac Users:
Use
Raspberry PI SD Installer OS X
52. 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()
blink.py
58. SPI requires four signals:
clock (SCLK)
master output/slave input (MOSI)
master input/slave output (MISO)
slave select (SS) or (CS) chip-select
Ra!berryPi
Se#al Pe#pheral Interface Bus - SPI
59. 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
63. 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
64. 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()
ADC1.py
68. 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
Ra!berryPi
Inter-IC Bus - I2C
69. 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
71. 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)
ADC2.py
72. 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) # Status Led On
lcd.message('Potentiometer:n' + str(
movavg(l, 4, analogRead(pot_adc))) + ' ') # Read analog value
sleep(.1) # Wait a little
GPIO.output(statusLED, False) # Status Led off
sleep(.155) # Wait a bit longer
except KeyboardInterrupt:
GPIO.output(statusLED, False)
spi.close()
finally:
lcd.clear()
lcd.backlight(lcd.OFF)
GPIO.cleanup()
ADC2.py
74. 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)
75. 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()
ADC3.py
106. 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()
107. 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()
109. Summary
Wow! We have learned a lot!!
1. Initial Setup of the Raspberry Pi
2. Made a little LED blink
3. Dealt with an AnalogValue 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
110.
111.
112. Slides:
Code Used in this Talk:
http://tompaulus.com/talks
https://github.com/tpaulus/SCC-SD2013
Email:
tom@tompaulus.com