6. • ATmega328 CPU @16MHz
• No GPU
• 32K Flash, 2K SRAM, 1K EEPROM
• USB, no network or video
• 14 GPIO pins, 6 analogue inputs
• No storage
• “Bare metal” cross-compile only
• About £18
8. • Intel CPU @2.8GHz
• Intel HD GPU
• 2GB RAM
• USB,Ethernet,SATA,HDMI,Wireless,…
• No IO pins
• 500GB hard drive, DVD
• Windows, Linux, etc.
• About £300
9.
10. Software Development
Bare Metal Linux
• Assembler • Pretty much anything
• Cross-compiled C/C+ • Python
+ etc. • Ruby
• Hand-built languages • Java
• perl
• PHP
• bash
• …
13. So let’s do some Ruby
Step 1: installation
• sudo apt-get install ruby1.9.3
That wasn’t so hard
14. Ruby talks to hardware
File.open('/sys/class/gpio/export', 'w') { |file| file.write("17") }
File.open('/sys/class/gpio/gpio17/direction', 'w') { |file| file.write("out") }
File.open('/sys/class/gpio/export', 'w') { |file| file.write("27") }
File.open('/sys/class/gpio/gpio27/direction', 'w') { |file| file.write("out") }
File.open('/sys/class/gpio/export', 'w') { |file| file.write("22") }
File.open('/sys/class/gpio/gpio22/direction', 'w') { |file| file.write("out") }
begin
while true do
for r in 0..1
File.open('/sys/class/gpio/gpio17/value', 'w') { |file| file.write("#{r}") }
for g in 0..1
File.open('/sys/class/gpio/gpio27/value', 'w') { |file| file.write("#{g}") }
for b in 0..1
File.open('/sys/class/gpio/gpio22/value', 'w') { |file| file.write("#{b}") }
sleep 1
end
end
end
end
rescue SignalException
File.open('/sys/class/gpio/gpio17/value', 'w') { |file| file.write("0") }
File.open('/sys/class/gpio/gpio27/value', 'w') { |file| file.write("0") }
File.open('/sys/class/gpio/gpio22/value', 'w') { |file| file.write("0") }
end
15. A nicer way
require "pi_piper"
pin_r = PiPiper::Pin.new(:pin => 17, :direction => :out)
pin_g = PiPiper::Pin.new(:pin => 27, :direction => :out)
pin_b = PiPiper::Pin.new(:pin => 22, :direction => :out)
begin
while true do
for r in 0..1
if r==1 ; pin_r.on else pin_r.off end
for g in 0..1
if g==1 ; pin_g.on else pin_g.off end
for b in 0..1
if b==1 ; pin_b.on else pin_b.off end
sleep 1
end
end
end
end
rescue SignalException
pin_r.off
pin_g.off
pin_b.off
end
16. Another way
require "wiringpi"
io = WiringPi::GPIO.new(WPI_MODE_GPIO)
begin
while true do
for r in 0..1
io.write(17,r)
for g in 0..1
io.write(27,g)
for b in 0..1
io.write(22,b)
sleep 1
end
end
end
end
rescue SignalException
io.write(17,0)
io.write(27,0)
io.write(22,0)
end
17. Input
require 'pi_piper'
include PiPiper
watch :pin => 23 do
puts "Pin changed from #{last_value} to #{value}"
end
#Or
after :pin => 23, :goes => :high do
puts "Button pressed"
end
PiPiper.wait
23. More Fun – Ruby USB
• wget http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-
1.0.9/libusb-1.0.9.tar.bz2
• tar xjf libusb-1.0.9.tar.bz2
• cd libusb-1.0.9
• ./configure
• make
• sudo make install
• sudo apt-get install libusb-1.0-0-dev
• sudo gem install libusb