pi_piper 1.3.2 → 1.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.rspec +3 -0
- data/.travis.yml +8 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +65 -0
- data/Manifest +5 -0
- data/README.md +54 -8
- data/Rakefile +24 -14
- data/examples/2_bit_counter/2_bit_counter.rb +22 -0
- data/examples/7-segment/7-segment.rb +37 -0
- data/examples/dsl_switch/dsl_switch.rb +15 -0
- data/examples/mcp3008/circuit.png +0 -0
- data/examples/mcp3008/mcp3008.rb +55 -0
- data/examples/mcp3008_spi/mcp3008_spi.rb +24 -0
- data/examples/morse_code/circuit.png +0 -0
- data/examples/morse_code/morse_code.rb +43 -0
- data/examples/simple_switch/circuit.png +0 -0
- data/examples/simple_switch/simple_switch.rb +10 -0
- data/lib/pi_piper.rb +38 -5
- data/lib/pi_piper/bcm2835.rb +85 -3
- data/lib/pi_piper/frequency.rb +19 -0
- data/lib/pi_piper/i2c.rb +51 -0
- data/lib/pi_piper/libbcm2835.so +0 -0
- data/lib/pi_piper/pin.rb +129 -38
- data/lib/pi_piper/pin_error.rb +3 -0
- data/lib/pi_piper/pin_values.rb +10 -0
- data/lib/pi_piper/platform.rb +25 -0
- data/lib/pi_piper/spi.rb +47 -43
- data/lib/pi_piper/stub_driver.rb +107 -0
- data/pi_piper.gemspec +18 -7
- data/spec/i2c_spec.rb +83 -0
- data/spec/pin_spec.rb +149 -0
- data/spec/pull_mode_spec.rb +70 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/spi_spec.rb +44 -0
- data/spec/stub_driver_spec.rb +140 -0
- metadata +107 -14
- data/lib/pi_piper/libbcm2835.img +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13fdeb8e5268450e6f5e16b76fadd8c86c21d14e
|
4
|
+
data.tar.gz: 0cf0fc4609e69c32a9f2fe67eb6b581a9959d021
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87894270c282f9368be74074bd7872cd5fd3ce9e26f961cb5cace37a8599cb8ac5aef5c4fcd03368274800cb37da9a10d21012cae8b2a8db0461e3577b77f6f8
|
7
|
+
data.tar.gz: 51bc8cec9b89c1005881a20277543242e458c56c7e2e495daa32d46bdff5af3ab5671b7553d7ce66904d6d121ad76bccae618d2f4d65790d6524b1d332920c6c
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
pi_piper (2.0.beta.11)
|
5
|
+
eventmachine (= 1.0.9)
|
6
|
+
ffi
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
allison (2.0.3)
|
12
|
+
diff-lcs (1.2.4)
|
13
|
+
echoe (4.6.3)
|
14
|
+
allison (>= 2.0.3)
|
15
|
+
gemcutter (>= 0.7.0)
|
16
|
+
rake (>= 0.9.2)
|
17
|
+
rdoc (>= 3.6.1)
|
18
|
+
rubyforge (>= 2.0.4)
|
19
|
+
eventmachine (1.0.9)
|
20
|
+
ffi (1.9.0)
|
21
|
+
gemcutter (0.7.1)
|
22
|
+
json (1.8.1)
|
23
|
+
json_pure (1.8.1)
|
24
|
+
metaclass (0.0.1)
|
25
|
+
mocha (0.14.0)
|
26
|
+
metaclass (~> 0.0.1)
|
27
|
+
multi_json (1.8.2)
|
28
|
+
rake (10.1.0)
|
29
|
+
rdoc (4.0.1)
|
30
|
+
json (~> 1.4)
|
31
|
+
rspec (3.4.0)
|
32
|
+
rspec-core (~> 3.4.0)
|
33
|
+
rspec-expectations (~> 3.4.0)
|
34
|
+
rspec-mocks (~> 3.4.0)
|
35
|
+
rspec-core (3.4.1)
|
36
|
+
rspec-support (~> 3.4.0)
|
37
|
+
rspec-expectations (3.4.0)
|
38
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
+
rspec-support (~> 3.4.0)
|
40
|
+
rspec-mocks (3.4.1)
|
41
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
42
|
+
rspec-support (~> 3.4.0)
|
43
|
+
rspec-support (3.4.1)
|
44
|
+
rubyforge (2.0.4)
|
45
|
+
json_pure (>= 1.1.7)
|
46
|
+
simplecov (0.7.1)
|
47
|
+
multi_json (~> 1.0)
|
48
|
+
simplecov-html (~> 0.7.1)
|
49
|
+
simplecov-html (0.7.1)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
echoe
|
56
|
+
eventmachine (~> 1.0.9)
|
57
|
+
ffi
|
58
|
+
mocha
|
59
|
+
pi_piper!
|
60
|
+
rake
|
61
|
+
rspec
|
62
|
+
simplecov
|
63
|
+
|
64
|
+
BUNDLED WITH
|
65
|
+
1.11.2
|
data/Manifest
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
Gemfile
|
2
|
+
Gemfile.lock
|
1
3
|
Manifest
|
2
4
|
README.md
|
3
5
|
Rakefile
|
4
6
|
lib/pi_piper.rb
|
5
7
|
lib/pi_piper/bcm2835.rb
|
8
|
+
lib/pi_piper/frequency.rb
|
9
|
+
lib/pi_piper/i2c.rb
|
6
10
|
lib/pi_piper/libbcm2835.img
|
7
11
|
lib/pi_piper/pin.rb
|
12
|
+
lib/pi_piper/platform.rb
|
8
13
|
lib/pi_piper/spi.rb
|
9
14
|
pi_piper.gemspec
|
data/README.md
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
## Overview
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
[](https://travis-ci.org/jwhitehorn/pi_piper)
|
4
|
+
|
5
|
+
Pi Piper brings event driven programming to the Raspberry Pi's GPIO pins. Pi Piper works with all revisions of the Raspberry Pi,
|
6
|
+
and has been tested with Ruby 1.9.3 & 2.0 under both [Raspbian "wheezy"](http://www.raspberrypi.org/downloads) and [Occidentalis v0.2](http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/occidentalis-v0-dot-2).
|
5
7
|
|
6
8
|
To get started:
|
7
9
|
|
8
10
|
If you do not already have Ruby installed, first you'll need to:
|
9
|
-
|
11
|
+
|
10
12
|
sudo apt-get install ruby ruby1.9.1-dev
|
11
|
-
|
13
|
+
|
12
14
|
Despite one of the packages being titled "ruby1.9.1-dev", the above command will install Ruby 1.9.3 (as of January 2013) and the Ruby dev tools.
|
13
15
|
|
14
16
|
To install Pi Piper:
|
@@ -38,6 +40,22 @@ PiPiper.wait
|
|
38
40
|
|
39
41
|
Your block will be called when a change to the pin's state is detected.
|
40
42
|
|
43
|
+
When using pins as input, you can use internal resistors to pull the pin
|
44
|
+
up or pull down. This is important if you use open-collector sensors
|
45
|
+
which have floating output in some states.
|
46
|
+
|
47
|
+
You can set resistors when creating a pin passing a :pull parameter
|
48
|
+
(which can be :up, :down or :off, which is the default).
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
pin = PiPiper::Pin.new(:pin => 17, :direction => :in, :pull => :up)
|
52
|
+
```
|
53
|
+
|
54
|
+
This way, the pin will always return 'on' if it is unconnected or of the
|
55
|
+
sensor has an open collector output.
|
56
|
+
|
57
|
+
You can later alter the pulling resistors using PiPiper#pull!
|
58
|
+
|
41
59
|
Additionally you can use pins as output too:
|
42
60
|
|
43
61
|
```ruby
|
@@ -47,15 +65,26 @@ sleep 1
|
|
47
65
|
pin.off
|
48
66
|
```
|
49
67
|
|
68
|
+
_please note, in the above context "pin" refers to the GPIO number of the Raspberry Pi._
|
69
|
+
|
50
70
|
### SPI
|
51
|
-
Starting with version 1.2, Pi Piper offers SPI support.
|
71
|
+
Starting with version 1.2, Pi Piper offers SPI support.
|
52
72
|
|
53
73
|
```ruby
|
54
|
-
PiPiper::Spi.begin do
|
55
|
-
puts write [0x01, 0x80, 0x00]
|
74
|
+
PiPiper::Spi.begin do
|
75
|
+
puts write [0x01, 0x80, 0x00]
|
56
76
|
end
|
57
77
|
```
|
58
78
|
|
79
|
+
If you are using an operating system that supports `/dev/spidev0.0` like the [adafruit
|
80
|
+
distro][adafruit-linux] you can also write to the spi using `PiPiper::Spi.spidev_out`
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
# Example writing red, green, blue to a string of WS2801 pixels
|
84
|
+
PiPiper::Spi.spidev_out([255,0,0,0,255,0,0,0,255])
|
85
|
+
```
|
86
|
+
[adafruit-linux]:http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/overview
|
87
|
+
|
59
88
|
## Documentation
|
60
89
|
|
61
90
|
API documentation for Pi Piper can be found at [rdoc.info](http://rdoc.info/github/jwhitehorn/pi_piper/frames/).
|
@@ -69,9 +98,26 @@ Looking for more examples/sample code for Pi Piper? Then check out the following
|
|
69
98
|
* [Project 3: 2-bit counter](https://github.com/jwhitehorn/pi_piper/wiki/Project-3:-2-bit-counter)
|
70
99
|
* [Project 4: MCP3008](https://github.com/jwhitehorn/pi_piper/wiki/Project-4:-MCP3008)
|
71
100
|
|
101
|
+
## Under the hood
|
102
|
+
|
103
|
+
PiPiper use the libbcm2835 library from Mike McCauley at airspayce.
|
104
|
+
|
105
|
+
http://www.airspayce.com/mikem/bcm2835/index.html
|
106
|
+
|
107
|
+
if you want to upgrade or downgrade the library for compatibility reason, get it and make it a shared object library :
|
108
|
+
|
109
|
+
```script
|
110
|
+
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.49.tar.gz
|
111
|
+
tar zxvf bcm2835-1.49.tar.gz && cd bcm2835-1.49
|
112
|
+
./configure && make
|
113
|
+
sudo make check
|
114
|
+
sudo make install
|
115
|
+
cd src && cc -shared bcm2835.o -o libbcm2835.so
|
116
|
+
cp libbcm2835.so ~/pi_piper/lib/pi_piper
|
117
|
+
|
72
118
|
## License
|
73
119
|
|
74
|
-
Copyright (c) 2013, [Jason Whitehorn](https://github.com/jwhitehorn)
|
120
|
+
Copyright (c) 2013, [Jason Whitehorn](https://github.com/jwhitehorn)
|
75
121
|
All rights reserved.
|
76
122
|
|
77
123
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
data/Rakefile
CHANGED
@@ -1,14 +1,24 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
require 'echoe'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
#rake manifest
|
7
|
+
#rake build_gemspec
|
8
|
+
#gem build pi_piper.gemspec
|
9
|
+
#gem push xxx.gem
|
10
|
+
|
11
|
+
Echoe.new('pi_piper', '2.0.beta.4') do |p|
|
12
|
+
p.description = "Event driven Raspberry Pi GPIO library"
|
13
|
+
p.url = "http://github.com/jwhitehorn/pi_piper"
|
14
|
+
p.author = "Jason Whitehorn"
|
15
|
+
p.email = "jason.whitehorn@gmail.com"
|
16
|
+
p.ignore_pattern = ["examples/**/*", "spec/**/*"]
|
17
|
+
p.dependencies = ['ffi', 'eventmachine 1.0.3']
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
21
|
+
|
22
|
+
RSpec::Core::RakeTask.new(:spec)
|
23
|
+
|
24
|
+
task :default => :spec
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
|
3
|
+
puts "Press the switch to get started"
|
4
|
+
pin17 = PiPiper::Pin.new(:pin => 17, :direction => :out)
|
5
|
+
pin27 = PiPiper::Pin.new(:pin => 27, :direction => :out)
|
6
|
+
|
7
|
+
pin17.off
|
8
|
+
pin27.off
|
9
|
+
|
10
|
+
sum = 0
|
11
|
+
|
12
|
+
PiPiper.watch :pin => 22, :trigger => :rising do |pin|
|
13
|
+
sum = sum + 1
|
14
|
+
display = sum % 4
|
15
|
+
puts sum
|
16
|
+
|
17
|
+
pin17.update_value(display == 2 || display == 3)
|
18
|
+
pin27.update_value(display == 1 || display == 3)
|
19
|
+
end
|
20
|
+
|
21
|
+
PiPiper.wait
|
22
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
|
3
|
+
s1 = PiPiper::Pin.new(:direction => :out, :pin => 27)
|
4
|
+
s2 = PiPiper::Pin.new(:direction => :out, :pin => 24)
|
5
|
+
s3 = PiPiper::Pin.new(:direction => :out, :pin => 23)
|
6
|
+
s4 = PiPiper::Pin.new(:direction => :out, :pin => 25)
|
7
|
+
s5 = PiPiper::Pin.new(:direction => :out, :pin => 18)
|
8
|
+
s6 = PiPiper::Pin.new(:direction => :out, :pin => 22)
|
9
|
+
s7 = PiPiper::Pin.new(:direction => :out, :pin => 17)
|
10
|
+
|
11
|
+
|
12
|
+
pins = [s1, s2, s3, s4, s5, s6, s7]
|
13
|
+
|
14
|
+
zero = Proc.new { s1.on; s2.on; s3.on; s4.on; s5.on; s6.on; s7.off; }
|
15
|
+
one = Proc.new { s1.off; s2.off; s3.on; s4.on; s5.off; s6.off; s7.off; }
|
16
|
+
two = Proc.new { s1.off; s2.on; s3.on; s4.off; s5.on; s6.on; s7.on; }
|
17
|
+
three = Proc.new { s1.off; s2.on; s3.on; s4.on; s5.on; s6.off; s7.on; }
|
18
|
+
four = Proc.new { s1.on; s2.off; s3.on; s4.on;; s5.off; s6.off; s7.on; }
|
19
|
+
five = Proc.new { s1.on; s2.on; s3.off; s4.on; s5.on; s6.off; s7.on; }
|
20
|
+
six = Proc.new { s1.on; s2.on; s3.off; s4.on; s5.on; s6.on; s7.on; }
|
21
|
+
seven = Proc.new { s1.off; s2.on; s3.on; s4.on; s5.off; s6.off; s7.off; }
|
22
|
+
eight = Proc.new { s1.on; s2.on; s3.on; s4.on; s5.on; s6.on; s7.on; }
|
23
|
+
nine = Proc.new { s1.on; s2.on; s3.on; s4.on; s5.off; s6.off; s7.on; }
|
24
|
+
|
25
|
+
numbers = [zero, one, two, three, four, five, six, seven, eight, nine]
|
26
|
+
|
27
|
+
pins.each { |p| p.off }
|
28
|
+
|
29
|
+
PiPiper.watch :pin => 4, :trigger => :rising do
|
30
|
+
(0..250).each do
|
31
|
+
pins.each { |p| p.update_value(Random.rand(2) == 1) }
|
32
|
+
end
|
33
|
+
number = Random.rand(10)
|
34
|
+
numbers[number].call
|
35
|
+
end
|
36
|
+
|
37
|
+
PiPiper.wait
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
include PiPiper
|
3
|
+
|
4
|
+
puts "Press the switch to get started"
|
5
|
+
|
6
|
+
watch :pin => 17, :invert => true do
|
7
|
+
puts "Pin changed from #{last_value} to #{value}"
|
8
|
+
end
|
9
|
+
|
10
|
+
after :pin => 17, :goes => :high do
|
11
|
+
puts "ouch!"
|
12
|
+
end
|
13
|
+
|
14
|
+
PiPiper.wait
|
15
|
+
|
Binary file
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
#port of the Adafruit MCP3008 interface code found @ http://learn.adafruit.com/send-raspberry-pi-data-to-cosm/python-script
|
3
|
+
|
4
|
+
def read_adc(adc_pin, clockpin, adc_in, adc_out, cspin)
|
5
|
+
cspin.on
|
6
|
+
clockpin.off
|
7
|
+
cspin.off
|
8
|
+
|
9
|
+
command_out = adc_pin
|
10
|
+
command_out |= 0x18
|
11
|
+
command_out <<= 3
|
12
|
+
|
13
|
+
(0..4).each do
|
14
|
+
adc_in.update_value((command_out & 0x80) > 0)
|
15
|
+
command_out <<= 1
|
16
|
+
clockpin.on
|
17
|
+
clockpin.off
|
18
|
+
end
|
19
|
+
result = 0
|
20
|
+
|
21
|
+
(0..11).each do
|
22
|
+
clockpin.on
|
23
|
+
clockpin.off
|
24
|
+
result <<= 1
|
25
|
+
adc_out.read
|
26
|
+
if adc_out.on?
|
27
|
+
result |= 0x1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
cspin.on
|
32
|
+
|
33
|
+
result >> 1
|
34
|
+
end
|
35
|
+
|
36
|
+
clock = PiPiper::Pin.new :pin => 18, :direction => :out
|
37
|
+
adc_out = PiPiper::Pin.new :pin => 23
|
38
|
+
adc_in = PiPiper::Pin.new :pin => 24, :direction => :out
|
39
|
+
cs = PiPiper::Pin.new :pin => 25, :direction => :out
|
40
|
+
|
41
|
+
adc_pin = 0
|
42
|
+
|
43
|
+
loop do
|
44
|
+
value = read_adc(adc_pin, clock, adc_in, adc_out, cs)
|
45
|
+
invert = 1023 - value
|
46
|
+
mvolts = invert * (3300.0 / 1023.0)
|
47
|
+
if mvolts < 2700
|
48
|
+
temp = (mvolts - 380.0) / (2320.0 / 84.0)
|
49
|
+
else
|
50
|
+
temp = (mvolts - 2700.0) / (390.0 / 92.0) + 84.0
|
51
|
+
end
|
52
|
+
temp_f = (temp * 9.0 / 5.0) + 32
|
53
|
+
puts "Value = #{value}, invert = #{invert}, mvolts = #{mvolts}, temp = #{temp} C | #{temp_f} F"
|
54
|
+
sleep 1
|
55
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
#special thanks to Jeremy Blythe, and his article @ http://jeremyblythe.blogspot.com/2012/09/raspberry-pi-hardware-spi-analog-inputs.html
|
3
|
+
#it greatly helped in getting the MCP3008 setup with SPI
|
4
|
+
|
5
|
+
adc_num = 0
|
6
|
+
|
7
|
+
loop do
|
8
|
+
value = 0
|
9
|
+
PiPiper::Spi.begin do |spi|
|
10
|
+
raw = spi.write [1, (8+adc_num)<<4, 0]
|
11
|
+
value = ((raw[1]&3) << 8) + raw[2]
|
12
|
+
end
|
13
|
+
|
14
|
+
invert = 1023 - value
|
15
|
+
mvolts = invert * (3300.0 / 1023.0)
|
16
|
+
if mvolts < 2700
|
17
|
+
temp = (mvolts - 380.0) / (2320.0 / 84.0)
|
18
|
+
else
|
19
|
+
temp = (mvolts - 2700.0) / (390.0 / 92.0) + 84.0
|
20
|
+
end
|
21
|
+
temp_f = (temp * 9.0 / 5.0) + 32
|
22
|
+
puts "Value = #{value}, invert = #{invert}, mvolts = #{mvolts}, temp = #{temp} C | #{temp_f} F"
|
23
|
+
sleep 1
|
24
|
+
end
|
Binary file
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
|
3
|
+
unit = 0.1
|
4
|
+
dot = unit
|
5
|
+
dash = unit * 3
|
6
|
+
inter_element_gap = unit
|
7
|
+
short_gap = unit * 3
|
8
|
+
medium_gap = unit * 7
|
9
|
+
|
10
|
+
#http://en.wikipedia.org/wiki/Morse_code
|
11
|
+
character_timing = { "a" => [dot, dash], "b" => [dash, dot, dot, dot], "c" => [dash, dot, dash, dot],
|
12
|
+
"d" => [dash, dot, dot], "e" => [dot], "f" => [dot, dot, dash, dot],
|
13
|
+
"g" => [dash, dash, dot], "h" => [dot, dot, dot, dot], "i" => [dot, dot],
|
14
|
+
"j" => [dot, dash, dash, dash], "k" => [dash, dot, dash], "l" => [dot, dash, dot, dot],
|
15
|
+
"m" => [dash, dash], "n" => [dash, dot], "o" => [dash, dash, dash],
|
16
|
+
"p" => [dot, dash, dash, dot], "q" => [dash, dash, dot, dash], "r" => [dot, dash, dot],
|
17
|
+
"s" => [dot, dot, dot], "t" => [dash], "u" => [dot, dot, dash],
|
18
|
+
"v" => [dot, dot, dot, dash], "w" => [dot, dash, dash], "x" => [dash, dot, dot, dash],
|
19
|
+
"y" => [dash, dot, dash, dash], "z" => [dash, dash, dot, dot]}
|
20
|
+
|
21
|
+
pin = PiPiper::Pin.new(:pin => 17, :direction => :out)
|
22
|
+
pin.off
|
23
|
+
|
24
|
+
loop do
|
25
|
+
puts "Please type something"
|
26
|
+
something = gets.chomp.downcase
|
27
|
+
|
28
|
+
something.each_char do |letter|
|
29
|
+
if letter == " "
|
30
|
+
pin.off
|
31
|
+
sleep medium_gap
|
32
|
+
else
|
33
|
+
character_timing[letter].each do |timing|
|
34
|
+
pin.on
|
35
|
+
sleep timing
|
36
|
+
pin.off
|
37
|
+
sleep inter_element_gap
|
38
|
+
end
|
39
|
+
sleep short_gap - inter_element_gap
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|